From 0a0007e0acdce85576857bec76e1333d771472f1 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 4 Dec 2015 15:19:12 -0800 Subject: [PATCH] [core] More efficient layer cloning --- src/mbgl/layer/background_layer.cpp | 5 +---- src/mbgl/layer/circle_layer.cpp | 5 +---- src/mbgl/layer/fill_layer.cpp | 5 +---- src/mbgl/layer/line_layer.cpp | 6 +----- src/mbgl/layer/raster_layer.cpp | 5 +---- src/mbgl/layer/symbol_layer.cpp | 7 +------ src/mbgl/style/paint_property.hpp | 16 +++++----------- src/mbgl/style/style_layer.cpp | 12 ------------ src/mbgl/style/style_layer.hpp | 8 +++++--- test/style/style_layer.cpp | 24 ++++++++++++++++++++++++ test/test.gypi | 1 + 11 files changed, 41 insertions(+), 53 deletions(-) create mode 100644 test/style/style_layer.cpp diff --git a/src/mbgl/layer/background_layer.cpp b/src/mbgl/layer/background_layer.cpp index f3ea723b3..cea4c2c9b 100644 --- a/src/mbgl/layer/background_layer.cpp +++ b/src/mbgl/layer/background_layer.cpp @@ -4,10 +4,7 @@ namespace mbgl { std::unique_ptr BackgroundLayer::clone() const { - std::unique_ptr result = std::make_unique(); - result->copy(*this); - result->paint = paint; - return std::move(result); + return std::make_unique(*this); } void BackgroundLayer::parsePaints(const JSVal& layer) { diff --git a/src/mbgl/layer/circle_layer.cpp b/src/mbgl/layer/circle_layer.cpp index 7559a0328..900172343 100644 --- a/src/mbgl/layer/circle_layer.cpp +++ b/src/mbgl/layer/circle_layer.cpp @@ -5,10 +5,7 @@ namespace mbgl { std::unique_ptr CircleLayer::clone() const { - std::unique_ptr result = std::make_unique(); - result->copy(*this); - result->paint = paint; - return std::move(result); + return std::make_unique(*this); } void CircleLayer::parsePaints(const JSVal& layer) { diff --git a/src/mbgl/layer/fill_layer.cpp b/src/mbgl/layer/fill_layer.cpp index c2b922755..cde5c2683 100644 --- a/src/mbgl/layer/fill_layer.cpp +++ b/src/mbgl/layer/fill_layer.cpp @@ -5,10 +5,7 @@ namespace mbgl { std::unique_ptr FillLayer::clone() const { - std::unique_ptr result = std::make_unique(); - result->copy(*this); - result->paint = paint; - return std::move(result); + return std::make_unique(*this); } void FillLayer::parsePaints(const JSVal& layer) { diff --git a/src/mbgl/layer/line_layer.cpp b/src/mbgl/layer/line_layer.cpp index 1e25ed30c..136721fb0 100644 --- a/src/mbgl/layer/line_layer.cpp +++ b/src/mbgl/layer/line_layer.cpp @@ -6,11 +6,7 @@ namespace mbgl { std::unique_ptr LineLayer::clone() const { - std::unique_ptr result = std::make_unique(); - result->copy(*this); - result->layout = layout; - result->paint = paint; - return std::move(result); + return std::make_unique(*this); } void LineLayer::parseLayout(const JSVal& value) { diff --git a/src/mbgl/layer/raster_layer.cpp b/src/mbgl/layer/raster_layer.cpp index 87199f24f..3ce9ed36e 100644 --- a/src/mbgl/layer/raster_layer.cpp +++ b/src/mbgl/layer/raster_layer.cpp @@ -4,10 +4,7 @@ namespace mbgl { std::unique_ptr RasterLayer::clone() const { - std::unique_ptr result = std::make_unique(); - result->copy(*this); - result->paint = paint; - return std::move(result); + return std::make_unique(*this); } void RasterLayer::parsePaints(const JSVal& layer) { diff --git a/src/mbgl/layer/symbol_layer.cpp b/src/mbgl/layer/symbol_layer.cpp index c7b4824de..dd810941d 100644 --- a/src/mbgl/layer/symbol_layer.cpp +++ b/src/mbgl/layer/symbol_layer.cpp @@ -6,12 +6,7 @@ namespace mbgl { std::unique_ptr SymbolLayer::clone() const { - std::unique_ptr result = std::make_unique(); - result->copy(*this); - result->layout = layout; - result->paint = paint; - result->spriteAtlas = spriteAtlas; - return std::move(result); + return std::make_unique(*this); } void SymbolLayer::parseLayout(const JSVal& value) { diff --git a/src/mbgl/style/paint_property.hpp b/src/mbgl/style/paint_property.hpp index 710ce34a4..f6ab430ed 100644 --- a/src/mbgl/style/paint_property.hpp +++ b/src/mbgl/style/paint_property.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -23,9 +24,8 @@ class PaintProperty { public: using Fn = Function; - PaintProperty(T fallbackValue_) - : fallbackValue(fallbackValue_), - value(fallbackValue_) { + PaintProperty(T fallbackValue) + : value(fallbackValue) { values.emplace(ClassID::Fallback, Fn(fallbackValue)); } @@ -34,14 +34,8 @@ public: transitions(other.transitions) { } - void operator=(const PaintProperty& other) { - values = other.values; - transitions = other.transitions; - } - void parse(const char* name, const JSVal& layer) { - values.clear(); - values.emplace(ClassID::Fallback, Fn(fallbackValue)); + mbgl::util::erase_if(values, [] (const auto& p) { return p.first != ClassID::Fallback; }); std::string transitionName = { name }; transitionName += "-transition"; @@ -104,9 +98,9 @@ public: return cascaded->prior.operator bool(); } + void operator=(const T& v) { values.emplace(ClassID::Default, Fn(v)); } operator T() const { return value; } - T fallbackValue; std::map values; std::map transitions; diff --git a/src/mbgl/style/style_layer.cpp b/src/mbgl/style/style_layer.cpp index 3220a018a..4c8503b43 100644 --- a/src/mbgl/style/style_layer.cpp +++ b/src/mbgl/style/style_layer.cpp @@ -35,16 +35,4 @@ bool StyleLayer::hasRenderPass(RenderPass pass) const { return bool(passes & pass); } -void StyleLayer::copy(const StyleLayer& src) { - id = src.id; - ref = src.ref; - type = src.type; - source = src.source; - sourceLayer = src.sourceLayer; - filter = src.filter; - minZoom = src.minZoom; - maxZoom = src.maxZoom; - visibility = src.visibility; -} - } // namespace mbgl diff --git a/src/mbgl/style/style_layer.hpp b/src/mbgl/style/style_layer.hpp index ec29cc679..49c3355f6 100644 --- a/src/mbgl/style/style_layer.hpp +++ b/src/mbgl/style/style_layer.hpp @@ -21,7 +21,7 @@ class Bucket; using JSVal = rapidjson::Value; -class StyleLayer : public util::noncopyable { +class StyleLayer { public: static std::unique_ptr create(StyleLayerType); virtual std::unique_ptr clone() const = 0; @@ -58,11 +58,13 @@ public: VisibilityType visibility = VisibilityType::Visible; protected: + StyleLayer() = default; + StyleLayer(const StyleLayer&) = default; + StyleLayer& operator=(const StyleLayer&) = delete; + // Stores what render passes this layer is currently enabled for. This depends on the // evaluated StyleProperties object and is updated accordingly. RenderPass passes = RenderPass::None; - - void copy(const StyleLayer& source); }; } // namespace mbgl diff --git a/test/style/style_layer.cpp b/test/style/style_layer.cpp new file mode 100644 index 000000000..d005371fe --- /dev/null +++ b/test/style/style_layer.cpp @@ -0,0 +1,24 @@ +#include "../fixtures/util.hpp" + +#include +#include + +using namespace mbgl; + +TEST(StyleLayer, Create) { + std::unique_ptr layer = StyleLayer::create(StyleLayerType::Background); + EXPECT_TRUE(reinterpret_cast(layer.get())); +} + +TEST(StyleLayer, Clone) { + std::unique_ptr layer = StyleLayer::create(StyleLayerType::Background); + std::unique_ptr clone = layer->clone(); + EXPECT_NE(layer.get(), clone.get()); + EXPECT_TRUE(reinterpret_cast(layer.get())); +} + +TEST(StyleLayer, CloneCopiesBaseProperties) { + std::unique_ptr layer = std::make_unique(); + layer->id = "test"; + EXPECT_EQ("test", layer->clone()->id); +} diff --git a/test/test.gypi b/test/test.gypi index 708b89e74..2188ed905 100644 --- a/test/test.gypi +++ b/test/test.gypi @@ -91,6 +91,7 @@ 'style/glyph_store.cpp', 'style/pending_resources.cpp', 'style/resource_loading.cpp', + 'style/style_layer.cpp', 'sprite/sprite_atlas.cpp', 'sprite/sprite_image.cpp',