diff options
Diffstat (limited to 'include/mbgl/style/filter_evaluator.hpp')
-rw-r--r-- | include/mbgl/style/filter_evaluator.hpp | 30 |
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 |