#pragma once namespace sprawl { namespace threading { template class ThreadLocal; } } #ifdef _WIN32 # include #else # include #endif template class sprawl::threading::ThreadLocal { public: ThreadLocal(); ThreadLocal(T const& value); ~ThreadLocal(); void operator=(T const& value); T& operator*(); T const& operator*() const; T* operator->(); T const* operator->() const; operator bool() const; private: T* get(); T const* get() const; void set(T const& value); #ifdef _WIN32 typedef DWORD KeyType; #else typedef pthread_key_t KeyType; #endif KeyType m_key; }; template class sprawl::threading::ThreadLocal { public: ThreadLocal(); ThreadLocal(T const* value); ~ThreadLocal(); void operator=(T const* value); T* operator*(); T const* operator*() const; T* operator->(); T const* operator->() const; operator bool() const; private: T* get(); T const* get() const; void set(T const* value); #ifdef _WIN32 typedef DWORD KeyType; #else typedef pthread_key_t KeyType; #endif KeyType m_key; }; template void sprawl::threading::ThreadLocal::operator=(T const& value) { set(value); } template T& sprawl::threading::ThreadLocal::operator*() { return *get(); } template T const& sprawl::threading::ThreadLocal::operator*() const { return *get(); } template T* sprawl::threading::ThreadLocal::operator->() { return get(); } template T const* sprawl::threading::ThreadLocal::operator->() const { return get(); } template sprawl::threading::ThreadLocal::operator bool() const { return get() != nullptr; } template void sprawl::threading::ThreadLocal::operator=(T const* value) { set(value); } template T* sprawl::threading::ThreadLocal::operator*() { return get(); } template T const* sprawl::threading::ThreadLocal::operator*() const { return get(); } template T* sprawl::threading::ThreadLocal::operator->() { return get(); } template T const* sprawl::threading::ThreadLocal::operator->() const { return get(); } template sprawl::threading::ThreadLocal::operator bool() const { return get() != nullptr; } #ifdef _WIN32 # include "threadlocal_windows.inl" #else # include "threadlocal_linux.inl" #endif