00001 #ifndef NO_PTR_CONTEXTS_H
00002 #define NO_PTR_CONTEXTS_H
00003
00023 #include "SegmentNode.hh"
00024 #include "ChainNode.hh"
00025
00026 namespace NoPtr
00027 {
00028 namespace NoPtrImpl
00029 {
00030
00031
00032
00033
00034
00035
00036 class DefaultDynObjContext
00037 {
00038 protected:
00039 DefaultDynObjContext() {}
00040 ~DefaultDynObjContext() {}
00041
00042 bool soleOwner() const {return true;}
00043 void swap(DefaultDynObjContext&) {}
00044
00045
00046
00047 private:
00048 void operator=(const DefaultDynObjContext&);
00049 DefaultDynObjContext(const DefaultDynObjContext&);
00050 };
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 template <class ChainType>
00063 class InValueContainer
00064 {
00065 protected:
00066 InValueContainer() {}
00067 ~InValueContainer() {}
00068 InValueContainer(const InValueContainer& rhs)
00069 : _chainNode(rhs._chainNode) {}
00070 InValueContainer& operator=(const InValueContainer& rhs)
00071 {
00072 _chainNode.connect(rhs._chainNode);
00073 return *this;
00074 }
00075 void swap(InValueContainer& rhs)
00076 {
00077 _chainNode.swap(rhs._chainNode);
00078 }
00079
00080
00081 bool soleOwner() const {return ! _chainNode.isConnected();}
00082
00083
00084 static void checkCopyable() {}
00085
00086 private:
00087
00088 mutable ChainType _chainNode;
00089 };
00090
00091 typedef size_t RefCount;
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 template <>
00109 class InValueContainer<RefCount>
00110 {
00111 protected:
00112 InValueContainer(): _sharedOwnerCount(new RefCount(1)) {}
00113 InValueContainer(const InValueContainer& rhs)
00114 : _sharedOwnerCount(rhs._sharedOwnerCount)
00115 {
00116 (*_sharedOwnerCount) ++;
00117 }
00118 void operator=(const InValueContainer& rhs)
00119 {
00120 clearCount();
00121 _sharedOwnerCount = rhs._sharedOwnerCount;
00122 (*_sharedOwnerCount) ++;
00123 }
00124
00125 ~InValueContainer()
00126 {
00127 clearCount();
00128 }
00129
00130 void swap(InValueContainer& rhs)
00131 {
00132 std::swap(_sharedOwnerCount, rhs._sharedOwnerCount);
00133 }
00134
00135 bool soleOwner() const
00136 {
00137 return ((*_sharedOwnerCount) == 1);
00138 }
00139
00140
00141 static void checkCopyable() {}
00142
00143 private:
00144 void clearCount()
00145 {
00146 if ((--(*_sharedOwnerCount)) <= 0)
00147 delete _sharedOwnerCount;
00148 }
00149
00150 private:
00151 RefCount* _sharedOwnerCount;
00152 };
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 template <>
00163 class InValueContainer<void>
00164 {
00165 protected:
00166 InValueContainer(): _sharedOwnerCount(NullPtr) {}
00167 InValueContainer(const InValueContainer& rhs)
00168 : _sharedOwnerCount(rhs.getCount())
00169 {
00170 (*_sharedOwnerCount) ++;
00171 }
00172 void operator=(const InValueContainer& rhs)
00173 {
00174 clearCount();
00175 _sharedOwnerCount = rhs.getCount();
00176 (*_sharedOwnerCount) ++;
00177 }
00178
00179 ~InValueContainer()
00180 {
00181 clearCount();
00182 }
00183
00184 void swap(InValueContainer& rhs)
00185 {
00186 std::swap(_sharedOwnerCount, rhs._sharedOwnerCount);
00187 }
00188
00189 bool soleOwner() const
00190 {
00191 return ((_sharedOwnerCount == NullPtr)
00192 || (*_sharedOwnerCount) == 1);
00193 }
00194
00195
00196 static void checkCopyable() {}
00197
00198 private:
00199 RefCount* getCount() const
00200 {
00201 if (!_sharedOwnerCount)
00202 const_cast<RefCount*&>(_sharedOwnerCount) = new RefCount(1);
00203
00204 return _sharedOwnerCount;
00205 }
00206 void clearCount()
00207 {
00208 if (_sharedOwnerCount && (--(*_sharedOwnerCount)) <= 0)
00209 delete _sharedOwnerCount;
00210 }
00211
00212 private:
00213 RefCount* _sharedOwnerCount;
00214 };
00215
00216 }
00217
00218 }
00219
00220 #endif // NO_PTR_CONTEXTS_H