5#include "acme/prototype/prototype/pointer.h"
6#include "acme/platform/reference_referer.h"
28#define TEMPLATE_TYPE typename __TEMPLATE_TYPE__ = nullptr_t
29#define TEMPLATE_ARG __TEMPLATE_TYPE__ t = nullptr
31template <
class c_derived >
32inline ::i64 increment_reference_count(c_derived * pca);
40template <
typename T >
48 using RAW_POINTER = TYPE *;
53#if REFERENCING_DEBUGGING
54 reference_referer * m_preferer =
nullptr;
60 inline pointer( nullptr_t);
64 template <
typename ...Args >
67 pointer(
const pointer & t);
68 pointer(pointer && t);
84 template <
typename PARTICLE >
85 inline pointer(enum_create_new, PARTICLE * pparticle) :
87 m_psubparticle(nullptr)
94 pparticle->construct_newø(*
this);
100 template <
typename PARTICLE >
103 m_psubparticle(nullptr)
110 pparticle->constructø(*
this, pfactory);
116 template <
typename T2 >
118 template <
typename T2 >
119 inline pointer(
place_t, T2* p);
123 template <
class T2 >
132 m_psubparticle =
nullptr;
133#if REFERENCING_DEBUGGING
135 m_preferer =
nullptr;
141 auto pNew =
dynamic_cast <T *
> ((T2 *)p);
145#if REFERENCING_DEBUGGING
147 ::reference_referer * prefererNew =
nullptr;
149 if (pNew->is_referencing_debugging_enabled())
154 prefererNew = ::allocator::push_referer({
this, __FUNCTION_FILE_LINE__ });
158 pNew->increment_reference_count();
162 m_psubparticle = pNew;
163#if REFERENCING_DEBUGGING
165 m_preferer = prefererNew;
171 m_psubparticle =
nullptr;
174#if REFERENCING_DEBUGGING
176 m_preferer =
nullptr;
184 template <
class T2 >
192 template <
class T2 >
199 inline bool operator !()
const
237 template <
class T2 >
238 inline pointer(::pointer<T2>&& t)
239 requires (!::std::is_same<T2, T>::value)
245 auto p =
dynamic_cast < T *
> (t.m_p);
252 m_psubparticle = t.m_psubparticle;
254 m_estatus = t.m_estatus;
256#if REFERENCING_DEBUGGING
258 m_preferer = t.m_preferer;
264 t.m_psubparticle =
nullptr;
266#if REFERENCING_DEBUGGING
268 t.m_preferer =
nullptr;
278 m_psubparticle =
nullptr;
279#if REFERENCING_DEBUGGING
281 m_preferer =
nullptr;
291 m_psubparticle =
nullptr;
292#if REFERENCING_DEBUGGING
294 m_preferer =
nullptr;
300 template <
class T2 >
301 inline pointer(::pointer<T2>&& t)
302 requires ::std::is_same<T2, T>::value
315 m_psubparticle = t.m_psubparticle;
317 m_estatus = t.m_estatus;
319#if REFERENCING_DEBUGGING
321 m_preferer = t.m_preferer;
327 t.m_psubparticle =
nullptr;
329#if REFERENCING_DEBUGGING
331 t.m_preferer =
nullptr;
341 m_psubparticle =
nullptr;
342#if REFERENCING_DEBUGGING
344 m_preferer =
nullptr;
354 m_psubparticle =
nullptr;
355#if REFERENCING_DEBUGGING
357 m_preferer =
nullptr;
373 inline T* operator ->() {
return m_p; }
374 inline T* operator ->()
const {
return m_p; }
375 inline T & operator *() {
return *m_p; }
376 inline T & operator *()
const {
return *m_p; }
377 inline operator T * () {
return m_p; }
378 inline operator T *
const ()
const {
return m_p; }
379 inline T * get() {
return m_p; }
380 inline const T * get()
const {
return m_p; }
382 inline ::iptr iptr()
const {
return (::iptr) m_p;}
384 inline bool is_set()
const;
385 inline bool is_null()
const;
387 inline bool ok()
const;
388 inline bool nok()
const;
390 template <
class T2 >
391 inline pointer & operator = (T2 * p)
399 pointer & operator = (
const pointer & t);
400 pointer & operator = (pointer && t);
403 template <
class T2 >
404 inline pointer & operator = (const ::pointer<T2> & t);
405 template <
class T2 >
406 inline pointer & operator = (::pointer<T2> && t);
408 template <
class T2 >
409 inline pointer& operator = (const ::cast<T2>& t);
411 template <
typename T2 >
412 inline pointer < T2 > defer_get_new(::particle* pparticle);
484 inline bool defer_destroy_and_release();
486 inline ::i64 release();
490 inline ::pointer < T > detach() { return ::transfer(*
this); }
494 template <
class T2 >
495 inline ::pointer<T2>cast()
503 template <
class T2 >
504 inline ::pointer<T2>cast()
const
512 template <
class T2 >
513 inline non_const < T2 > * raw_cast()
516 return dynamic_cast <non_const < T2 > *
> (m_p);
521 template <
class T2 >
522 inline const non_const < T2 > * raw_cast()
const
525 return (
const non_const < T2 > *)
dynamic_cast <non_const < T2 > *
> ((non_const < T > *)m_p);
530 template <
class T2 >
531 inline bool is()
const
534 return cast < T2 >().is_set();
605 template <
typename T2 >
606 inline pointer& reset(const ::pointer < T2 > & p) {
return reset(p.m_p); }
609 template <
typename T2 >
610 inline pointer & reset(T2 * ptr);
613 template <
typename T2 >
614 inline pointer & transfer(T2 * ptr);
617 inline bool operator ==(nullptr_t)
const {
return is_null(); }
638 template <
typename TYPE >
639 inline pointer < T > & defer_assign_to(TYPE * & p);
644 template <
typename OBJECT >
645 inline pointer < T > & defer_create_new(OBJECT * pparticle);
647 template <
typename OBJECT >
648 inline pointer < T > & create_new(OBJECT * pparticle);
656 template <
typename T2 >
657 inline pointer < T > & clone(T2 * p);
659 inline void run_and_release()
676 inline void operator()()
const
679 ((TYPE *) m_p)->call();
694inline void destruct(T * p)
759template <
typename T >
760inline bool is_found(const ::pointer < T > & p) {
return p.is_set(); }
763template <
typename T >
764inline bool not_found(const ::pointer < T > & p) {
return p.is_null(); }
771template <
typename TYPE >
772inline void swap(::pointer<TYPE>& a, ::pointer<TYPE> & b)
792template <
typename TYPE >
793inline ::pointer<TYPE>& defer_clone(::pointer<TYPE> & p);
796template <
typename TYPE >
797pointer < TYPE > clone(TYPE * p);
804template <
typename TARGET,
typename SOURCE >
805inline void copy(::pointer < TARGET > & pTarget, const ::pointer < SOURCE > & pSource);
825template <
typename T,
typename ...Args >
826::pointer < T > __call_allocate(Args &&... args);
1274template <
typename TYPE >
1275inline void defer_finalize(::pointer < TYPE >& p)
1297template <
typename TYPE >
1298inline void defer_destroy(::pointer < TYPE >& p)
1358template <
typename TYPE >
1359inline void defer_destroy_and_release(::pointer < TYPE >& p)
1362 auto pDestroyAndRelease = ::transfer(p);
1364 if (pDestroyAndRelease)
1367 ::defer_destroy(pDestroyAndRelease);
1369 pDestroyAndRelease.release();
1376template <
typename TYPE >
1377::pointer < TYPE > as_pointer(TYPE * p)
1396template<
class specialization,
template<
typename>
class template_class,
1397 typename ...partial_specialization>
1399 [] <
typename ...template_args>(
1400 template_class<partial_specialization..., template_args...>&) {}(s);
1404template <
typename POINTER>
1408 [] <
typename TYPE>(::pointer<TYPE>&) {}(p);
1411template <
typename POINTER >
1413::std::is_base_of_v < ::subparticle, ::non_pointer < POINTER > >
1417using subparticle_pointer = ::pointer < ::subparticle >;
1421template <
typename RUNNABLE >
1424 { r() } ->::std::convertible_to<
void>;
1425#if defined(MS_COMPILER)
1426 { r.get_run_timeout() } ->::std::convertible_to<
::time>;
1428 { r.get_run_timeout() } ->::std::convertible_to<class ::time>;
1433template < prototype_subparticle SUBPARTICLE >
1434::pointer < SUBPARTICLE > as_pointer(SUBPARTICLE* p)
1442template < prototype_subparticle SUBPARTICLE >
1443::pointer < SUBPARTICLE > as_pointer(const ::pointer < SUBPARTICLE > & p)
1451template < prototype_subparticle SUBPARTICLE >
1452::pointer < SUBPARTICLE > transfer_as_pointer(SUBPARTICLE* p)
1465#if REFERENCING_DEBUGGING
1468 reference_referer * m_preferer;
1471 __pointer_site(const ::reference_referer & referer, ::reference_referer ** pprefererGet =
nullptr)
1476 m_preferer = ::allocator::push_referer(referer);
1481 *pprefererGet = m_preferer;
1501 template < prototype_subparticle SUBPARTICLE >
1502 ::pointer < SUBPARTICLE > operator << (SUBPARTICLE* p)
1505#if REFERENCING_DEBUGGING
1509 if (p->is_referencing_debugging_enabled())
1512 pointer.m_preferer = m_preferer;
1516 p->on_after_construct(m_preferer);
1528 template < prototype_subparticle SUBPARTICLE >
1529 ::pointer < SUBPARTICLE > operator += (SUBPARTICLE* p)
1532#if REFERENCING_DEBUGGING
1553#define __transfer_as_pointer __pointer_site(__refdbg_function_file_line__) <<
1555#define __preferernew_transfer_as_pointer __pointer_site(__refdbg_function_file_line__preferernew) <<
1557#define allocateø __transfer_as_pointer new
1559#define __preferernew_allocate __preferernew_transfer_as_pointer new
1561#define __as_pointer __pointer_site(__refdbg_function_file_line__) +=
1563#define __retain __as_pointer
1569class __g_initialize_pointer
1574#if REFERENCING_DEBUGGING
1577 reference_referer* m_preferer;
1585 __g_initialize_pointer(
::particle* p COMMA_REFERENCING_DEBUGGING_PARAMETERS_DECLARATION) :
1590#if REFERENCING_DEBUGGING
1592 m_preferer = ::allocator::push_referer(referer);
1607 template <
typename TYPE >
1608 ::pointer < TYPE > operator << (TYPE * p)
1611#if REFERENCING_DEBUGGING
1615 if (p->is_referencing_debugging_enabled())
1618 pointer.m_preferer = m_preferer;
1622 p->on_after_construct(m_preferer);
1640#define __initialize_pointer_with(P) __g_initialize_pointer(P __comma_refdbg_function_file_line__) <<
1642#define __preferernew_initialize_pointer_with(P) __g_initialize_pointer(P __comma_refdbg_function_file_line__preferernew) <<
1644#define __initialize_pointer __initialize_pointer_with(this)
1646#define __preferernew_initialize_pointer __preferernew_initialize_pointer_with(this)
1648#define __initialize_new_with(P) __initialize_pointer_with(P) new
1650#define __preferernew_initialize_new_with(P) __preferernew_initialize_pointer_with(P) new
1652#define __initialize_new __initialize_pointer new
1654#define __preferernew_initialize_new __preferernew_initialize_pointer new
1662 CLASS_DECL_ACME ::string operator()(const ::scoped_string & scopedstr);
1712template <
typename TYPE,
typename ...Args>
1713::pointer < TYPE > øcreate_pointer(Args &&... args)
1716 return {
transfer_t{},
new TYPE(::std::forward<Args>(args)...) };
Definition pointer.h:1659
pointer(enum_create, PARTICLE *pparticle, ::factory::factory *pfactory=nullptr)
consumes a referer
Definition pointer.h:101
pointer(const T2 *p)
consumes a referer
Definition pointer.h:124
pointer(const ::pointer< T2 > &p)
consumes a referer
Definition pointer.h:185
pointer(const ::cast< T2 > &p)
consumes a referer
Definition pointer.h:193
pointer(transfer_t, T2 *p)
referer is transferred?
Definition pointer.h:117
pointer(enum_create_new, PARTICLE *pparticle)
consumes a referer
Definition pointer.h:85
Definition subparticle.h:78
Definition pointer.h:1405
Definition pointer.h:1422
Definition pointer.h:1412
Checks if class type Specialisation (the implicit concept argument) is indeed a specialisation of Tem...
Definition pointer.h:1398
Definition _structures.h:7
Definition _structures.h:21
Definition _structures.h:6