38 #ifndef BLOCXX_COWREFERENCE_HPP_INCLUDE_GUARD_
39 #define BLOCXX_COWREFERENCE_HPP_INCLUDE_GUARD_
40 #include "blocxx/BLOCXX_config.h"
54 class COWReference :
private COWReferenceBase
104 COWReference<T>&
operator= (
const COWReference<T>& arg);
153 #if !defined(__GNUC__) || __GNUC__ > 2 // causes gcc 2.95 to ICE
204 typedef char type_must_be_complete[
sizeof(T)];
205 if (COWReferenceBase::decRef())
216 if (COWReferenceBase::refCountGreaterThanOne())
222 if (COWReferenceBase::getWriteLock())
234 inline COWReference<T>& COWReference<T>::operator= (
const COWReference<T>& arg)
236 COWReference<T>(arg).swap(*
this);
241 inline COWReference<T>& COWReference<T>::operator= (T* newObj)
243 COWReference<T>(newObj).swap(*
this);
255 inline T* COWReference<T>::operator->()
257 #ifdef BLOCXX_CHECK_NULL_REFERENCES
258 ReferenceHelpers::checkNull(
this);
259 ReferenceHelpers::checkNull(m_pObj);
269 #ifdef BLOCXX_CHECK_NULL_REFERENCES
270 ReferenceHelpers::checkNull(
this);
271 ReferenceHelpers::checkNull(m_pObj);
281 #ifdef BLOCXX_CHECK_NULL_REFERENCES
282 ReferenceHelpers::checkNull(
this);
283 ReferenceHelpers::checkNull(m_pObj);
292 #ifdef BLOCXX_CHECK_NULL_REFERENCES
293 ReferenceHelpers::checkNull(
this);
294 ReferenceHelpers::checkNull(m_pObj);
307 inline bool COWReference<T>::isNull()
const
309 return (m_pObj == 0);
318 rval.m_pObj =
dynamic_cast<U*
>(m_pObj);
321 rval.useRefCountOf(*
this);
329 COWReference<T>::useRefCountOf(
const COWReference<U>& arg)
331 COWReferenceBase::useRefCountOf(arg);
335 template <
class T,
class U>
338 return a.getPtr() == b.getPtr();
341 template <
class T,
class U>
344 return a.getPtr() != b.getPtr();
347 template <
class T,
class U>
350 return a.getPtr() < b.getPtr();
364 #endif // BLOCXX_COWREFERENCE_HPP_