#include #include namespace mbgl { template struct Evaluator : public mapbox::util::static_visitor { const Extractor& extractor; Evaluator(const Extractor& extractor_) : extractor(extractor_) {} template bool operator()(const E& e) const { return e.evaluate(extractor); } }; template bool evaluate(const FilterExpression& expression, const Extractor& extractor) { return mapbox::util::apply_visitor(Evaluator(extractor), expression); }; template bool EqualsExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); return actual && util::relaxed_equal(*actual, value); } template bool NotEqualsExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); return !actual || util::relaxed_not_equal(*actual, value); } template bool LessThanExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); return actual && util::relaxed_less(*actual, value); } template bool LessThanEqualsExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); return actual && util::relaxed_less_equal(*actual, value); } template bool GreaterThanExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); return actual && util::relaxed_greater(*actual, value); } template bool GreaterThanEqualsExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); return actual && util::relaxed_greater_equal(*actual, value); } template bool InExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); if (!actual) return false; for (const auto& v: values) { if (util::relaxed_equal(*actual, v)) { return true; } } return false; } template bool NotInExpression::evaluate(const Extractor& extractor) const { mapbox::util::optional actual = extractor.getValue(key); if (!actual) return true; for (const auto& v: values) { if (util::relaxed_equal(*actual, v)) { return false; } } return true; } template bool AnyExpression::evaluate(const Extractor& extractor) const { Evaluator evaluator(extractor); for (const auto& e: expressions) { if (mapbox::util::apply_visitor(evaluator, e)) { return true; } } return false; } template bool AllExpression::evaluate(const Extractor& extractor) const { Evaluator evaluator(extractor); for (const auto& e: expressions) { if (!mapbox::util::apply_visitor(evaluator, e)) { return false; } } return true; } template bool NoneExpression::evaluate(const Extractor& extractor) const { Evaluator evaluator(extractor); for (const auto& e: expressions) { if (mapbox::util::apply_visitor(evaluator, e)) { return false; } } return true; } }