From e989478b27598cfac60a0ee20d1d5cef71d8accb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Fri, 27 Jun 2014 15:53:12 +0200 Subject: [PATCH] add class dictionary to avoid storing strings all the time --- include/llmr/style/class_dictionary.hpp | 32 +++++++++++++++++++++++++ src/style/class_dictionary.cpp | 29 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 include/llmr/style/class_dictionary.hpp create mode 100644 src/style/class_dictionary.cpp diff --git a/include/llmr/style/class_dictionary.hpp b/include/llmr/style/class_dictionary.hpp new file mode 100644 index 000000000..772eb9c70 --- /dev/null +++ b/include/llmr/style/class_dictionary.hpp @@ -0,0 +1,32 @@ +#ifndef LLMR_STYLE_CLASS_DICTIONARY +#define LLMR_STYLE_CLASS_DICTIONARY + +#include +#include +#include + +namespace llmr { + +enum class ClassID : uint32_t { + Fallback = 0, // These values are from the fallback properties + Default = 1, // These values are from the default style for a layer + Named = 2 // These values (and all subsequent IDs) are from a named style from the layer +}; + +class ClassDictionary { +public: + // Returns an ID for a class name. If the class name does not yet have an ID, one is + // auto-generated and stored for future reference. + static ClassID Lookup(const std::string &class_name); + + // Returns either Fallback, Default or Named, depending on the type of the class id. + static ClassID Normalize(ClassID id); + +private: + static std::unordered_map store; + static uint32_t offset; +}; + +} + +#endif diff --git a/src/style/class_dictionary.cpp b/src/style/class_dictionary.cpp new file mode 100644 index 000000000..a641295c6 --- /dev/null +++ b/src/style/class_dictionary.cpp @@ -0,0 +1,29 @@ +#include + +namespace llmr { + +ClassID ClassDictionary::Lookup(const std::string &class_name) { + auto it = store.find(class_name); + if (it == store.end()) { + // Insert the class name into the store. + ClassID id = ClassID(uint32_t(ClassID::Named) + offset++); + store.emplace(class_name, id); + return id; + } else { + return it->second; + } +} + +ClassID ClassDictionary::Normalize(ClassID id) { + if (id >= ClassID::Named) { + return ClassID::Named; + } else { + return id; + } +} + + +std::unordered_map ClassDictionary::store = { { "", ClassID::Default } }; +uint32_t ClassDictionary::offset = 0; + +}