diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-05-06 13:45:24 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2020-05-26 20:35:04 +0300 |
commit | 40adc001eb9b97055ad139b431a8f286dece932d (patch) | |
tree | 95a90d4c0e06d8f3fe26e920b8123f2ed0ee05e3 | |
parent | ba876236a1afe163a57edb82170b307790e1420a (diff) | |
download | qtlocation-mapboxgl-40adc001eb9b97055ad139b431a8f286dece932d.tar.gz |
[core] Introduce Serializable
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | include/mbgl/style/color_ramp_property_value.hpp | 9 | ||||
-rw-r--r-- | include/mbgl/style/conversion_impl.hpp | 21 | ||||
-rw-r--r-- | include/mbgl/style/expression/expression.hpp | 8 | ||||
-rw-r--r-- | include/mbgl/style/filter.hpp | 14 | ||||
-rw-r--r-- | include/mbgl/style/layer.hpp | 5 | ||||
-rw-r--r-- | include/mbgl/style/source.hpp | 4 | ||||
-rw-r--r-- | include/mbgl/style/transition_options.hpp | 7 | ||||
-rw-r--r-- | include/mbgl/util/color.hpp | 7 | ||||
-rw-r--r-- | include/mbgl/util/serializable.hpp | 15 |
10 files changed, 49 insertions, 42 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 88df040b1c..fde902980d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -297,6 +297,7 @@ add_library( ${PROJECT_SOURCE_DIR}/include/mbgl/util/projection.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/range.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/run_loop.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/serializable.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/size.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/string.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/thread.hpp diff --git a/include/mbgl/style/color_ramp_property_value.hpp b/include/mbgl/style/color_ramp_property_value.hpp index 1b9385f85f..6c623cf17d 100644 --- a/include/mbgl/style/color_ramp_property_value.hpp +++ b/include/mbgl/style/color_ramp_property_value.hpp @@ -1,8 +1,9 @@ #pragma once -#include <mbgl/util/variant.hpp> -#include <mbgl/style/undefined.hpp> #include <mbgl/style/expression/expression.hpp> +#include <mbgl/style/undefined.hpp> +#include <mbgl/util/serializable.hpp> +#include <mbgl/util/variant.hpp> namespace mbgl { namespace style { @@ -11,7 +12,7 @@ namespace style { * Special-case implementation of (a subset of) the PropertyValue<T> interface * used for building the HeatmapColor paint property traits class. */ -class ColorRampPropertyValue { +class ColorRampPropertyValue : public Serializable { private: std::shared_ptr<expression::Expression> value; @@ -42,8 +43,8 @@ public: bool hasDataDrivenPropertyDifference(const ColorRampPropertyValue&) const { return false; } const expression::Expression& getExpression() const { return *value; } + Value serialize() const final { return value->serialize(); } }; - } // namespace style } // namespace mbgl diff --git a/include/mbgl/style/conversion_impl.hpp b/include/mbgl/style/conversion_impl.hpp index 11d3bae9ce..692760195e 100644 --- a/include/mbgl/style/conversion_impl.hpp +++ b/include/mbgl/style/conversion_impl.hpp @@ -10,6 +10,7 @@ #include <mbgl/util/feature.hpp> #include <mbgl/util/geojson.hpp> #include <mbgl/util/optional.hpp> +#include <mbgl/util/serializable.hpp> #include <mbgl/util/traits.hpp> #include <mapbox/compatibility/value.hpp> @@ -301,23 +302,15 @@ optional<T> convert(const Convertible& value, Error& error, Args&&...args) { return Converter<T>()(value, error, std::forward<Args>(args)...); } -template <> -struct ValueFactory<ColorRampPropertyValue> { - static Value make(const ColorRampPropertyValue& value) { return value.getExpression().serialize(); } -}; - -template <> -struct ValueFactory<TransitionOptions> { - static Value make(const TransitionOptions& value) { return value.serialize(); } -}; - -template <> -struct ValueFactory<Color> { - static Value make(const Color& color) { return color.serialize(); } +template <typename T> +struct ValueFactory<T, typename std::enable_if<std::is_base_of<Serializable, T>::value>::type> { + static Value make(const Serializable& value) { return value.serialize(); } }; template <typename T> -struct ValueFactory<T, typename std::enable_if<(!std::is_enum<T>::value && !is_linear_container<T>::value)>::type> { +struct ValueFactory<T, + typename std::enable_if<(!std::is_enum<T>::value && !is_linear_container<T>::value && + !std::is_base_of<Serializable, T>::value)>::type> { static Value make(const T& arg) { return {arg}; } }; diff --git a/include/mbgl/style/expression/expression.hpp b/include/mbgl/style/expression/expression.hpp index 51cc3b0f15..c747cd210d 100644 --- a/include/mbgl/style/expression/expression.hpp +++ b/include/mbgl/style/expression/expression.hpp @@ -173,7 +173,7 @@ enum class Kind : int32_t { Distance }; -class Expression { +class Expression : public Serializable { public: Expression(Kind kind_, type::Type type_) : kind(kind_), type(std::move(type_)) {} virtual ~Expression() = default; @@ -206,8 +206,8 @@ public: * complete set of outputs is statically undecidable. */ virtual std::vector<optional<Value>> possibleOutputs() const = 0; - - virtual mbgl::Value serialize() const { + + mbgl::Value serialize() const override { std::vector<mbgl::Value> serialized; serialized.emplace_back(getOperator()); eachChild([&](const Expression &child) { @@ -215,7 +215,7 @@ public: }); return serialized; }; - + virtual std::string getOperator() const = 0; protected: diff --git a/include/mbgl/style/filter.hpp b/include/mbgl/style/filter.hpp index c3ce6833fb..51c42b4a88 100644 --- a/include/mbgl/style/filter.hpp +++ b/include/mbgl/style/filter.hpp @@ -12,7 +12,7 @@ namespace mbgl { namespace style { -class Filter { +class Filter : public Serializable { public: optional<std::shared_ptr<const expression::Expression>> expression; private: @@ -41,14 +41,10 @@ public: friend bool operator!=(const Filter& lhs, const Filter& rhs) { return !(lhs == rhs); } - - mbgl::Value serialize() const { - if (legacyFilter) { - return *legacyFilter; - } - else if (expression) { - return (**expression).serialize(); - } + + mbgl::Value serialize() const final { + if (legacyFilter) return *legacyFilter; + if (expression) return (**expression).serialize(); return NullValue(); } }; diff --git a/include/mbgl/style/layer.hpp b/include/mbgl/style/layer.hpp index 13a2ec014f..b1bc647b8b 100644 --- a/include/mbgl/style/layer.hpp +++ b/include/mbgl/style/layer.hpp @@ -5,6 +5,7 @@ #include <mbgl/style/types.hpp> #include <mbgl/util/immutable.hpp> #include <mbgl/util/optional.hpp> +#include <mbgl/util/serializable.hpp> #include <mapbox/std/weak.hpp> #include <mapbox/util/type_wrapper.hpp> @@ -82,7 +83,7 @@ struct LayerTypeInfo { * * auto circleLayer = LayerManager::get()->createLayer("circle", ...); */ -class Layer { +class Layer : public Serializable { public: Layer(const Layer& ) = delete; Layer& operator=(const Layer&) = delete; @@ -114,7 +115,7 @@ public: optional<conversion::Error> setProperty(const std::string& name, const conversion::Convertible& value); virtual StyleProperty getProperty(const std::string&) const = 0; - virtual Value serialize() const; + Value serialize() const override; // Private implementation // TODO : We should not have public mutable data members. diff --git a/include/mbgl/style/source.hpp b/include/mbgl/style/source.hpp index 031803b4bf..324528a744 100644 --- a/include/mbgl/style/source.hpp +++ b/include/mbgl/style/source.hpp @@ -70,7 +70,7 @@ struct SourceTypeInfo { * * auto vectorSource = std::make_unique<VectorSource>("my-vector-source"); */ -class Source { +class Source : public Serializable { public: Source(const Source&) = delete; Source& operator=(const Source&) = delete; @@ -168,7 +168,7 @@ public: const SourceTypeInfo* getTypeInfo() const noexcept; - virtual Value serialize() const; + Value serialize() const override; protected: explicit Source(Immutable<Impl>); diff --git a/include/mbgl/style/transition_options.hpp b/include/mbgl/style/transition_options.hpp index 8ead79eb21..e78dddf01d 100644 --- a/include/mbgl/style/transition_options.hpp +++ b/include/mbgl/style/transition_options.hpp @@ -2,13 +2,12 @@ #include <mbgl/util/chrono.hpp> #include <mbgl/util/optional.hpp> - -#include <mapbox/compatibility/value.hpp> +#include <mbgl/util/serializable.hpp> namespace mbgl { namespace style { -class TransitionOptions { +class TransitionOptions : public Serializable { public: optional<Duration> duration; optional<Duration> delay; @@ -33,7 +32,7 @@ public: return duration || delay; } - mapbox::base::Value serialize() const { + mapbox::base::Value serialize() const final { mapbox::base::ValueObject result; if (duration) { result.emplace("duration", std::chrono::duration_cast<std::chrono::milliseconds>(*duration).count()); diff --git a/include/mbgl/util/color.hpp b/include/mbgl/util/color.hpp index 8a03abfcdb..63ade67bcf 100644 --- a/include/mbgl/util/color.hpp +++ b/include/mbgl/util/color.hpp @@ -1,7 +1,8 @@ #pragma once -#include <mbgl/util/optional.hpp> #include <mbgl/util/feature.hpp> +#include <mbgl/util/optional.hpp> +#include <mbgl/util/serializable.hpp> #include <cassert> #include <string> @@ -10,7 +11,7 @@ namespace mbgl { // Stores a premultiplied color, with all four channels ranging from 0..1 -class Color { +class Color : public Serializable { public: Color() = default; Color(float r_, float g_, float b_, float a_) @@ -41,7 +42,7 @@ public: std::string stringify() const; std::array<double, 4> toArray() const; mbgl::Value toObject() const; - mbgl::Value serialize() const; + mbgl::Value serialize() const final; }; inline bool operator==(const Color& colorA, const Color& colorB) { diff --git a/include/mbgl/util/serializable.hpp b/include/mbgl/util/serializable.hpp new file mode 100644 index 0000000000..2a977e3c3c --- /dev/null +++ b/include/mbgl/util/serializable.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include <mapbox/compatibility/value.hpp> + +namespace mbgl { + +using Value = mapbox::base::Value; + +class Serializable { +public: + virtual ~Serializable() = default; + virtual Value serialize() const = 0; +}; + +} // namespace mbgl |