Listing 1: The TLS proxy class

#if !defined(XYZ_DataProxy_H)
#define XYZ_DataProxy_H

#include <assert.h>
#include <windows.h>

template <class T>
class DataProxy
{
public:
    DataProxy();
    ~DataProxy();
    void setData(T *data);
    T *operator->();
    T &operator*();

private:
    // We do not support copy semantics.
    DataProxy(const DataProxy &);
    DataProxy& operator = (const DataProxy &);
    DWORD tlsIndex;
};

template <class T>
inline DataProxy<T>::DataProxy()
{
    tlsIndex = TlsAlloc();
    assert(tlsIndex != 0xFFFFFFFF);
}

template <class T>
inline DataProxy<T>::~DataProxy()
{
    TlsFree(tlsIndex);    
}

template <class T>
inline void DataProxy<T>::setData(T *data)
{
    TlsSetValue(tlsIndex,data);
}

template <class T>
inline T* DataProxy<T>::operator->()
{
    return reinterpret_cast<T *>(TlsGetValue(tlsIndex));
}

template <class T>
inline T& DataProxy<T>::operator*()
{
    return *reinterpret_cast<T *>(TlsGetValue(tlsIndex));
}
#endif
— End of Listing —