summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-05-06 13:45:24 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2020-05-26 20:35:04 +0300
commit40adc001eb9b97055ad139b431a8f286dece932d (patch)
tree95a90d4c0e06d8f3fe26e920b8123f2ed0ee05e3
parentba876236a1afe163a57edb82170b307790e1420a (diff)
downloadqtlocation-mapboxgl-40adc001eb9b97055ad139b431a8f286dece932d.tar.gz
[core] Introduce Serializable
-rw-r--r--CMakeLists.txt1
-rw-r--r--include/mbgl/style/color_ramp_property_value.hpp9
-rw-r--r--include/mbgl/style/conversion_impl.hpp21
-rw-r--r--include/mbgl/style/expression/expression.hpp8
-rw-r--r--include/mbgl/style/filter.hpp14
-rw-r--r--include/mbgl/style/layer.hpp5
-rw-r--r--include/mbgl/style/source.hpp4
-rw-r--r--include/mbgl/style/transition_options.hpp7
-rw-r--r--include/mbgl/util/color.hpp7
-rw-r--r--include/mbgl/util/serializable.hpp15
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