From da35ef9f49139f4dfc7eb5ea2a04f800e895a65f Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 15 Jul 2016 16:07:42 -0700 Subject: [core] Add support for $id key to filters https://github.com/mapbox/mapbox-gl-style-spec/issues/391 --- include/mbgl/style/filter.hpp | 4 +++- include/mbgl/style/filter_evaluator.hpp | 30 +++++++++++++++++++++++++----- include/mbgl/util/feature.hpp | 6 +----- 3 files changed, 29 insertions(+), 11 deletions(-) (limited to 'include/mbgl') diff --git a/include/mbgl/style/filter.hpp b/include/mbgl/style/filter.hpp index 6a5afb7b47..dd2b20cd0d 100644 --- a/include/mbgl/style/filter.hpp +++ b/include/mbgl/style/filter.hpp @@ -107,8 +107,10 @@ class Filter : public FilterBase { public: using FilterBase::FilterBase; + bool operator()(const Feature&) const; + template - bool operator()(FeatureType type, PropertyAccessor accessor) const; + bool operator()(FeatureType type, optional id, PropertyAccessor accessor) const; }; } // namespace style 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 FilterEvaluator { public: const FeatureType featureType; + const optional featureIdentifier; const PropertyAccessor propertyAccessor; bool operator()(const NullFilter&) const { @@ -123,9 +124,19 @@ public: private: optional getValue(const std::string& key_) const { - return key_ == "$type" - ? optional(uint64_t(featureType)) - : propertyAccessor(key_); + if (key_ == "$type") { + return optional(uint64_t(featureType)); + } else if (key_ == "$id") { + if (featureIdentifier) { + return FeatureIdentifier::visit(*featureIdentifier, [] (auto id) { + return Value(std::move(id)); + }); + } else { + return optional(); + } + } else { + return propertyAccessor(key_); + } } template @@ -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 { + auto it = feature.properties.find(key); + if (it == feature.properties.end()) + return {}; + return it->second; + }); +} + template -bool Filter::operator()(FeatureType type, PropertyAccessor accessor) const { - return FilterBase::visit(*this, FilterEvaluator { type, accessor }); +bool Filter::operator()(FeatureType type, optional id, PropertyAccessor accessor) const { + return FilterBase::visit(*this, FilterEvaluator { type, id, accessor }); } } // namespace style diff --git a/include/mbgl/util/feature.hpp b/include/mbgl/util/feature.hpp index 7c5c8d7625..b72aa15ddd 100644 --- a/include/mbgl/util/feature.hpp +++ b/include/mbgl/util/feature.hpp @@ -10,10 +10,6 @@ using Value = mapbox::geometry::value; using NullValue = mapbox::geometry::null_value_t; using PropertyMap = mapbox::geometry::property_map; using FeatureIdentifier = mapbox::geometry::identifier; -class Feature : public mapbox::geometry::feature { -public: - Feature(geometry_type&& geometry_) - : mapbox::geometry::feature { std::move(geometry_) } {} -}; +using Feature = mapbox::geometry::feature; } // namespace mbgl -- cgit v1.2.1