diff options
-rw-r--r-- | include/mbgl/style/conversion_impl.hpp | 7 | ||||
-rw-r--r-- | include/mbgl/style/light.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/style/light.hpp.ejs | 2 | ||||
-rw-r--r-- | src/mbgl/style/light.cpp | 83 | ||||
-rw-r--r-- | src/mbgl/style/light.cpp.ejs | 49 |
5 files changed, 104 insertions, 39 deletions
diff --git a/include/mbgl/style/conversion_impl.hpp b/include/mbgl/style/conversion_impl.hpp index 7abe7bf923..3e4236949e 100644 --- a/include/mbgl/style/conversion_impl.hpp +++ b/include/mbgl/style/conversion_impl.hpp @@ -342,6 +342,13 @@ struct ValueFactory<T, typename std::enable_if<is_linear_container<T>::value>::t } }; +template <> +struct ValueFactory<Position> { + static Value make(const Position& position) { + return ValueFactory<std::array<float, 3>>::make(position.getSpherical()); + } +}; + template <typename T> Value makeValue(T&& arg) { return ValueFactory<std::decay_t<T>>::make(std::forward<T>(arg)); diff --git a/include/mbgl/style/light.hpp b/include/mbgl/style/light.hpp index 9a82eb14b5..7434fb2882 100644 --- a/include/mbgl/style/light.hpp +++ b/include/mbgl/style/light.hpp @@ -6,6 +6,7 @@ #include <mbgl/style/conversion.hpp> #include <mbgl/style/property_value.hpp> +#include <mbgl/style/style_property.hpp> #include <mbgl/style/transition_options.hpp> #include <mbgl/style/types.hpp> #include <mbgl/util/immutable.hpp> @@ -22,6 +23,7 @@ public: // Dynamic properties optional<conversion::Error> setProperty(const std::string& name, const conversion::Convertible& value); + StyleProperty getProperty(const std::string&) const; static LightAnchorType getDefaultAnchor(); PropertyValue<LightAnchorType> getAnchor() const; diff --git a/include/mbgl/style/light.hpp.ejs b/include/mbgl/style/light.hpp.ejs index a5b907b4dc..e4661dc59b 100644 --- a/include/mbgl/style/light.hpp.ejs +++ b/include/mbgl/style/light.hpp.ejs @@ -9,6 +9,7 @@ #include <mbgl/style/conversion.hpp> #include <mbgl/style/property_value.hpp> +#include <mbgl/style/style_property.hpp> #include <mbgl/style/transition_options.hpp> #include <mbgl/style/types.hpp> #include <mbgl/util/immutable.hpp> @@ -25,6 +26,7 @@ public: // Dynamic properties optional<conversion::Error> 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 be56a0d93b..a10e693073 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 <mbgl/style/light.hpp> @@ -36,29 +34,37 @@ Mutable<Light::Impl> Light::mutableImpl() const { using namespace conversion; -optional<Error> 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<mapbox::eternal::string, uint8_t>({ - { "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) } - }); +namespace { + +enum class Property : uint8_t { + Anchor, + Color, + Intensity, + Position, + AnchorTransition, + ColorTransition, + IntensityTransition, + PositionTransition, +}; + +template <typename T> +constexpr uint8_t toUint8(T t) noexcept { + return uint8_t(mbgl::underlying_type(t)); +} + +MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>( + {{"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<Error> Light::setProperty(const std::string& name, const Convertible& value) { 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<Error> 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<Property>(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 55cc013827..68c1bf59e2 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 <mbgl/style/light.hpp> @@ -39,21 +37,29 @@ Mutable<Light::Impl> Light::mutableImpl() const { using namespace conversion; -optional<Error> Light::setProperty(const std::string& name, const Convertible& value) { - enum class Property { +namespace { + +enum class Property : uint8_t { <% for (const property of properties) { -%> - <%- camelize(property.name) %>, + <%- camelize(property.name) %>, <% } -%> <% for (const property of properties) { -%> - <%- camelize(property.name) %>Transition, + <%- camelize(property.name) %>Transition, <% } -%> - }; +}; + +template <typename T> +constexpr uint8_t toUint8(T t) noexcept { + return uint8_t(mbgl::underlying_type(t)); +} - MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>({ - <%- 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 ') %> - }); +MAPBOX_ETERNAL_CONSTEXPR const auto properties = mapbox::eternal::hash_map<mapbox::eternal::string, uint8_t>( + {<%- 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<Error> Light::setProperty(const std::string& name, const Convertible& value) { 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<Error> 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<Property>(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 |