diff options
Diffstat (limited to 'include/mbgl/style/conversion')
3 files changed, 17 insertions, 88 deletions
diff --git a/include/mbgl/style/conversion/color_ramp_property_value.hpp b/include/mbgl/style/conversion/color_ramp_property_value.hpp index 87049b043b..17aa177420 100644 --- a/include/mbgl/style/conversion/color_ramp_property_value.hpp +++ b/include/mbgl/style/conversion/color_ramp_property_value.hpp @@ -9,7 +9,7 @@ namespace conversion { template <> struct Converter<ColorRampPropertyValue> { - optional<ColorRampPropertyValue> operator()(const Convertible& value, Error& error, bool /* convertTokens */ = false) const; + optional<ColorRampPropertyValue> operator()(const Convertible& value, Error& error, bool /* allowDataExpressions */ = false, bool /* convertTokens */ = false) const; }; } // namespace conversion diff --git a/include/mbgl/style/conversion/data_driven_property_value.hpp b/include/mbgl/style/conversion/data_driven_property_value.hpp deleted file mode 100644 index 2d8817ecf4..0000000000 --- a/include/mbgl/style/conversion/data_driven_property_value.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include <mbgl/style/data_driven_property_value.hpp> -#include <mbgl/style/conversion.hpp> -#include <mbgl/style/conversion/constant.hpp> -#include <mbgl/style/conversion/function.hpp> -#include <mbgl/style/expression/is_expression.hpp> -#include <mbgl/style/expression/is_constant.hpp> -#include <mbgl/style/expression/literal.hpp> -#include <mbgl/style/expression/value.hpp> -#include <mbgl/style/expression/parsing_context.hpp> - -namespace mbgl { -namespace style { -namespace conversion { - -template <class T> -struct Converter<DataDrivenPropertyValue<T>> { - optional<DataDrivenPropertyValue<T>> operator()(const Convertible& value, Error& error, bool convertTokens) const { - using namespace mbgl::style::expression; - - if (isUndefined(value)) { - return DataDrivenPropertyValue<T>(); - } - - optional<PropertyExpression<T>> expression; - - if (isExpression(value)) { - ParsingContext ctx(valueTypeToExpressionType<T>()); - ParseResult parsed = ctx.parseLayerPropertyExpression(value); - if (!parsed) { - error.message = ctx.getCombinedErrors(); - return nullopt; - } - expression = PropertyExpression<T>(std::move(*parsed)); - } else if (isObject(value)) { - expression = convertFunctionToExpression<T>(value, error, convertTokens); - } else { - optional<T> constant = convert<T>(value, error); - if (!constant) { - return nullopt; - } - return convertTokens ? maybeConvertTokens(*constant) : DataDrivenPropertyValue<T>(*constant); - } - - if (!expression) { - return nullopt; - } else if (!(*expression).isFeatureConstant() || !(*expression).isZoomConstant()) { - return { std::move(*expression) }; - } else if ((*expression).getExpression().getKind() == Kind::Literal) { - optional<T> constant = fromExpressionValue<T>( - static_cast<const Literal&>((*expression).getExpression()).getValue()); - if (!constant) { - return nullopt; - } - return DataDrivenPropertyValue<T>(*constant); - } else { - assert(false); - error.message = "expected a literal expression"; - return nullopt; - } - } - - template <class S> - DataDrivenPropertyValue<T> maybeConvertTokens(const S& t) const { - return DataDrivenPropertyValue<T>(t); - }; - - DataDrivenPropertyValue<T> maybeConvertTokens(const std::string& t) const { - return hasTokens(t) - ? DataDrivenPropertyValue<T>(PropertyExpression<T>(convertTokenStringToExpression(t))) - : DataDrivenPropertyValue<T>(t); - } -}; - -} // namespace conversion -} // namespace style -} // namespace mbgl diff --git a/include/mbgl/style/conversion/property_value.hpp b/include/mbgl/style/conversion/property_value.hpp index 4d13144dd7..fa6752867b 100644 --- a/include/mbgl/style/conversion/property_value.hpp +++ b/include/mbgl/style/conversion/property_value.hpp @@ -16,13 +16,9 @@ namespace conversion { template <class T> struct Converter<PropertyValue<T>> { - optional<PropertyValue<T>> operator()(const Convertible& value, Error& error, bool convertTokens = false) const { + optional<PropertyValue<T>> operator()(const Convertible& value, Error& error, bool allowDataExpressions, bool convertTokens) const { using namespace mbgl::style::expression; - // Only icon-image and text-field support tokens, and they are both data-driven. - assert(!convertTokens); - (void)convertTokens; - if (isUndefined(value)) { return PropertyValue<T>(); } @@ -38,21 +34,21 @@ struct Converter<PropertyValue<T>> { } expression = PropertyExpression<T>(std::move(*parsed)); } else if (isObject(value)) { - expression = convertFunctionToExpression<T>(value, error, false); + expression = convertFunctionToExpression<T>(value, error, convertTokens); } else { optional<T> constant = convert<T>(value, error); if (!constant) { return nullopt; } - return { *constant }; + return convertTokens ? maybeConvertTokens(*constant) : PropertyValue<T>(*constant); } if (!expression) { return nullopt; - } else if (!(*expression).isFeatureConstant()) { + } else if (!allowDataExpressions && !(*expression).isFeatureConstant()) { error.message = "data expressions not supported"; return nullopt; - } else if (!(*expression).isZoomConstant()) { + } else if (!(*expression).isFeatureConstant() || !(*expression).isZoomConstant()) { return { std::move(*expression) }; } else if ((*expression).getExpression().getKind() == Kind::Literal) { optional<T> constant = fromExpressionValue<T>( @@ -67,6 +63,17 @@ struct Converter<PropertyValue<T>> { return nullopt; } } + + template <class S> + PropertyValue<T> maybeConvertTokens(const S& t) const { + return PropertyValue<T>(t); + }; + + PropertyValue<T> maybeConvertTokens(const std::string& t) const { + return hasTokens(t) + ? PropertyValue<T>(PropertyExpression<T>(convertTokenStringToExpression(t))) + : PropertyValue<T>(t); + } }; } // namespace conversion |