From 7de4ce5bcbd8a3081f364bef3249d99f3fad60cc Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 3 Nov 2015 13:51:27 -0800 Subject: [PATCH] [core] Simplify Function --- src/mbgl/annotation/annotation_manager.cpp | 4 +- src/mbgl/annotation/shape_annotation_impl.cpp | 14 ++--- .../{function_properties.cpp => function.cpp} | 41 +++++++------- src/mbgl/style/function.hpp | 31 +++++++++++ src/mbgl/style/function_properties.hpp | 55 ------------------- src/mbgl/style/property_evaluator.hpp | 4 +- src/mbgl/style/property_parsing.cpp | 4 +- src/mbgl/style/property_value.hpp | 2 +- test/miscellaneous/functions.cpp | 29 +++++----- 9 files changed, 81 insertions(+), 103 deletions(-) rename src/mbgl/style/{function_properties.cpp => function.cpp} (64%) create mode 100644 src/mbgl/style/function.hpp delete mode 100644 src/mbgl/style/function_properties.hpp diff --git a/src/mbgl/annotation/annotation_manager.cpp b/src/mbgl/annotation/annotation_manager.cpp index dd2579267..4f8504930 100644 --- a/src/mbgl/annotation/annotation_manager.cpp +++ b/src/mbgl/annotation/annotation_manager.cpp @@ -120,8 +120,8 @@ void AnnotationManager::updateStyle(Style& style) { layer->source = SourceID; layer->sourceLayer = PointLayerID; - layer->layout.set(PropertyKey::IconImage, ConstantFunction("{sprite}")); - layer->layout.set(PropertyKey::IconAllowOverlap, ConstantFunction(true)); + layer->layout.set(PropertyKey::IconImage, Function("{sprite}")); + layer->layout.set(PropertyKey::IconAllowOverlap, Function(true)); style.addLayer(std::move(layer)); } diff --git a/src/mbgl/annotation/shape_annotation_impl.cpp b/src/mbgl/annotation/shape_annotation_impl.cpp index f84946fe1..3486c43d0 100644 --- a/src/mbgl/annotation/shape_annotation_impl.cpp +++ b/src/mbgl/annotation/shape_annotation_impl.cpp @@ -34,9 +34,9 @@ void ShapeAnnotationImpl::updateStyle(Style& style) { const LinePaintProperties& properties = shape.properties.get(); ClassProperties paintProperties; - paintProperties.set(PropertyKey::LineOpacity, ConstantFunction(properties.opacity)); - paintProperties.set(PropertyKey::LineWidth, ConstantFunction(properties.width)); - paintProperties.set(PropertyKey::LineColor, ConstantFunction(properties.color)); + paintProperties.set(PropertyKey::LineOpacity, Function(properties.opacity)); + paintProperties.set(PropertyKey::LineWidth, Function(properties.width)); + paintProperties.set(PropertyKey::LineColor, Function(properties.color)); layer->paints.paints.emplace(ClassID::Default, std::move(paintProperties)); } else if (shape.properties.is()) { @@ -44,9 +44,9 @@ void ShapeAnnotationImpl::updateStyle(Style& style) { const FillPaintProperties& properties = shape.properties.get(); ClassProperties paintProperties; - paintProperties.set(PropertyKey::FillOpacity, ConstantFunction(properties.opacity)); - paintProperties.set(PropertyKey::FillColor, ConstantFunction(properties.fill_color)); - paintProperties.set(PropertyKey::FillOutlineColor, ConstantFunction(properties.stroke_color)); + paintProperties.set(PropertyKey::FillOpacity, Function(properties.opacity)); + paintProperties.set(PropertyKey::FillColor, Function(properties.fill_color)); + paintProperties.set(PropertyKey::FillOutlineColor, Function(properties.stroke_color)); layer->paints.paints.emplace(ClassID::Default, std::move(paintProperties)); } else { @@ -83,7 +83,7 @@ std::unique_ptr ShapeAnnotationImpl::createLineLayer() { type = ProjectedFeatureType::LineString; std::unique_ptr layer = std::make_unique(); layer->type = StyleLayerType::Line; - layer->layout.set(PropertyKey::LineJoin, ConstantFunction(JoinType::Round)); + layer->layout.set(PropertyKey::LineJoin, Function(JoinType::Round)); return std::move(layer); } diff --git a/src/mbgl/style/function_properties.cpp b/src/mbgl/style/function.cpp similarity index 64% rename from src/mbgl/style/function_properties.cpp rename to src/mbgl/style/function.cpp index 1ac2863a7..19ccd7f60 100644 --- a/src/mbgl/style/function_properties.cpp +++ b/src/mbgl/style/function.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -27,7 +27,7 @@ template <> inline TextTransformType defaultStopsValue() { return {}; }; template <> inline RotationAlignmentType defaultStopsValue() { return {}; }; template -T StopsFunction::evaluate(float z) const { +T Function::evaluate(float z) const { bool smaller = false; float smaller_z = 0.0f; T smaller_val = T(); @@ -35,9 +35,9 @@ T StopsFunction::evaluate(float z) const { float larger_z = 0.0f; T larger_val = T(); - for (uint32_t i = 0; i < values.size(); i++) { - float stop_z = values[i].first; - T stop_val = values[i].second; + for (uint32_t i = 0; i < stops.size(); i++) { + float stop_z = stops[i].first; + T stop_val = stops[i].second; if (stop_z <= z && (!smaller || smaller_z < stop_z)) { smaller = true; smaller_z = stop_z; @@ -73,20 +73,21 @@ T StopsFunction::evaluate(float z) const { } } -template bool StopsFunction::evaluate(float z) const; -template float StopsFunction::evaluate(float z) const; -template Color StopsFunction::evaluate(float z) const; -template std::vector StopsFunction>::evaluate(float z) const; -template std::array StopsFunction>::evaluate(float z) const; +template bool Function::evaluate(float z) const; +template float Function::evaluate(float z) const; +template Color Function::evaluate(float z) const; +template std::vector Function>::evaluate(float z) const; +template std::array Function>::evaluate(float z) const; + +template std::string Function::evaluate(float z) const; +template TranslateAnchorType Function::evaluate(float z) const; +template RotateAnchorType Function::evaluate(float z) const; +template CapType Function::evaluate(float z) const; +template JoinType Function::evaluate(float z) const; +template PlacementType Function::evaluate(float z) const; +template TextAnchorType Function::evaluate(float z) const; +template TextJustifyType Function::evaluate(float z) const; +template TextTransformType Function::evaluate(float z) const; +template RotationAlignmentType Function::evaluate(float z) const; -template std::string StopsFunction::evaluate(float z) const; -template TranslateAnchorType StopsFunction::evaluate(float z) const; -template RotateAnchorType StopsFunction::evaluate(float z) const; -template CapType StopsFunction::evaluate(float z) const; -template JoinType StopsFunction::evaluate(float z) const; -template PlacementType StopsFunction::evaluate(float z) const; -template TextAnchorType StopsFunction::evaluate(float z) const; -template TextJustifyType StopsFunction::evaluate(float z) const; -template TextTransformType StopsFunction::evaluate(float z) const; -template RotationAlignmentType StopsFunction::evaluate(float z) const; } diff --git a/src/mbgl/style/function.hpp b/src/mbgl/style/function.hpp new file mode 100644 index 000000000..6ef4fcf5d --- /dev/null +++ b/src/mbgl/style/function.hpp @@ -0,0 +1,31 @@ +#ifndef MBGL_STYLE_FUNCTION +#define MBGL_STYLE_FUNCTION + +#include +#include + +namespace mbgl { + +template +class Function { +public: + using Stop = std::pair; + using Stops = std::vector; + + // TODO: make explicit + /* explicit */ Function(const T& constant) + : stops({{ 0, constant }}) {} + + explicit Function(const Stops& stops_, float base_) + : base(base_), stops(stops_) {} + + T evaluate(float z) const; + +private: + const float base = 1; + const std::vector> stops; +}; + +} + +#endif diff --git a/src/mbgl/style/function_properties.hpp b/src/mbgl/style/function_properties.hpp deleted file mode 100644 index c41918a0f..000000000 --- a/src/mbgl/style/function_properties.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef MBGL_STYLE_FUNCTION_PROPERTIES -#define MBGL_STYLE_FUNCTION_PROPERTIES - -#include - -#include - -namespace mbgl { - -template -struct ConstantFunction { - inline ConstantFunction(const T &value_) : value(value_) {} - inline T evaluate(float) const { return value; } - -private: - const T value; -}; - -template -struct StopsFunction { - inline StopsFunction(const std::vector> &values_, float base_) : values(values_), base(base_) {} - T evaluate(float z) const; - -private: - const std::vector> values; - const float base; -}; - -template -using Function = mapbox::util::variant< - std::false_type, - ConstantFunction, - StopsFunction ->; - -template -struct FunctionEvaluator { - typedef T result_type; - inline FunctionEvaluator(float z_) : z(z_) {} - - inline result_type operator()(const std::false_type &) { - return result_type(); - } - - template