00001 #ifndef __INSTANTIO_SMARTPTR_H
00002 #define __INSTANTIO_SMARTPTR_H
00003
00004 #ifdef _MSC_VER
00005 # pragma once
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "InstantIODef.h"
00027 #include "RefCtr.h"
00028 #include "Cache.h"
00029
00030
00031 namespace InstantIO
00032 {
00033
00034
00040 template <class T> class SmartPtr
00041 {
00042 public:
00043
00045
00048 inline SmartPtr(): refCtr_(0), cache_(0) {}
00049
00051
00054 inline SmartPtr(const SmartPtr &other)
00055 : refCtr_(other.refCtr_), cache_(other.cache_)
00056 { incrementReferenceCounter(); }
00057
00059
00062 inline ~SmartPtr()
00063 { decrementReferenceCounter(); }
00064
00066
00071 inline const SmartPtr<T> &operator=(const SmartPtr<T> &other)
00072 {
00073 if (this != &other)
00074 {
00075 decrementReferenceCounter();
00076 refCtr_ = other.refCtr_;
00077 cache_ = other.cache_;
00078 incrementReferenceCounter();
00079 }
00080 return *this;
00081 }
00082
00084
00088 inline const T &operator*() const
00089 {
00090
00091
00092 assert(refCtr_ != 0);
00093 return refCtr_->getValue();
00094 }
00095
00097
00100 inline T &operator*()
00101 {
00102 if (refCtr_ == 0)
00103 acquire();
00104 return refCtr_->getValue();
00105 }
00106
00108
00112 inline const T *operator->() const
00113 {
00114
00115
00116 assert(refCtr_ != 0);
00117 return &(refCtr_->getValue());
00118 }
00119
00121
00124 inline T *operator->()
00125 {
00126 if (refCtr_ == 0)
00127 acquire();
00128 return &(refCtr_->getValue());
00129 }
00130
00132
00136 inline void newObject()
00137 {
00138 decrementReferenceCounter();
00139 refCtr_ = 0;
00140 cache_ = 0;
00141 }
00142
00143 private:
00144
00146 RefCtr<T> *refCtr_;
00147
00149
00150 Cache<T> *cache_;
00151
00153 void acquire()
00154 {
00155 cache_ = &(Cache<T>::the());
00156 refCtr_ = cache_->acquire();
00157 refCtr_->incrementReferenceCounter();
00158 };
00159
00161 inline void incrementReferenceCounter()
00162 {
00163 if (refCtr_ != 0)
00164 refCtr_->incrementReferenceCounter();
00165 }
00166
00168 inline void decrementReferenceCounter()
00169 {
00170 if ((refCtr_ != 0) && (refCtr_->decrementReferenceCounter() == 0))
00171 cache_->release(refCtr_);
00172 }
00173 };
00174
00175
00176 }
00177
00178
00179 #endif // __INSTANTIO_SMARTPTR_H