00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _pthreadkey_h_
00021 #define _pthreadkey_h_
00022
00023 #include <pclasses/pexport.h>
00024
00025 namespace P {
00026
00028
00034 class PCORE_EXPORT ThreadKeyImpl {
00035 public:
00036 ThreadKeyImpl();
00037 virtual ~ThreadKeyImpl();
00038
00039 void set(void* ptr) throw();
00040 void* get() throw();
00041
00042 private:
00043 ThreadKeyImpl(const ThreadKeyImpl&);
00044 ThreadKeyImpl& operator=(const ThreadKeyImpl&);
00045
00046 struct key_handle_t;
00047 key_handle_t* m_handle;
00048 };
00049
00051
00055 template <class T>
00056 class ThreadKey: private ThreadKeyImpl {
00057 public:
00058 inline ThreadKey()
00059 : ThreadKeyImpl() {}
00060
00061 inline ThreadKey(const ThreadKey& k)
00062 : ThreadKeyImpl()
00063 { set(k.get()); }
00064
00065 inline ~ThreadKey() {}
00066
00067 inline ThreadKey& operator=(const ThreadKey& k)
00068 {
00069 set(k.get());
00070 return *this;
00071 }
00072
00073 ThreadKey& operator=(const T* val)
00074 {
00075 set((void*)val);
00076 return *this;
00077 }
00078
00079 operator T* ()
00080 { return (T*)get(); }
00081
00082 };
00083
00084 }
00085
00086 #endif