diff options
Diffstat (limited to 'include/mbgl/style/function/convert.hpp')
-rw-r--r-- | include/mbgl/style/function/convert.hpp | 102 |
1 files changed, 49 insertions, 53 deletions
diff --git a/include/mbgl/style/function/convert.hpp b/include/mbgl/style/function/convert.hpp index e07b4038ea..82537f5bfa 100644 --- a/include/mbgl/style/function/convert.hpp +++ b/include/mbgl/style/function/convert.hpp @@ -6,10 +6,11 @@ #include <mbgl/style/expression/coalesce.hpp> #include <mbgl/style/expression/compound_expression.hpp> #include <mbgl/style/expression/coercion.hpp> -#include <mbgl/style/expression/curve.hpp> +#include <mbgl/style/expression/interpolate.hpp> #include <mbgl/style/expression/expression.hpp> #include <mbgl/style/expression/literal.hpp> #include <mbgl/style/expression/match.hpp> +#include <mbgl/style/expression/step.hpp> #include <mbgl/style/function/exponential_stops.hpp> #include <mbgl/style/function/interval_stops.hpp> @@ -82,12 +83,12 @@ struct Convert { } template <typename OutputType> - static ParseResult makeCurve(type::Type type, + static ParseResult makeInterpolate(type::Type type, std::unique_ptr<Expression> input, std::map<double, std::unique_ptr<Expression>> convertedStops, - typename Curve<OutputType>::Interpolator interpolator) + typename Interpolate<OutputType>::Interpolator interpolator) { - ParseResult curve = ParseResult(std::make_unique<Curve<OutputType>>( + ParseResult curve = ParseResult(std::make_unique<Interpolate<OutputType>>( std::move(type), std::move(interpolator), std::move(input), @@ -181,7 +182,7 @@ struct Convert { template <typename T> static std::unique_ptr<Expression> toExpression(const ExponentialStops<T>& stops) { - ParseResult e = makeCurve<typename ValueConverter<T>::ExpressionType>( + ParseResult e = makeInterpolate<typename ValueConverter<T>::ExpressionType>( valueTypeToExpressionType<T>(), makeZoom(), convertStops(stops.stops), @@ -193,10 +194,9 @@ struct Convert { template <typename T> static std::unique_ptr<Expression> toExpression(const IntervalStops<T>& stops) { - ParseResult e = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), - makeZoom(), - convertStops(stops.stops), - StepInterpolator()); + ParseResult e(std::make_unique<Step>(valueTypeToExpressionType<T>(), + makeZoom(), + convertStops(stops.stops))); assert(e); return std::move(*e); } @@ -205,7 +205,7 @@ struct Convert { static std::unique_ptr<Expression> toExpression(const std::string& property, const ExponentialStops<T>& stops) { - ParseResult e = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), + ParseResult e = makeInterpolate<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), makeGet(type::Number, property), convertStops(stops.stops), ExponentialInterpolator(stops.base)); @@ -218,10 +218,9 @@ struct Convert { const IntervalStops<T>& stops) { std::unique_ptr<Expression> get = makeGet(type::Number, property); - ParseResult e = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), - std::move(get), - convertStops(stops.stops), - StepInterpolator()); + ParseResult e(std::make_unique<Step>(valueTypeToExpressionType<T>(), + std::move(get), + convertStops(stops.stops))); assert(e); return std::move(*e); } @@ -235,17 +234,23 @@ struct Convert { return std::move(*expr); } + // interpolatable zoom curve template <typename T> - static typename Curve<std::enable_if_t<util::Interpolatable<T>::value, T>>::Interpolator zoomInterpolator() { - return ExponentialInterpolator(1.0); + static typename std::enable_if_t<util::Interpolatable<T>::value, + ParseResult> makeZoomCurve(std::map<double, std::unique_ptr<Expression>> stops) { + return makeInterpolate<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), + makeZoom(), + std::move(stops), + ExponentialInterpolator(1.0)); } + // non-interpolatable zoom curve template <typename T> - static typename Curve<std::enable_if_t<!util::Interpolatable<T>::value, T>>::Interpolator zoomInterpolator() { - return StepInterpolator(); + static typename std::enable_if_t<!util::Interpolatable<T>::value, + ParseResult> makeZoomCurve(std::map<double, std::unique_ptr<Expression>> stops) { + return ParseResult(std::make_unique<Step>(valueTypeToExpressionType<T>(), makeZoom(), std::move(stops))); } - template <typename T> static std::unique_ptr<Expression> toExpression(const std::string& property, const CompositeExponentialStops<T>& stops) @@ -253,19 +258,17 @@ struct Convert { std::map<double, std::unique_ptr<Expression>> outerStops; for (const std::pair<float, std::map<float, T>>& stop : stops.stops) { std::unique_ptr<Expression> get = makeGet(type::Number, property); - ParseResult innerCurve = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), + ParseResult innerInterpolate = makeInterpolate<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), std::move(get), convertStops(stop.second), ExponentialInterpolator(stops.base)); - assert(innerCurve); - outerStops.emplace(stop.first, std::move(*innerCurve)); + assert(innerInterpolate); + outerStops.emplace(stop.first, std::move(*innerInterpolate)); } - ParseResult outerCurve = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), - makeZoom(), - std::move(outerStops), - zoomInterpolator<T>()); - assert(outerCurve); - return std::move(*outerCurve); + + ParseResult zoomCurve = makeZoomCurve<T>(std::move(outerStops)); + assert(zoomCurve); + return std::move(*zoomCurve); } template <typename T> @@ -275,19 +278,16 @@ struct Convert { std::map<double, std::unique_ptr<Expression>> outerStops; for (const std::pair<float, std::map<float, T>>& stop : stops.stops) { std::unique_ptr<Expression> get = makeGet(type::Number, property); - ParseResult innerCurve = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), - std::move(get), - convertStops(stop.second), - StepInterpolator()); - assert(innerCurve); - outerStops.emplace(stop.first, std::move(*innerCurve)); + ParseResult innerInterpolate(std::make_unique<Step>(valueTypeToExpressionType<T>(), + std::move(get), + convertStops(stop.second))); + assert(innerInterpolate); + outerStops.emplace(stop.first, std::move(*innerInterpolate)); } - ParseResult outerCurve = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), - makeZoom(), - std::move(outerStops), - zoomInterpolator<T>()); - assert(outerCurve); - return std::move(*outerCurve); + + ParseResult zoomCurve = makeZoomCurve<T>(std::move(outerStops)); + assert(zoomCurve); + return std::move(*zoomCurve); } template <typename T> @@ -296,24 +296,20 @@ struct Convert { { std::map<double, std::unique_ptr<Expression>> outerStops; for (const std::pair<float, std::map<CategoricalValue, T>>& stop : stops.stops) { - ParseResult innerCurve = fromCategoricalStops(stop.second, property); - assert(innerCurve); - outerStops.emplace(stop.first, std::move(*innerCurve)); + ParseResult innerInterpolate = fromCategoricalStops(stop.second, property); + assert(innerInterpolate); + outerStops.emplace(stop.first, std::move(*innerInterpolate)); } - ParseResult outerCurve = makeCurve<typename ValueConverter<T>::ExpressionType>(valueTypeToExpressionType<T>(), - makeZoom(), - std::move(outerStops), - zoomInterpolator<T>()); - assert(outerCurve); - return std::move(*outerCurve); + + ParseResult zoomCurve = makeZoomCurve<T>(std::move(outerStops)); + assert(zoomCurve); + return std::move(*zoomCurve); } - template <typename T> - static std::unique_ptr<Expression> toExpression(const std::string& property, - const IdentityStops<T>&) + static std::unique_ptr<Expression> fromIdentityFunction(type::Type type, const std::string& property) { - std::unique_ptr<Expression> input = valueTypeToExpressionType<T>().match( + std::unique_ptr<Expression> input = type.match( [&] (const type::StringType&) { return makeGet(type::String, property); }, |