UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
misses.hpp
1
42#ifndef UFO_MAP_MISSES_PREDICATE_MISSES_HPP
43#define UFO_MAP_MISSES_PREDICATE_MISSES_HPP
44
45// UFO
46#include <ufo/map/predicate/predicate.hpp>
47#include <ufo/map/predicate/predicate_compare.hpp>
48#include <ufo/map/types.hpp>
49
50namespace ufo::pred
51{
52template <PredicateCompare PC = PredicateCompare::EQUAL>
53struct Misses {
54 count_t misses;
55
56 Misses(count_t misses) : misses(misses) {}
57};
58
59using MissesE = Misses<>;
65
66using MissesMin = MissesGE;
67using MissesMax = MissesLE;
68
69template <PredicateCompare PC>
70struct InnerCheck<Misses<PC>> {
71 using Pred = Misses<PC>;
72
73 template <class Map, class Node>
74 static inline bool apply(Pred p, Map const& m, Node const& n)
75 {
76 switch (m.missesPropagationCriteria()) {
77 case PropagationCriteria::MIN:
78 if constexpr (PredicateCompare::EQUAL == PC) {
79 return m.misses(n.index()) <= p.misses;
80 } else if constexpr (PredicateCompare::NOT_EQUAL == PC) {
81 return true;
82 } else if constexpr (PredicateCompare::LESS_EQUAL == PC) {
83 return m.misses(n.index()) <= p.misses;
84 } else if constexpr (PredicateCompare::GREATER_EQUAL == PC) {
85 return true;
86 } else if constexpr (PredicateCompare::LESS == PC) {
87 return m.misses(n.index()) < p.misses;
88 } else if constexpr (PredicateCompare::GREATER == PC) {
89 return true;
90 }
91 case PropagationCriteria::MAX:
92 if constexpr (PredicateCompare::EQUAL == PC) {
93 return m.misses(n.index()) >= p.misses;
94 } else if constexpr (PredicateCompare::NOT_EQUAL == PC) {
95 return true;
96 } else if constexpr (PredicateCompare::LESS_EQUAL == PC) {
97 return true;
98 } else if constexpr (PredicateCompare::GREATER_EQUAL == PC) {
99 return m.misses(n.index()) >= p.misses;
100 } else if constexpr (PredicateCompare::LESS == PC) {
101 return true;
102 } else if constexpr (PredicateCompare::GREATER == PC) {
103 return m.misses(n.index()) > p.misses;
104 }
105 case PropagationCriteria::MEAN: return true;
106 case PropagationCriteria::NONE: return true;
107 }
108 }
109};
110
111template <PredicateCompare PC>
112struct ValueCheck<Misses<PC>> {
113 using Pred = Misses<PC>;
114
115 template <class Map, class Node>
116 static inline bool apply(Pred const& p, Map const& m, Node n)
117 {
118 if constexpr (PredicateCompare::EQUAL == PC) {
119 return m.misses(n.index()) == p.misses;
120 } else if constexpr (PredicateCompare::NOT_EQUAL == PC) {
121 return m.misses(n.index()) != p.misses;
122 } else if constexpr (PredicateCompare::LESS_EQUAL == PC) {
123 return m.misses(n.index()) <= p.misses;
124 } else if constexpr (PredicateCompare::GREATER_EQUAL == PC) {
125 return m.misses(n.index()) >= p.misses;
126 } else if constexpr (PredicateCompare::LESS == PC) {
127 return m.misses(n.index()) < p.misses;
128 } else if constexpr (PredicateCompare::GREATER == PC) {
129 return m.misses(n.index()) > p.misses;
130 }
131 }
132};
133} // namespace ufo::pred
134
135#endif // UFO_MAP_MISSES_PREDICATE_MISSES_HPP