6#include <reusex/types.hpp>
9#include <unordered_set>
27 virtual auto evaluate(int32_t label_value)
const ->
bool = 0;
32 std::string cloud_name_;
37 : cloud_name_(std::move(
name)), label_cloud_(std::move(
labels)) {}
40 auto name() const -> const std::
string & {
return cloud_name_; }
41 auto size() const ->
size_t {
return label_cloud_->size(); }
49 explicit EqualNode(int32_t value) : value_(value) {}
50 auto evaluate(int32_t label)
const ->
bool override {
51 return label == value_;
61 auto evaluate(int32_t label)
const ->
bool override {
62 return label != value_;
68 std::unordered_set<int32_t> values_;
71 explicit InNode(std::vector<int32_t> values)
72 : values_(values.begin(), values.end()) {}
73 auto evaluate(int32_t label)
const ->
bool override {
74 return values_.count(label) > 0;
89 auto evaluate(int32_t label)
const ->
bool override {
92 return label > value_;
94 return label >= value_;
96 return label < value_;
98 return label <= value_;
106 std::unique_ptr<FilterNode> left_;
107 std::unique_ptr<FilterNode> right_;
110 AndNode(std::unique_ptr<FilterNode> left, std::unique_ptr<FilterNode> right)
111 : left_(std::move(left)), right_(std::move(right)) {}
112 auto evaluate(int32_t label)
const ->
bool override {
113 return left_->evaluate(label) && right_->evaluate(label);
119 std::unique_ptr<FilterNode> left_;
120 std::unique_ptr<FilterNode> right_;
123 OrNode(std::unique_ptr<FilterNode> left, std::unique_ptr<FilterNode> right)
124 : left_(std::move(left)), right_(std::move(right)) {}
125 auto evaluate(int32_t label)
const ->
bool override {
126 return left_->evaluate(label) || right_->evaluate(label);
132 std::unique_ptr<FilterNode>
root;
147 -> std::unique_ptr<FilterExpression>;
AndNode(std::unique_ptr< FilterNode > left, std::unique_ptr< FilterNode > right)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
auto labels() const -> const CloudLConstPtr &
auto size() const -> size_t
auto name() const -> const std::string &
CloudReferenceNode(std::string name, CloudLConstPtr labels)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
CompareNode(Op op, int32_t value)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
Base AST node for filter expressions.
virtual ~FilterNode()=default
virtual auto evaluate(int32_t label_value) const -> bool=0
Evaluate this node for a specific point's label value.
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
InNode(std::vector< int32_t > values)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
NotEqualNode(int32_t value)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
OrNode(std::unique_ptr< FilterNode > left, std::unique_ptr< FilterNode > right)
auto evaluate_filter(const FilterExpression &expr, size_t cloud_size) -> IndicesPtr
Evaluate filter expression against all points, generate Indices.
auto parse_filter_expression(const std::string &expression, ProjectDB &db) -> std::unique_ptr< FilterExpression >
Parse filter expression and resolve label cloud references from ProjectDB.
typename CloudL::ConstPtr CloudLConstPtr
pcl::IndicesPtr IndicesPtr
Parsed filter expression with resolved label cloud references.
std::vector< CloudReferenceNode > clouds
Referenced label clouds.
auto evaluate_point(size_t idx) const -> bool
Evaluate filter for a point index.
std::unique_ptr< FilterNode > root
AST root.