template sprawl::threading::ThreadLocal::ThreadLocal() { m_key = TlsAlloc(); } template sprawl::threading::ThreadLocal::ThreadLocal(T const& value) { m_key = TlsAlloc(); set(value); } template sprawl::threading::ThreadLocal::~ThreadLocal() { TlsFree(m_key); } template T* sprawl::threading::ThreadLocal::get() { return reinterpret_cast(TlsGetValue(m_key)); } template T const* sprawl::threading::ThreadLocal::get() const { return reinterpret_cast(TlsGetValue(m_key)); } template void sprawl::threading::ThreadLocal::set(T const& value) { T* oldValue = reinterpret_cast(TlsGetValue(m_key)); if(oldValue) { *oldValue = value; } else { TlsSetValue(m_key, (void*)(new T(value))); } } template sprawl::threading::ThreadLocal::ThreadLocal() { m_key = TlsAlloc(); } template sprawl::threading::ThreadLocal::ThreadLocal(T const* value) { m_key = TlsAlloc(); set(value); } template sprawl::threading::ThreadLocal::~ThreadLocal() { TlsFree(m_key); } template T* sprawl::threading::ThreadLocal::get() { return reinterpret_cast(TlsGetValue(m_key)); } template T const* sprawl::threading::ThreadLocal::get() const { return reinterpret_cast(TlsGetValue(m_key)); } template void sprawl::threading::ThreadLocal::set(T const* value) { TlsSetValue(m_key, (void*)(value)); }