00001 #ifndef PHX_ACCESSORS_H
00002 #define PHX_ACCESSORS_H
00003
00004 #include <Phx/PhxTypes.h>
00005 #include <Phx/Util/PhxLocks.h>
00006
00014 namespace Phx {
00015
00016
00077 template<class T>
00078 class LockedAccessor : public LockedPtrInterface<LockedAccessor<T> > {
00079 public:
00100 LockedAccessor(const T& data, Lock* lock) :
00101 mHolder(lock), mData(data) {}
00102
00116 LockedAccessor(const T& data, LockHolder* lockHolder) :
00117 mHolder(lockHolder), mData(data) {}
00118
00148 T& data() { return mData; }
00149
00150 private:
00151
00152 LockedAccessor(LockedAccessor<T>&);
00153 LockedAccessor<T>& operator=(LockedAccessor<T>&);
00154
00155 LockHolder mHolder;
00156 T mData;
00157 };
00158
00159
00186 template<class T>
00187 class ReadLockedAccessor : public LockedPtrInterface<ReadLockedAccessor<T> > {
00188 public:
00208 ReadLockedAccessor(const T& data, ReadWriteLock* lock) :
00209 mHolder(lock), mData(data) {}
00210
00225 ReadLockedAccessor(const T& data, ReadLockHolder* lockHolder) :
00226 mHolder(lockHolder), mData(data) {}
00227
00243 T& data() { return mData; }
00244
00245 private:
00246
00247 ReadLockedAccessor(ReadLockedAccessor<T>&);
00248 ReadLockedAccessor<T>& operator=(ReadLockedAccessor<T>&);
00249
00250 ReadLockHolder mHolder;
00251 T mData;
00252 };
00253
00254
00281 template<class T>
00282 class WriteLockedAccessor : public LockedPtrInterface<WriteLockedAccessor<T> > {
00283 public:
00303 WriteLockedAccessor(const T& data, ReadWriteLock* lock) :
00304 mHolder(lock), mData(data) {}
00305
00320 WriteLockedAccessor(const T& data, WriteLockHolder* lockHolder) :
00321 mHolder(lockHolder), mData(data) {}
00322
00338 T& data() { return mData; }
00339
00340 private:
00341
00342 WriteLockedAccessor(WriteLockedAccessor<T>&);
00343 WriteLockedAccessor<T>& operator=(WriteLockedAccessor<T>&);
00344
00345 WriteLockHolder mHolder;
00346 T mData;
00347 };
00348
00349 };
00350
00351 #endif