diff --git a/include/mbgl/style/conversion_impl.hpp b/include/mbgl/style/conversion_impl.hpp index 7abe7bf92..3e4236949 100644 --- a/include/mbgl/style/conversion_impl.hpp +++ b/include/mbgl/style/conversion_impl.hpp @@ -342,6 +342,13 @@ struct ValueFactory::value>::t } }; +template <> +struct ValueFactory { + static Value make(const Position& position) { + return ValueFactory>::make(position.getSpherical()); + } +}; + template Value makeValue(T&& arg) { return ValueFactory>::make(std::forward(arg)); diff --git a/include/mbgl/style/light.hpp b/include/mbgl/style/light.hpp index 9a82eb14b..7434fb288 100644 --- a/include/mbgl/style/light.hpp +++ b/include/mbgl/style/light.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -22,6 +23,7 @@ public: // Dynamic properties optional setProperty(const std::string& name, const conversion::Convertible& value); + StyleProperty getProperty(const std::string&) const; static LightAnchorType getDefaultAnchor(); PropertyValue getAnchor() const; diff --git a/include/mbgl/style/light.hpp.ejs b/include/mbgl/style/light.hpp.ejs index a5b907b4d..e4661dc59 100644 --- a/include/mbgl/style/light.hpp.ejs +++ b/include/mbgl/style/light.hpp.ejs @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -25,6 +26,7 @@ public: // Dynamic properties optional setProperty(const std::string& name, const conversion::Convertible& value); + StyleProperty getProperty(const std::string&) const; <% for (const property of properties) { -%> static <%- evaluatedType(property) %> getDefault<%- camelize(property.name) %>(); diff --git a/src/mbgl/style/light.cpp b/src/mbgl/style/light.cpp index be56a0d93..a10e69307 100644 --- a/src/mbgl/style/light.cpp +++ b/src/mbgl/style/light.cpp @@ -1,5 +1,3 @@ -// clang-format off - // This file is generated. Do not edit. #include @@ -36,29 +34,37 @@ Mutable Light::mutableImpl() const { using namespace conversion; +namespace { + +enum class Property : uint8_t { + Anchor, + Color, + Intensity, + Position, + AnchorTransition, + ColorTransition, + IntensityTransition, + PositionTransition, +}; + +template +constexpr uint8_t toUint8(T t) noexcept { + return uint8_t(mbgl::underlying_type(t)); +} + +MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map( + {{"anchor", toUint8(Property::Anchor)}, + {"color", toUint8(Property::Color)}, + {"intensity", toUint8(Property::Intensity)}, + {"position", toUint8(Property::Position)}, + {"anchor-transition", toUint8(Property::AnchorTransition)}, + {"color-transition", toUint8(Property::ColorTransition)}, + {"intensity-transition", toUint8(Property::IntensityTransition)}, + {"position-transition", toUint8(Property::PositionTransition)}}); + +} // namespace + optional Light::setProperty(const std::string& name, const Convertible& value) { - enum class Property { - Anchor, - Color, - Intensity, - Position, - AnchorTransition, - ColorTransition, - IntensityTransition, - PositionTransition, - }; - - MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map({ - { "anchor", mbgl::underlying_type(Property::Anchor) }, - { "color", mbgl::underlying_type(Property::Color) }, - { "intensity", mbgl::underlying_type(Property::Intensity) }, - { "position", mbgl::underlying_type(Property::Position) }, - { "anchor-transition", mbgl::underlying_type(Property::AnchorTransition) }, - { "color-transition", mbgl::underlying_type(Property::ColorTransition) }, - { "intensity-transition", mbgl::underlying_type(Property::IntensityTransition) }, - { "position-transition", mbgl::underlying_type(Property::PositionTransition) } - }); - const auto it = properties.find(name.c_str()); if (it == properties.end()) { return Error { "light doesn't support this property" }; @@ -146,6 +152,33 @@ optional Light::setProperty(const std::string& name, const Convertible& v return Error { "light doesn't support this property" }; } +StyleProperty Light::getProperty(const std::string& name) const { + const auto it = properties.find(name.c_str()); + if (it == properties.end()) { + return {}; + } + + switch (static_cast(it->second)) { + case Property::Anchor: + return makeStyleProperty(getAnchor()); + case Property::Color: + return makeStyleProperty(getColor()); + case Property::Intensity: + return makeStyleProperty(getIntensity()); + case Property::Position: + return makeStyleProperty(getPosition()); + case Property::AnchorTransition: + return makeStyleProperty(getAnchorTransition()); + case Property::ColorTransition: + return makeStyleProperty(getColorTransition()); + case Property::IntensityTransition: + return makeStyleProperty(getIntensityTransition()); + case Property::PositionTransition: + return makeStyleProperty(getPositionTransition()); + } + return {}; +} + LightAnchorType Light::getDefaultAnchor() { return LightAnchor::defaultValue(); } @@ -253,5 +286,3 @@ TransitionOptions Light::getPositionTransition() const { } // namespace style } // namespace mbgl - -// clang-format on diff --git a/src/mbgl/style/light.cpp.ejs b/src/mbgl/style/light.cpp.ejs index 55cc01382..68c1bf59e 100644 --- a/src/mbgl/style/light.cpp.ejs +++ b/src/mbgl/style/light.cpp.ejs @@ -1,8 +1,6 @@ <% const properties = locals.properties; -%> -// clang-format off - // This file is generated. Do not edit. #include @@ -39,21 +37,29 @@ Mutable Light::mutableImpl() const { using namespace conversion; +namespace { + +enum class Property : uint8_t { +<% for (const property of properties) { -%> + <%- camelize(property.name) %>, +<% } -%> +<% for (const property of properties) { -%> + <%- camelize(property.name) %>Transition, +<% } -%> +}; + +template +constexpr uint8_t toUint8(T t) noexcept { + return uint8_t(mbgl::underlying_type(t)); +} + +MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map( + {<%- properties.map(p => `{"${p.name}", toUint8(Property::${camelize(p.name)})}`).join(',\n ') %>, + <%- properties.map(p => `{"${p.name}-transition", toUint8(Property::${camelize(p.name)}Transition)}`).join(',\n ') %>}); + +} // namespace + optional Light::setProperty(const std::string& name, const Convertible& value) { - enum class Property { -<% for (const property of properties) { -%> - <%- camelize(property.name) %>, -<% } -%> -<% for (const property of properties) { -%> - <%- camelize(property.name) %>Transition, -<% } -%> - }; - - MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map({ - <%- properties.map(p => `{ "${p.name}", mbgl::underlying_type(Property::${camelize(p.name)}) }`).join(',\n ') %>, - <%- properties.map(p => `{ "${p.name}-transition", mbgl::underlying_type(Property::${camelize(p.name)}Transition) }`).join(',\n ') %> - }); - const auto it = properties.find(name.c_str()); if (it == properties.end()) { return Error { "light doesn't support this property" }; @@ -107,6 +113,25 @@ optional Light::setProperty(const std::string& name, const Convertible& v return Error { "light doesn't support this property" }; } +StyleProperty Light::getProperty(const std::string& name) const { + const auto it = properties.find(name.c_str()); + if (it == properties.end()) { + return {}; + } + + switch (static_cast(it->second)) { +<% for (const property of properties) { -%> + case Property::<%- camelize(property.name) %>: + return makeStyleProperty(get<%- camelize(property.name) %>()); +<% } -%> +<% for (const property of properties) { -%> + case Property::<%- camelize(property.name) %>Transition: + return makeStyleProperty(get<%- camelize(property.name) %>Transition()); +<% } -%> + } + return {}; +} + <% for (const property of properties) { -%> <%- evaluatedType(property) %> Light::getDefault<%- camelize(property.name) %>() { return Light<%- camelize(property.name) %>::defaultValue(); @@ -138,5 +163,3 @@ TransitionOptions Light::get<%- camelize(property.name) %>Transition() const { } // namespace style } // namespace mbgl - -// clang-format on