#pragma once #include #include #include namespace mbgl { namespace style { template class PropertyValue { private: using Value = variant< Undefined, T, PropertyExpression>; Value value; friend bool operator==(const PropertyValue& lhs, const PropertyValue& rhs) { return lhs.value == rhs.value; } friend bool operator!=(const PropertyValue& lhs, const PropertyValue& rhs) { return !(lhs == rhs); } public: PropertyValue() = default; PropertyValue(T constant) : value(std::move(constant)) {} PropertyValue(PropertyExpression expression) : value(std::move(expression)) {} bool isUndefined() const { return value.template is(); } bool isConstant() const { return value.template is(); } bool isExpression() const { return value.template is>(); } bool isDataDriven() const { return value.match( [] (const Undefined&) { return false; }, [] (const T&) { return false; }, [] (const PropertyExpression& fn) { return !fn.isFeatureConstant(); } ); } bool isZoomConstant() const { return value.match( [] (const Undefined&) { return true; }, [] (const T&) { return true; }, [] (const PropertyExpression& fn) { return fn.isZoomConstant(); } ); } const T& asConstant() const { return value.template get(); } const PropertyExpression& asExpression() const { return value.template get>(); } template auto match(Ts&&... ts) const { return value.match(std::forward(ts)...); } template auto evaluate(const Evaluator& evaluator, TimePoint = {}) const { return Value::visit(value, evaluator); } bool hasDataDrivenPropertyDifference(const PropertyValue& other) const { return *this != other && (isDataDriven() || other.isDataDriven()); } }; } // namespace style } // namespace mbgl