summaryrefslogtreecommitdiff
path: root/src/mbgl/util/thread_local.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/util/thread_local.hpp')
-rw-r--r--src/mbgl/util/thread_local.hpp38
1 files changed, 25 insertions, 13 deletions
diff --git a/src/mbgl/util/thread_local.hpp b/src/mbgl/util/thread_local.hpp
index b0e26356b4..cf5579a2ba 100644
--- a/src/mbgl/util/thread_local.hpp
+++ b/src/mbgl/util/thread_local.hpp
@@ -1,29 +1,41 @@
#pragma once
-#include <mbgl/util/noncopyable.hpp>
-
-#include <memory>
+#include <type_traits>
namespace mbgl {
namespace util {
+namespace impl {
+
+class ThreadLocalBase {
+protected:
+ ThreadLocalBase();
+ ~ThreadLocalBase();
+
+ void* get();
+ void set(void*);
+
+private:
+ std::aligned_storage_t<sizeof(void*), alignof(void*)> storage;
+};
+
+} // namespace impl
template <class T>
-class ThreadLocal : public noncopyable {
+class ThreadLocal : public impl::ThreadLocalBase {
public:
+ ThreadLocal() = default;
+
ThreadLocal(T* val) {
- ThreadLocal();
set(val);
}
- ThreadLocal();
- ~ThreadLocal();
-
- T* get();
- void set(T* ptr);
+ T* get() {
+ return reinterpret_cast<T*>(impl::ThreadLocalBase::get());
+ }
-private:
- class Impl;
- std::unique_ptr<Impl> impl;
+ void set(T* ptr) {
+ impl::ThreadLocalBase::set(ptr);
+ }
};
} // namespace util