7#include "acme/include/_forward_declaration.h"
9#include "acme/platform/platform.h"
12#if REFERENCING_DEBUGGING
13#include "acme/platform/reference_item.h"
14#include "acme/platform/reference_item_array.h"
15CLASS_DECL_ACME::critical_section * refdbg_cs();
24inline pointer < T > ::pointer() :
26 m_psubparticle(nullptr)
27#if REFERENCING_DEBUGGING
36inline pointer < T > ::pointer(nullptr_t):
38 m_psubparticle(nullptr)
39#if REFERENCING_DEBUGGING
48template <
typename T2 >
49inline pointer < T > ::pointer(
place_t, T2 * p)
52#if REFERENCING_DEBUGGING
61 auto pNew =
dynamic_cast < T *
> (p);
70 m_psubparticle =
nullptr;
72 throw_resource_exception(
"OBJECT * p is not of type T (pointer < T >).");
82#if REFERENCING_DEBUGGING
84 if (m_psubparticle->is_referencing_debugging_enabled())
87 if(m_psubparticle->m_prefererTransfer2)
90 m_preferer = m_psubparticle->m_prefererTransfer2;
92 m_psubparticle->m_prefererTransfer2 =
nullptr;
95 else if(m_psubparticle->m_prefererLast2)
98 m_preferer = m_psubparticle->m_prefererLast2;
100 m_psubparticle->m_prefererLast2 =
nullptr;
106 m_preferer = ::allocator::defer_push_referer(pNew, {
this, __FUNCTION_FILE_LINE__ });
114 ::allocator::defer_erase_referer(pNew);
128 m_psubparticle =
nullptr;
130#if REFERENCING_DEBUGGING
132 m_preferer =
nullptr;
143template <
typename ...Args >
144pointer < T >::pointer(
allocate_t, Args &&... args)
147 auto p = ___new T (::std::forward<Args>(args)...);
155 m_p =
dynamic_cast <T *
> (p);
157 m_psubparticle = m_p;
166 m_psubparticle =
nullptr;
168 throw_resource_exception(
"OBJECT * p is not of type T (pointer < T >).");
174#if REFERENCING_DEBUGGING
176 if (m_psubparticle->is_referencing_debugging_enabled())
179 if(m_psubparticle->m_prefererTransfer2)
182 m_preferer = m_psubparticle->m_prefererTransfer2;
184 m_psubparticle->m_prefererTransfer2 =
nullptr;
187 else if(m_psubparticle->m_prefererLast2)
190 m_preferer = m_psubparticle->m_prefererLast2;
192 m_psubparticle->m_prefererLast2 =
nullptr;
198 m_preferer = ::allocator::defer_push_referer(m_p, {
this, __FUNCTION_FILE_LINE__ });
206 ::allocator::defer_erase_referer(m_p);
218inline pointer < T > ::pointer(
const pointer & t)
221#if REFERENCING_DEBUGGING
227 auto pNew = t.m_psubparticle;
234 m_psubparticle =
nullptr;
236#if REFERENCING_DEBUGGING
238 m_preferer =
nullptr;
246#if REFERENCING_DEBUGGING
248 ::reference_referer * prefererNew =
nullptr;
250 if(pNew->is_referencing_debugging_enabled())
254 prefererNew = ::allocator::defer_push_referer(pNew, {
this, __FUNCTION_FILE_LINE__ });
260 ::allocator::defer_erase_referer(pNew);
266 pNew->increment_reference_count();
268 m_psubparticle = pNew;
272#if REFERENCING_DEBUGGING
274 m_preferer = prefererNew;
284inline pointer < T > ::pointer(pointer && t) :
286m_psubparticle(t.m_psubparticle),
287m_estatus(t.m_estatus)
288#if REFERENCING_DEBUGGING
290,m_preferer(t.m_preferer)
296t.m_psubparticle =
nullptr;
297#if REFERENCING_DEBUGGING
299t.m_preferer =
nullptr;
319inline pointer < T > ::~pointer()
400inline bool pointer < T > ::is_set()
const
403 return !!m_p && !!m_psubparticle;
409inline bool pointer < T > ::is_null()
const
412 return !this->is_set();
420inline bool pointer < T > ::ok()
const
423 return ::is_set(m_p) && ::is_set(m_psubparticle) && m_psubparticle->_is_ok();
429inline bool pointer < T > ::nok()
const
438T* __dynamic_cast(
const T* p)
445template <
class T,
typename T2 >
446T * __dynamic_cast(
const T2 * p)
448 return dynamic_cast <T*
>((T2*)p);
489template <
typename T2 >
490inline pointer < T > & pointer < T > ::reset (T2 * p)
502 auto pNew =
dynamic_cast < T *
>((non_const < T2 > *) p);
507#if REFERENCING_DEBUGGING
509 ::allocator::defer_erase_referer(pNew);
519#if REFERENCING_DEBUGGING
521 ::reference_referer * prefererOld =
nullptr;
527#if REFERENCING_DEBUGGING
531 prefererOld = m_preferer;
540#if REFERENCING_DEBUGGING
542 ::reference_referer * prefererNew =
nullptr;
544 if (pNew->is_referencing_debugging_enabled())
549 prefererNew = ::allocator::defer_push_referer(pNew, {
this, __FUNCTION_FILE_LINE__ });
555 ::allocator::defer_erase_referer(pNew);
561 pNew->increment_reference_count();
565 m_psubparticle = pNew;
567#if REFERENCING_DEBUGGING
569 m_preferer = prefererNew;
579 m_psubparticle =
nullptr;
581#if REFERENCING_DEBUGGING
583 m_preferer =
nullptr;
594#if REFERENCING_DEBUGGING
596 if (pOld->is_referencing_debugging_enabled())
599 ::allocator::add_releaser(prefererOld);
619template <
typename T2 >
620inline pointer < T > & pointer < T > ::transfer(T2 * p)
632 auto pNew =
dynamic_cast <T *
>((non_const < T2 > *) p);
636#if REFERENCING_DEBUGGING
638 ::reference_referer * prefererOld =
nullptr;
647#if REFERENCING_DEBUGGING
655#if REFERENCING_DEBUGGING
657 prefererOld = m_preferer;
664#if REFERENCING_DEBUGGING
666 ::reference_referer * prefererNew =
nullptr;
668 if (pNew->is_referencing_debugging_enabled())
671 if(pNew->m_prefererTransfer)
674 ::allocator::_push_referer(pNew->m_prefererTransfer);
678 prefererNew = ::allocator::defer_push_referer(pNew, { pNew,
this, __FUNCTION_FILE_LINE__ });
684 ::allocator::defer_erase_referer(pNew);
694 m_psubparticle = pNew;
696#if REFERENCING_DEBUGGING
698 m_preferer = prefererNew;
708 m_psubparticle =
nullptr;
710#if REFERENCING_DEBUGGING
712 m_preferer =
nullptr;
723#if REFERENCING_DEBUGGING
725 if (pOld->is_referencing_debugging_enabled())
728 ::allocator::add_releaser(prefererOld);
748inline pointer < T > & pointer < T > ::operator = (
const pointer & t)
756#if REFERENCING_DEBUGGING
758 ::reference_referer * prefererOld =
nullptr;
764#if REFERENCING_DEBUGGING
768 prefererOld = m_preferer;
772 pOld = m_psubparticle;
774 auto pNew = t.m_psubparticle;
781 m_psubparticle =
nullptr;
783#if REFERENCING_DEBUGGING
785 m_preferer =
nullptr;
793#if REFERENCING_DEBUGGING
795 ::reference_referer * prefererNew =
nullptr;
797 if (pNew->is_referencing_debugging_enabled())
802 prefererNew = ::allocator::defer_push_referer(pNew, {
this, __FUNCTION_FILE_LINE__ });
808 ::allocator::defer_erase_referer(pNew);
814 pNew->increment_reference_count();
818 m_psubparticle = pNew;
820#if REFERENCING_DEBUGGING
822 m_preferer = prefererNew;
833#if REFERENCING_DEBUGGING
835 if (pOld->is_referencing_debugging_enabled())
838 ::allocator::add_releaser(prefererOld);
856inline pointer < T > & pointer < T > ::operator = (pointer && t)
864#if REFERENCING_DEBUGGING
866 ::reference_referer * prefererOld =
nullptr;
872#if REFERENCING_DEBUGGING
876 prefererOld = m_preferer;
880 pOld = m_psubparticle;
884 m_psubparticle = t.m_psubparticle;
886#if REFERENCING_DEBUGGING
888 m_preferer = t.m_preferer;
894 t.m_psubparticle =
nullptr;
896#if REFERENCING_DEBUGGING
898 t.m_preferer =
nullptr;
907#if REFERENCING_DEBUGGING
909 if (pOld->is_referencing_debugging_enabled())
912 ::allocator::add_releaser(prefererOld);
930template <
typename T2 >
931inline ::pointer < T2 > pointer < T > ::defer_get_new(
::particle* pparticle)
937 REFDBG_THIS(pparticle);
939 auto pNew = pparticle->create_newø < T2 >();
941 this->operator = (pNew);
987inline ::i64 pointer <T>::release()
992 ::collection::count c = -1;
996#if REFERENCING_DEBUGGING
1006#if REFERENCING_DEBUGGING
1008 ::collection::index iSerial = -1;
1014 pparticle = m_psubparticle;
1016#if REFERENCING_DEBUGGING
1018 auto preferer = m_preferer;
1031 m_psubparticle =
nullptr;
1033#if REFERENCING_DEBUGGING
1035 m_preferer =
nullptr;
1037 ::allocator::add_releaser(preferer);
1039 if (::is_set(preferer))
1042 iSerial = preferer->m_iSerial;
1049 c = pparticle->decrement_reference_count();
1055 informationf(
"exception release pparticle->release() \n");
1058#if REFERENCING_DEBUGGING
1060 if (::allocator::get_releaser() == preferer && preferer)
1063 ::output_debug_string(
"releaser stacked but not consumed");
1077 pparticle->delete_this();
1129template <
class T1,
class T2 >
1130inline bool operator ==(
const T1 * t1, const ::pointer<T2>& t2)
1132 auto p1 =
dynamic_cast < T1 *
> (t2.m_p);
1137 auto p2 =
dynamic_cast < T2 *
> ((T1 *) t1);
1140 return p2 == t2.m_p;
1146template <
class T1,
class T2 >
1147inline bool operator ==(const ::pointer<T1>& t1,
const T2 * t2)
1149 auto p1 =
dynamic_cast < T1 *
> ((T2 *) t2);
1152 return p1 == t1.m_p;
1154 auto p2 =
dynamic_cast < T2 *
> (t1.m_p);
1163template <
typename T >
1164inline bool operator ==(const ::pointer<T>& t1, const ::pointer<T> & t2)
1166 return t1.m_p == t2.m_p;
1170template <
class T1,
class T2 >
1171inline bool operator ==(const ::pointer<T1>& t1, const ::pointer<T2> & t2)
1173 auto p1 =
dynamic_cast < T1 *
> (t2.m_p);
1176 return p1 == t1.m_p;
1178 auto p2 =
dynamic_cast < T2 *
> (t1.m_p);
1181 return p2 == t2.m_p;
1187template <
class T1,
class T2 >
1188inline bool operator ==(T1 * t1, const ::pointer<T2>& t2)
1191 return operator == ((
const T1 *) t1, t2);
1196template <
class T1,
class T2 >
1197inline bool operator ==(const ::pointer<T1>& t1, T2 * t2)
1200 return operator == (t1, (
const T2 *) t2);
1311template <
typename TYPE >
1312inline ::pointer<TYPE>& defer_clone(::pointer<TYPE> & p)
1315 if (!p || p->reference_count() <= 1)
1322 return p = ::clone(p);
1327template <
typename TYPE >
1328pointer < TYPE > clone(TYPE * p)
1331 if(__pointer_is_null(p))
1334 throw_exception(error_null_pointer);
1338 auto pelement = p->clone();
1340 auto pNew =
dynamic_cast < TYPE *
> (pelement);
1342 if(__pointer_is_null(pNew))
1345 throw_exception(error_wrong_type);
1349 return ::pointer_transfer(pNew);
1354#include "acme/platform/lparam.h"
1363 m_p =
dynamic_cast <T *
>(m_psubparticle);
1365#if REFERENCING_DEBUGGING
1367 m_preferer = m_psubparticle->m_prefererTransfer2;
1369 m_psubparticle->m_prefererTransfer2 =
nullptr;
1373 if(::is_null(m_p) && ::is_set(m_psubparticle))
1376#if REFERENCING_DEBUGGING
1378 if (::is_set(m_preferer))
1381 ::allocator::add_releaser(m_preferer);
1383 m_preferer =
nullptr;
1389 ::release(m_psubparticle);
1398#include "acme/platform/wparam.h"
1407 m_p =
dynamic_cast<T *
>(m_psubparticle);
1409#if REFERENCING_DEBUGGING
1411 m_preferer = m_psubparticle->m_prefererTransfer2;
1413 m_psubparticle->m_prefererTransfer2 =
nullptr;
1417 if (::is_null(m_p) && ::is_set(m_psubparticle))
1420#if REFERENCING_DEBUGGING
1422 if (::is_set(m_preferer))
1425 ::allocator::add_releaser(m_preferer);
1427 m_preferer =
nullptr;
1432 ::release(m_psubparticle);
1441template <
class c_derived >
1442inline ::i64 increment_reference_count(c_derived * pca)
1452 return pca->increment_reference_count();
1457template <
class c_derived,
typename SOURCE >
1458inline ::i64 increment_reference_count(c_derived * & pca,
const SOURCE * psource)
1461 c_derived * pderived =
dynamic_cast <c_derived *
>((SOURCE *)psource);
1463 if (::is_null(pderived))
1466 throw_exception(error_wrong_type);
1472 return increment_reference_count(pca);
1477template <
class c_derived,
typename SOURCE >
1478inline ::i64 increment_reference_count(c_derived *& pderived, const ::pointer<SOURCE>& psource)
1481 return increment_reference_count(pderived, psource.m_p);
1487template <
typename TYPE >
1488inline ::i64 release(::pointer<TYPE>& pointer)
1492 return release(pointer.m_p);
1497template <
typename TYPE >
1498inline ::i64 __finalize(::pointer<TYPE> pointer)
1501if (!pointer)
return -1;
1505return release(pointer.m_p);
1519template <
class c_derived >
1520inline ::i64 ref_count(c_derived * pca)
1530 return pca->get_ref_count();
1570template <
typename T2 >
1571inline pointer < T > & pointer < T >::defer_assign_to(T2 * & p)
1580 p =
dynamic_cast < T2 *
>(m_p);
1597template <
typename OBJECT >
1598inline pointer < T > & pointer < T >::defer_create_new(OBJECT * pparticle)
1604 create_new < T >(pparticle);
1614template <
typename OBJECT >
1615inline pointer < T > & pointer < T >::create_new(OBJECT * pparticle)
1618 auto p = allocateø T();
1625 p->initialize(pparticle);
1629 return operator=(p);
1635inline bool is_found(
const pointer < T >& p);
1639inline bool not_found(
const pointer < T >& p);
1650template<
class POINTER_TYPE>
1651inline auto& __typed(::pointer<POINTER_TYPE>* pp) {
return *pp->operator POINTER_TYPE * (); }
1654template<
class POINTER_TYPE>
1655inline auto& __typed(::pointer<POINTER_TYPE>& p) {
return *p; }
1659void __destroy_and_release(pointer < T >& p)
1802template <
typename T2 >
1803inline pointer < T >& pointer < T > ::operator = (const ::cast < T2 >& p)
1806 return this->operator=(p.m_p);
1811template <
typename T2 >
1812inline pointer < T >& pointer < T > ::operator = (
const pointer < T2 > & t)
1817#if REFERENCING_DEBUGGING
1819 ::reference_referer * prefererOld =
nullptr;
1823 if (::is_null(t.m_p))
1832 auto pNew =
dynamic_cast <T *
>(t.m_p);
1840 else if (::is_null(pNew))
1849#if REFERENCING_DEBUGGING
1853 prefererOld = m_preferer;
1857 pOld = m_psubparticle;
1859#if REFERENCING_DEBUGGING
1861 ::reference_referer * prefererNew =
nullptr;
1863 if (pNew->is_referencing_debugging_enabled())
1867 prefererNew = ::allocator::defer_push_referer(pNew, {
this, __FUNCTION_FILE_LINE__ });
1873 ::allocator::defer_erase_referer(pNew);
1880 pNew->increment_reference_count();
1884 m_psubparticle = pNew;
1886#if REFERENCING_DEBUGGING
1888 m_preferer = prefererNew;
1899#if REFERENCING_DEBUGGING
1901 if (pOld->is_referencing_debugging_enabled())
1904 ::allocator::add_releaser(prefererOld);
1920template <
typename T2 >
1921inline pointer < T >& pointer < T > ::operator = (pointer < T2 > && t)
1924#if REFERENCING_DEBUGGING
1926 ::reference_referer * prefererOld =
nullptr;
1932 if (::is_null(t.m_p))
1941 auto pNew =
dynamic_cast <T *
>(t.m_p);
1949 else if (::is_null(pNew))
1958#if REFERENCING_DEBUGGING
1962 prefererOld = m_preferer;
1966 pOld = m_psubparticle;
1968 m_psubparticle = pNew;
1972#if REFERENCING_DEBUGGING
1974 m_preferer = t.m_preferer;
1976 t.m_preferer =
nullptr;
1989#if REFERENCING_DEBUGGING
1991 if (pOld->is_referencing_debugging_enabled())
1994 ::allocator::add_releaser(prefererOld);
2271template <
typename TARGET,
typename SOURCE >
2272inline void copy(::pointer < TARGET > & pTarget, const ::pointer < SOURCE > & pSource)
2329template <
typename T >
2330inline bool pointer < T > ::defer_destroy_and_release()
2333 if (!this->is_set())
2340 m_psubparticle->destroy();
2350template <
typename T >
2351inline ::i64 release(T *& p)
2372 informationf(
"exception release p = nullptr; \n");
2379 return pparticle->release();
2385 informationf(
"exception release pparticle->release() \n");
2395template <
typename T >
2396inline ::i64 global_release(T *& p)
2409 auto i = p->release();
2424 informationf(
"exception release pparticle->release() \n");
Definition critical_section.h:29
Definition subparticle.h:78
Definition _structures.h:7