24#if REFERENCING_DEBUGGING
25 reference_referer * m_preferer;
33#if REFERENCING_DEBUGGING
46#if REFERENCING_DEBUGGING
48 m_preferer = ::allocator::defer_push_referer(p, {
this, __FUNCTION_FILE_LINE__});
52 ((TYPE *)p)->increment_reference_count();
62#if REFERENCING_DEBUGGING
73 template <
typename TYPE2 >
80#if REFERENCING_DEBUGGING
82 m_preferer = ::allocator::defer_push_referer(p, {
this, __FUNCTION_FILE_LINE__ });
86 ((TYPE2*)p)->increment_reference_count();
88 m_p =
dynamic_cast < TYPE *
> ((TYPE2*)p);
96#if REFERENCING_DEBUGGING
113#if REFERENCING_DEBUGGING
115 m_preferer = ::allocator::defer_push_referer(ptr.m_p, {this, __FUNCTION_FILE_LINE__});
119 ptr.m_p->increment_reference_count();
127#if REFERENCING_DEBUGGING
129 m_preferer =
nullptr;
146#if REFERENCING_DEBUGGING
148 m_preferer = ptr.m_preferer;
154#if REFERENCING_DEBUGGING
156 ptr.m_preferer =
nullptr;
172 ptr(const ::pointer < TYPE > & p);
174 ptr(::pointer < TYPE > && p);
176 template <
typename T2 >
177 ptr(const ::pointer < T2 > & p);
179 template <
typename T2 >
180 ptr(::pointer < T2 > && p);
191 TYPE * operator ->() {
return m_p; }
192 TYPE * operator ->()
const {
return m_p; }
193 operator TYPE *() {
return m_p; }
194 operator TYPE *()
const {
return m_p; }
195 TYPE * get() {
return m_p; }
196 TYPE * get()
const {
return m_p; }
198 ptr & operator = (
const TYPE * p)
206#if REFERENCING_DEBUGGING
208 auto prefererOld = m_preferer;
210 ::reference_referer * prefererNew =
nullptr;
212 if(p->is_referencing_debugging_enabled())
215 prefererNew = ::allocator::defer_push_referer(p, {
this, __FUNCTION_FILE_LINE__ });
221 ((TYPE *)p)->increment_reference_count();
225 if(__pointer_is_set(pOld))
228#if REFERENCING_DEBUGGING
230 ::allocator::add_releaser(prefererOld);
238#if REFERENCING_DEBUGGING
240 m_preferer = prefererNew;
251 template <
typename T2 >
252 ptr & operator = (
const T2 * p2)
255 auto p =
dynamic_cast < TYPE *
>((T2 *) p2);
257 return this->operator=(p);
261 ::ptr < TYPE > & operator = (const ::ptr < TYPE > & p)
269#if REFERENCING_DEBUGGING
271 auto prefererOld = m_preferer;
273 ::reference_referer * prefererNew =
nullptr;
275 if(p->is_referencing_debugging_enabled())
278 prefererNew = ::allocator::defer_push_referer(p, {
this, __FUNCTION_FILE_LINE__ });
284 p.m_p->increment_reference_count();
288 if (__pointer_is_set(pOld))
291#if REFERENCING_DEBUGGING
293 ::allocator::add_releaser(prefererOld);
301#if REFERENCING_DEBUGGING
303 m_preferer = prefererNew;
314 ::ptr < TYPE > & operator = (::ptr < TYPE > && p)
322#if REFERENCING_DEBUGGING
324 auto prefererOld = m_preferer;
326 auto prefererNew = p.m_preferer;
334 if (__pointer_is_set(pOld))
337#if REFERENCING_DEBUGGING
339 ::allocator::add_releaser(prefererOld);
347#if REFERENCING_DEBUGGING
349 m_preferer = prefererNew;
360 ::ptr < TYPE > & transfer(TYPE * p)
368#if REFERENCING_DEBUGGING
370 auto prefererOld = m_preferer;
372 auto prefererNew = p->m_preferer;
378 if (__pointer_is_set(pOld))
381#if REFERENCING_DEBUGGING
383 ::allocator::add_releaser(prefererOld);
391#if REFERENCING_DEBUGGING
393 m_preferer = prefererNew;
404 ptr & operator = (const ::pointer < TYPE > & p);
406 ptr & operator = (::pointer < TYPE > && p);
408 template <
typename T2 >
409 ptr & operator = (const ::pointer < T2 > & p);
411 template <
typename T2 >
412 ptr & operator = (::pointer < T2 > && p);
429 if (__pointer_is_set(p))
432#if REFERENCING_DEBUGGING
434 auto prefererReleaser = m_preferer;
440#if REFERENCING_DEBUGGING
442 m_preferer =
nullptr;
446 if (__pointer_is_set(p))
449#if REFERENCING_DEBUGGING
451 ::allocator::add_releaser(prefererReleaser);
464 void operator()()
const
467 ((TYPE *)m_p)->call_run();
472 operator hash32()
const {
return { (::u32)(::uptr)m_p }; }
475 inline bool is_null()
const
478 return ::is_null(
this) || ::is_null(m_p);
483 inline bool is_set()
const
486 return !is_null() && m_p->is_set();
491 inline bool ok()
const
494 return is_set() && m_p->is_ok();
499 inline bool nok()
const