#pragma once template class TLSHolder { public: TLSHolder () { Create (); } TLSHolder (T * from) { Create (from); } ~TLSHolder () { Close (); } public: static DWORD TLSIndex; protected: static T * Create () { void * p = TlsGetValue (TLSIndex); if (! p) { p = new T; C::Init ((T *) p); BOOL rc = TlsSetValue (TLSIndex, p); if (! rc) { #ifdef _DEBUG DWORD code = GetLastError (); #endif delete p; } } return Get (); } static T * Create (T * from) { void * p = TlsGetValue (TLSIndex); if (! p) { p = from->Clone (); // C::Init ((T *) p); BOOL rc = TlsSetValue (TLSIndex, p); if (! rc) { #ifdef _DEBUG DWORD code = GetLastError (); #endif delete p; } } return Get (); } static void Close () { T * p = Get (); delete p; BOOL rc = TlsSetValue (TLSIndex, 0); if (! rc) { #ifdef _DEBUG DWORD code = GetLastError (); putchar (' '); #endif } } public: static T * Get () { void * p = TlsGetValue (TLSIndex); return (T *) p; } };