#pragma once #include #include #include #include #include namespace mbgl { template class DataDrivenPropertyEvaluator { public: using ResultType = PossiblyEvaluatedPropertyValue; DataDrivenPropertyEvaluator(const PropertyEvaluationParameters& parameters_, T defaultValue_) : parameters(parameters_), defaultValue(std::move(defaultValue_)) {} ResultType operator()(const style::Undefined&) const { return ResultType(defaultValue); } ResultType operator()(const T& constant) const { return ResultType(constant); } ResultType operator()(const style::PropertyExpression& expression) const { if (useIntegerZoom) { // Compiler will optimize out the unused branch. if (!expression.isFeatureConstant() || !expression.isRuntimeConstant()) { auto returnExpression = expression; returnExpression.useIntegerZoom = true; return ResultType(returnExpression); } return ResultType(expression.evaluate(std::floor(parameters.z))); } else { if (!expression.isFeatureConstant() || !expression.isRuntimeConstant()) { return ResultType(expression); } return ResultType(expression.evaluate(parameters.z)); } } private: const PropertyEvaluationParameters& parameters; T defaultValue; }; template class DataDrivenPropertyEvaluator> { public: using ResultType = PossiblyEvaluatedPropertyValue>; DataDrivenPropertyEvaluator(const PropertyEvaluationParameters& parameters_, T defaultValue_) : parameters(parameters_), defaultValue(std::move(defaultValue_)) {} ResultType operator()(const T& constant) const { return ResultType(calculate(constant, constant, constant)); } ResultType operator()(const style::Undefined& ) const { return ResultType(calculate(defaultValue, defaultValue, defaultValue)); } ResultType operator()(const style::PropertyExpression& expression) const { if (!expression.isFeatureConstant() || !expression.isRuntimeConstant()) { return ResultType(expression); } else { const T evaluated = expression.evaluate(std::floor(parameters.z)); return ResultType(calculate(evaluated, evaluated, evaluated)); } } private: Faded calculate(const T& min, const T& mid, const T& max) const { const float z = parameters.z; return z > parameters.zoomHistory.lastIntegerZoom ? Faded { min, mid } : Faded { max, mid }; }; const PropertyEvaluationParameters& parameters; T defaultValue; }; } // namespace mbgl