#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