7#include <reusex/types.hpp>
9#include <unordered_set>
23 std::string cloud_name_;
28 : cloud_name_(std::move(
name)), label_cloud_(std::move(
labels)) {}
31 auto name() const -> const std::
string & {
return cloud_name_; }
32 auto size() const ->
size_t {
return label_cloud_->size(); }
47 virtual auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
48 size_t point_idx)
const ->
bool = 0;
54 size_t cloud_idx,
size_t point_idx) {
55 if (cloud_idx >= clouds.size()) {
58 const auto &cloud = clouds[cloud_idx];
59 if (point_idx >= cloud.size()) {
62 return cloud.labels()->points[point_idx].label;
72 : cloud_idx_(cloud_idx), value_(value) {}
73 auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
74 size_t point_idx)
const ->
bool override {
86 : cloud_idx_(cloud_idx), value_(value) {}
87 auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
88 size_t point_idx)
const ->
bool override {
96 std::unordered_set<int32_t> values_;
99 InNode(
size_t cloud_idx, std::vector<int32_t> values)
100 : cloud_idx_(cloud_idx), values_(values.begin(), values.end()) {}
101 auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
102 size_t point_idx)
const ->
bool override {
103 return values_.count(
cloud_label_at(clouds, cloud_idx_, point_idx)) > 0;
119 : cloud_idx_(cloud_idx), op_(op), value_(value) {}
120 auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
121 size_t point_idx)
const ->
bool override {
122 const int32_t label =
cloud_label_at(clouds, cloud_idx_, point_idx);
125 return label > value_;
127 return label >= value_;
129 return label < value_;
131 return label <= value_;
139 std::unique_ptr<FilterNode> left_;
140 std::unique_ptr<FilterNode> right_;
143 AndNode(std::unique_ptr<FilterNode> left, std::unique_ptr<FilterNode> right)
144 : left_(std::move(left)), right_(std::move(right)) {}
145 auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
146 size_t point_idx)
const ->
bool override {
147 return left_->evaluate(clouds, point_idx) &&
148 right_->evaluate(clouds, point_idx);
154 std::unique_ptr<FilterNode> left_;
155 std::unique_ptr<FilterNode> right_;
158 OrNode(std::unique_ptr<FilterNode> left, std::unique_ptr<FilterNode> right)
159 : left_(std::move(left)), right_(std::move(right)) {}
160 auto evaluate(
const std::vector<CloudReferenceNode> &clouds,
161 size_t point_idx)
const ->
bool override {
162 return left_->evaluate(clouds, point_idx) ||
163 right_->evaluate(clouds, point_idx);
169 std::unique_ptr<FilterNode>
root;
184 -> std::unique_ptr<FilterExpression>;
auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool override
Evaluate this node for a specific point.
AndNode(std::unique_ptr< FilterNode > left, std::unique_ptr< FilterNode > right)
auto labels() const -> const CloudLConstPtr &
auto size() const -> size_t
auto name() const -> const std::string &
CloudReferenceNode(std::string name, CloudLConstPtr labels)
auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool override
Evaluate this node for a specific point.
CompareNode(size_t cloud_idx, Op op, int32_t value)
auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool override
Evaluate this node for a specific point.
EqualNode(size_t cloud_idx, int32_t value)
Base AST node for filter expressions.
virtual ~FilterNode()=default
virtual auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool=0
Evaluate this node for a specific point.
auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool override
Evaluate this node for a specific point.
InNode(size_t cloud_idx, std::vector< int32_t > values)
NotEqualNode(size_t cloud_idx, int32_t value)
auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool override
Evaluate this node for a specific point.
auto evaluate(const std::vector< CloudReferenceNode > &clouds, size_t point_idx) const -> bool override
Evaluate this node for a specific point.
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.
int32_t cloud_label_at(const std::vector< CloudReferenceNode > &clouds, size_t cloud_idx, size_t point_idx)
Helper for leaf nodes: read the label for point_idx from cloud cloud_idx, returning -1 if the index i...
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.