summaryrefslogtreecommitdiff
path: root/src/mbgl/style/class_dictionary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/class_dictionary.cpp')
-rw-r--r--src/mbgl/style/class_dictionary.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/mbgl/style/class_dictionary.cpp b/src/mbgl/style/class_dictionary.cpp
new file mode 100644
index 0000000000..ba7c0d55be
--- /dev/null
+++ b/src/mbgl/style/class_dictionary.cpp
@@ -0,0 +1,51 @@
+#include <mbgl/style/class_dictionary.hpp>
+
+#include <uv.h>
+
+namespace mbgl {
+
+ClassDictionary::ClassDictionary() {}
+
+ClassDictionary &ClassDictionary::Get() {
+ // Note: We should eventually switch to uv_key_* functions, but libuv 0.10 doesn't have these
+ // yet. Instead, we're using the pthread functions directly for now.
+ static pthread_once_t store_once = PTHREAD_ONCE_INIT;
+ static pthread_key_t store_key;
+
+ // Create the key.
+ pthread_once(&store_once, []() {
+ pthread_key_create(&store_key, [](void *ptr) {
+ delete reinterpret_cast<ClassDictionary *>(ptr);
+ });
+ });
+
+ ClassDictionary *ptr = reinterpret_cast<ClassDictionary *>(pthread_getspecific(store_key));
+ if (ptr == nullptr) {
+ ptr = new ClassDictionary();
+ pthread_setspecific(store_key, ptr);
+ }
+
+ return *ptr;
+}
+
+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;
+ }
+}
+
+}