#pragma once #include #include #include #include namespace mbgl { class GeometryTileFeature; namespace style { template class PossiblyEvaluatedPropertyValue { private: using Value = variant< T, SourceFunction, CompositeFunction>; Value value; public: PossiblyEvaluatedPropertyValue() = default; PossiblyEvaluatedPropertyValue(Value v) : value(std::move(v)) {} bool isConstant() const { return value.template is(); } optional constant() const { return value.match( [&] (const T& t) { return optional(t); }, [&] (const auto&) { return optional(); }); } T constantOr(const T& t) const { return constant().value_or(t); } template auto match(Ts&&... ts) const { return value.match(std::forward(ts)...); } T evaluate(float z, const GeometryTileFeature& feature) const { return value.match( [&] (const T& t) { return t; }, [&] (const SourceFunction& t) { return t.evaluate(feature); }, [&] (const CompositeFunction& t) { return t.evaluate(z, feature); }); } }; } // namespace style namespace util { template struct Interpolator> { style::PossiblyEvaluatedPropertyValue operator()(const style::PossiblyEvaluatedPropertyValue& a, const style::PossiblyEvaluatedPropertyValue& b, const double t) const { if (a.isConstant() && b.isConstant()) { return { interpolate(*a.constant(), *b.constant(), t) }; } else { return { a }; } } }; } // namespace util } // namespace mbgl