summaryrefslogtreecommitdiff
path: root/include/mbgl/style/filter_evaluator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/style/filter_evaluator.hpp')
-rw-r--r--include/mbgl/style/filter_evaluator.hpp30
1 files changed, 25 insertions, 5 deletions
diff --git a/include/mbgl/style/filter_evaluator.hpp b/include/mbgl/style/filter_evaluator.hpp
index cf91fdab1f..793abe6da0 100644
--- a/include/mbgl/style/filter_evaluator.hpp
+++ b/include/mbgl/style/filter_evaluator.hpp
@@ -26,6 +26,7 @@ template <class PropertyAccessor>
class FilterEvaluator {
public:
const FeatureType featureType;
+ const optional<FeatureIdentifier> featureIdentifier;
const PropertyAccessor propertyAccessor;
bool operator()(const NullFilter&) const {
@@ -123,9 +124,19 @@ public:
private:
optional<Value> getValue(const std::string& key_) const {
- return key_ == "$type"
- ? optional<Value>(uint64_t(featureType))
- : propertyAccessor(key_);
+ if (key_ == "$type") {
+ return optional<Value>(uint64_t(featureType));
+ } else if (key_ == "$id") {
+ if (featureIdentifier) {
+ return FeatureIdentifier::visit(*featureIdentifier, [] (auto id) {
+ return Value(std::move(id));
+ });
+ } else {
+ return optional<Value>();
+ }
+ } else {
+ return propertyAccessor(key_);
+ }
}
template <class Op>
@@ -183,9 +194,18 @@ private:
}
};
+inline bool Filter::operator()(const Feature& feature) const {
+ return operator()(apply_visitor(ToFeatureType(), feature.geometry), feature.id, [&] (const std::string& key) -> optional<Value> {
+ auto it = feature.properties.find(key);
+ if (it == feature.properties.end())
+ return {};
+ return it->second;
+ });
+}
+
template <class PropertyAccessor>
-bool Filter::operator()(FeatureType type, PropertyAccessor accessor) const {
- return FilterBase::visit(*this, FilterEvaluator<PropertyAccessor> { type, accessor });
+bool Filter::operator()(FeatureType type, optional<FeatureIdentifier> id, PropertyAccessor accessor) const {
+ return FilterBase::visit(*this, FilterEvaluator<PropertyAccessor> { type, id, accessor });
}
} // namespace style