#pragma once #include #include namespace mbgl { namespace style { class Undefined {}; inline bool operator==(const Undefined&, const Undefined&) { return true; } inline bool operator!=(const Undefined&, const Undefined&) { return false; } template class PropertyValue { private: using Value = variant>; Value value; template friend bool operator==(const PropertyValue&, const PropertyValue&); public: PropertyValue() : value() {} PropertyValue( T constant) : value(constant) {} PropertyValue(Function function) : value(function) {} bool isUndefined() const { return value.which() == 0; } bool isConstant() const { return value.which() == 1; } bool isFunction() const { return value.which() == 2; } const T & asConstant() const { return value.template get< T >(); } const Function& asFunction() const { return value.template get>(); } explicit operator bool() const { return !isUndefined(); }; template static auto visit(const PropertyValue& value, Visitor&& visitor) { return Value::visit(value.value, visitor); } }; template bool operator==(const PropertyValue& lhs, const PropertyValue& rhs) { return lhs.value == rhs.value; } template bool operator!=(const PropertyValue& lhs, const PropertyValue& rhs) { return !(lhs == rhs); } } // namespace style } // namespace mbgl