UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
predicate.hpp
1
42#ifndef UFO_CONTAINER_TREE_PREDICATE_HPP
43#define UFO_CONTAINER_TREE_PREDICATE_HPP
44
45// UFO
46#include <ufo/container/tree/predicate/and.hpp>
47#include <ufo/container/tree/predicate/bool.hpp>
48#include <ufo/container/tree/predicate/boolean.hpp>
49#include <ufo/container/tree/predicate/child_of.hpp>
50#include <ufo/container/tree/predicate/coord.hpp>
51#include <ufo/container/tree/predicate/depth.hpp>
52#include <ufo/container/tree/predicate/disjoint.hpp>
53#include <ufo/container/tree/predicate/exists.hpp>
54#include <ufo/container/tree/predicate/filter.hpp>
55#include <ufo/container/tree/predicate/height.hpp>
56#include <ufo/container/tree/predicate/if_and_only_if.hpp>
57#include <ufo/container/tree/predicate/if_then.hpp>
58#include <ufo/container/tree/predicate/inner.hpp>
59#include <ufo/container/tree/predicate/intersects.hpp>
60#include <ufo/container/tree/predicate/leaf.hpp>
61#include <ufo/container/tree/predicate/length.hpp>
62#include <ufo/container/tree/predicate/modified.hpp>
63#include <ufo/container/tree/predicate/offset.hpp>
64#include <ufo/container/tree/predicate/or.hpp>
65#include <ufo/container/tree/predicate/parent.hpp>
66#include <ufo/container/tree/predicate/predicate.hpp>
67#include <ufo/container/tree/predicate/predicate_interval.hpp>
68#include <ufo/container/tree/predicate/pure_leaf.hpp>
69#include <ufo/container/tree/predicate/satisfies.hpp>
70#include <ufo/container/tree/predicate/spatial.hpp>
71#include <ufo/container/tree/predicate/xor.hpp>
72
73namespace ufo::pred
74{
75template <Filterable... Preds>
76[[nodiscard]] constexpr auto operator!(And<Preds...> const& p) noexcept
77{
78 return std::apply([](auto&&... preds) { return Or(!preds...); }, p.preds);
79}
80
81template <Filterable... Preds>
82[[nodiscard]] constexpr auto operator!(Or<Preds...> const& p) noexcept
83{
84 return std::apply([](auto&&... preds) { return And(!preds...); }, p.preds);
85}
86
87template <Filterable PredPre, Filterable PredPost>
88[[nodiscard]] constexpr auto operator!(IfThen<PredPre, PredPost> const& p) noexcept
89{
90 return And(p.pre, !p.post);
91}
92
93template <Filterable PredLeft, Filterable PredRight>
94[[nodiscard]] constexpr Xor<PredLeft, PredRight> operator!(
95 Iff<PredLeft, PredRight> const& p) noexcept
96{
97 return Xor(p.left, p.right);
98}
99
100template <Filterable PredLeft, Filterable PredRight>
101[[nodiscard]] constexpr Iff<PredLeft, PredRight> operator!(
102 Xor<PredLeft, PredRight> const& p) noexcept
103{
104 return Iff(p.left, p.right);
105}
106
107template <class Geometry>
108[[nodiscard]] constexpr Disjoint<Geometry> operator!(
109 Intersects<Geometry> const& p) noexcept
110{
111 return Disjoint<Geometry>(p.geometry);
112}
113
114template <class Geometry>
115[[nodiscard]] constexpr Intersects<Geometry> operator!(
116 Disjoint<Geometry> const& p) noexcept
117{
118 return Intersects<Geometry>(p.geometry);
119}
120
121[[nodiscard]] constexpr PureLeaf operator!(Inner) noexcept { return {}; }
122[[nodiscard]] constexpr Inner operator!(PureLeaf) noexcept { return {}; }
123[[nodiscard]] constexpr Parent operator!(Leaf) noexcept { return {}; }
124[[nodiscard]] constexpr Leaf operator!(Parent) noexcept { return {}; }
125} // namespace ufo::pred
126
127#endif // UFO_CONTAINER_TREE_PREDICATE_HPP