diff options
Diffstat (limited to 'src/mbgl/style/group_by_layout.cpp')
-rw-r--r-- | src/mbgl/style/group_by_layout.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/mbgl/style/group_by_layout.cpp b/src/mbgl/style/group_by_layout.cpp new file mode 100644 index 0000000000..52d33827ef --- /dev/null +++ b/src/mbgl/style/group_by_layout.cpp @@ -0,0 +1,51 @@ +#include <mbgl/style/group_by_layout.hpp> +#include <mbgl/style/layer.hpp> +#include <mbgl/style/layer_impl.hpp> +#include <mbgl/style/conversion/stringify.hpp> +#include <mbgl/util/rapidjson.hpp> + +#include <rapidjson/writer.h> +#include <rapidjson/stringbuffer.h> + +#include <unordered_map> + +namespace mbgl { +namespace style { + +std::string layoutKey(const Layer& layer) { + using namespace conversion; + + rapidjson::StringBuffer s; + rapidjson::Writer<rapidjson::StringBuffer> writer(s); + + writer.StartArray(); + writer.Uint(static_cast<uint32_t>(layer.type)); + writer.String(layer.baseImpl->source); + writer.String(layer.baseImpl->sourceLayer); + writer.Double(layer.baseImpl->minZoom); + writer.Double(layer.baseImpl->maxZoom); + writer.Uint(static_cast<uint32_t>(layer.baseImpl->visibility)); + stringify(writer, layer.baseImpl->filter); + layer.baseImpl->stringifyLayout(writer); + writer.EndArray(); + + return s.GetString(); +} + +std::vector<std::vector<std::unique_ptr<Layer>>> groupByLayout(std::vector<std::unique_ptr<Layer>> layers) { + std::unordered_map<std::string, std::vector<std::unique_ptr<Layer>>> map; + for (auto& layer : layers) { + auto& vector = map[layoutKey(*layer)]; + vector.push_back(std::move(layer)); + } + + std::vector<std::vector<std::unique_ptr<Layer>>> result; + for (auto& pair : map) { + result.push_back(std::move(pair.second)); + } + + return result; +} + +} // namespace style +} // namespace mbgl |