#pragma once #include #include namespace mbgl { namespace style { class PropertyEvaluationParameters; template class LayoutProperty { public: using EvaluatorType = PropertyEvaluator; using UnevaluatedType = PropertyValue; using EvaluatedType = T; }; template class LayoutProperties { public: using Properties = TypeList; using EvaluatedTypes = TypeList; using UnevaluatedTypes = TypeList; template using Tuple = IndexedTuple; class Evaluated : public Tuple { public: using Tuple::Tuple; }; class Unevaluated : public Tuple { public: using Tuple::Tuple; }; template auto evaluate(const PropertyEvaluationParameters& parameters) const { using Evaluator = typename P::EvaluatorType; return unevaluated.template get

() .evaluate(Evaluator(parameters, P::defaultValue())); } Evaluated evaluate(const PropertyEvaluationParameters& parameters) const { return Evaluated { evaluate(parameters)... }; } Unevaluated unevaluated; }; } // namespace style } // namespace mbgl