1 #pragma once
2 
3 #include <mbgl/style/property_value.hpp>
4 #include <mbgl/renderer/property_evaluation_parameters.hpp>
5 #include <mbgl/renderer/possibly_evaluated_property_value.hpp>
6 
7 namespace mbgl {
8 
9 template <typename T>
10 class DataDrivenPropertyEvaluator {
11 public:
12     using ResultType = PossiblyEvaluatedPropertyValue<T>;
13 
DataDrivenPropertyEvaluator(const PropertyEvaluationParameters & parameters_,T defaultValue_)14     DataDrivenPropertyEvaluator(const PropertyEvaluationParameters& parameters_, T defaultValue_)
15         : parameters(parameters_),
16           defaultValue(std::move(defaultValue_)) {}
17 
operator ()(const style::Undefined &) const18     ResultType operator()(const style::Undefined&) const {
19         return ResultType(defaultValue);
20     }
21 
operator ()(const T & constant) const22     ResultType operator()(const T& constant) const {
23         return ResultType(constant);
24     }
25 
operator ()(const style::PropertyExpression<T> & expression) const26     ResultType operator()(const style::PropertyExpression<T>& expression) const {
27         if (!expression.isFeatureConstant()) {
28             auto returnExpression = expression;
29             returnExpression.useIntegerZoom = parameters.useIntegerZoom;
30             return ResultType(returnExpression);
31         } else if (!parameters.useIntegerZoom) {
32             return ResultType(expression.evaluate(parameters.z));
33         } else {
34             return ResultType(expression.evaluate(floor(parameters.z)));
35         }
36     }
37 
38 private:
39     const PropertyEvaluationParameters& parameters;
40     T defaultValue;
41 };
42 
43 } // namespace mbgl
44