1 #ifndef SimTK_PRIVATE_IMPLEMENTATION_DEFS_H_
2 #define SimTK_PRIVATE_IMPLEMENTATION_DEFS_H_
52 template <
class HANDLE,
class IMPL>
56 template <
class HANDLE,
class IMPL>
61 template <
class HANDLE,
class IMPL>
66 template <
class HANDLE,
class IMPL>
68 assert(handleCount>=1);
return --handleCount;
71 template <
class HANDLE,
class IMPL>
73 assert(handleCount==0); ownerHandle=0;
76 template <
class HANDLE,
class IMPL>
80 template <
class HANDLE,
class IMPL>
83 ownerHandle=0, handleCount=0;
87 template <
class HANDLE,
class IMPL>
89 assert(!hasOwnerHandle());
91 incrementHandleCount();
94 template <
class HANDLE,
class IMPL>
96 assert(hasOwnerHandle());
98 return decrementHandleCount();
101 template <
class HANDLE,
class IMPL>
103 assert(hasOwnerHandle());
107 template <
class HANDLE,
class IMPL>
109 return ownerHandle != 0;
112 template <
class HANDLE,
class IMPL>
114 return hasOwnerHandle() && ownerHandle==&p;
117 template <
class HANDLE,
class IMPL>
119 assert(hasOwnerHandle());
127 template <
class HANDLE,
class IMPL,
bool PTR>
131 if (impl) impl->setOwnerHandle(updDowncastToHandle());
135 template <
class HANDLE,
class IMPL,
bool PTR>
142 template <
class HANDLE,
class IMPL,
bool PTR>
149 template <
class HANDLE,
class IMPL,
bool PTR>
152 if (PTR) referenceAssign(src.downcastToHandle());
153 else copyAssign(src.downcastToHandle());
157 template <
class HANDLE,
class IMPL,
bool PTR>
159 return impl && impl->hasOwnerHandle() &&
160 static_cast<const PIMPLHandle*
>(&impl->getOwnerHandle()) ==
this;
163 template <
class HANDLE,
class IMPL,
bool PTR>
165 return static_cast<const PIMPLHandle*
>(&other) ==
this;
169 template <
class HANDLE,
class IMPL,
bool PTR>
171 return impl && (impl==other.impl);
176 template <
class HANDLE,
class IMPL,
bool PTR>
179 assert(!isSameHandle(newOwner));
180 assert(!this->isEmptyHandle() && newOwner.isEmptyHandle());
181 newOwner.impl = impl;
182 impl->replaceOwnerHandle(newOwner);
184 impl->incrementHandleCount();
191 template <
class HANDLE,
class IMPL,
bool PTR>
194 assert(!isOwnerHandle());
195 if (!hasSameImplementation(src)) {
199 impl->incrementHandleCount();
208 template <
class HANDLE,
class IMPL,
bool PTR>
211 if (isSameHandle(src))
return *
this;
214 impl = src.impl->clone();
215 impl->setOwnerHandle(updDowncastToHandle());
216 assert(impl->getHandleCount() == 1);
224 template <
class HANDLE,
class IMPL,
bool PTR>
227 assert(isEmptyHandle());
229 impl->incrementHandleCount();
236 template <
class HANDLE,
class IMPL,
bool PTR>
239 if (isEmptyHandle())
return;
240 const int nHandlesLeft =
241 isOwnerHandle() ? impl->removeOwnerHandle()
242 : impl->decrementHandleCount();
243 if (nHandlesLeft == 0)
248 template <
class HANDLE,
class IMPL,
bool PTR>
251 assert(!isEmptyHandle());
252 return impl->getHandleCount();
259 template <
class HANDLE,
class IMPL,
bool PTR>
260 std::ostream& operator<<(std::ostream& o, const PIMPLHandle<HANDLE,IMPL,PTR>& h) {
261 o <<
"PIMPLHandle<" <<
typeid(HANDLE).name() <<
"," <<
typeid(IMPL).name() <<
"> @" << &h;
262 if (h.isEmptyHandle())
263 return o <<
" is EMPTY." << std::endl;
265 if (h.isOwnerHandle()) o <<
" is OWNER of";
266 else o <<
" is REFERENCE to";
268 return o <<
" Implementation @" << &h.getImpl() <<
" (handle count=" << h.getImpl().getHandleCount() <<
")" << std::endl;
274 #endif // SimTK_PRIVATE_IMPLEMENTATION_DEFS_H_