acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
_impl_ptr.h
1//
2// _impl_ptr.h
3// acme
4//
5// Created by Camilo Sasuke Thomas Borregaard Sørensen on
6// 2024-06-25 18:50 <3ThomasBorregaardSorensen!! ThomasLikesNumber5!
7// Copyright © 2024 Camilo Sasuke Tsumanuma. All rights reserved.
8//
9#pragma once
10
11
12#include "acme/prototype/prototype/cast.h"
13
14
15template < typename TYPE >
16inline ::ptr < TYPE > & ptr < TYPE >::operator = (const ::pointer < TYPE > & p)
17{
18
19 auto pOld = m_p;
20
21 if(pOld != p.m_p)
22 {
23
24#if REFERENCING_DEBUGGING
25
26 auto prefererOld = m_preferer;
27
28 auto prefererNew = ::allocator::defer_push_referer(p.m_p, {p.m_p, this, __FUNCTION_FILE_LINE__});
29
30#endif
31
32 p.m_p->increment_reference_count();
33
34 m_p = p.m_p;
35
36 if (__pointer_is_set(pOld))
37 {
38
39#if REFERENCING_DEBUGGING
40
41 ::allocator::add_releaser(prefererOld);
42
43#endif
44
45 pOld->release();
46
47 }
48
49#if REFERENCING_DEBUGGING
50
51 m_preferer = prefererNew;
52
53#endif
54
55 }
56
57 return *this;
58
59}
60
61
62template < typename TYPE >
63inline ::ptr < TYPE > & ptr < TYPE >::operator = (::pointer < TYPE > && p)
64{
65
66 auto pOld = m_p;
67
68 if (pOld != p.m_p)
69 {
70#if REFERENCING_DEBUGGING
71
72 auto prefererOld = m_preferer;
73
74 auto prefererNew = p.m_preferer;
75#endif
76 m_p = p.m_p;
77
78 p.m_p = nullptr;
79
80 p.m_pparticle = nullptr;
81
82 if (__pointer_is_set(pOld))
83 {
84#if REFERENCING_DEBUGGING
85
86 ::allocator::add_releaser(prefererOld);
87#endif
88 pOld->release();
89
90 }
91#if REFERENCING_DEBUGGING
92
93 m_preferer = prefererNew;
94#endif
95 }
96
97 return *this;
98
99}
100
101
102template < typename TYPE >
103template < typename TYPE2 >
104inline ::ptr < TYPE > & ptr < TYPE >::operator = (const ::pointer < TYPE2 > & p)
105{
106
107 if(is_null(p))
108 {
109
110 this->release();
111
112 return * this;
113
114 }
115
116 auto pOld = m_p;
117
118 auto pNew = dynamic_cast < TYPE >(p.m_pparticle);
119
120 if(pOld != pNew)
121 {
122
123#if REFERENCING_DEBUGGING
124
125 auto prefererOld = m_preferer;
126
127 auto prefererNew = ::allocator::defer_push_referer(p.m_p, {p.m_p, this, __FUNCTION_FILE_LINE__});
128
129#endif
130
131 pNew->increment_reference_count();
132
133 m_p = pNew;
134
135 if (__pointer_is_set(pOld))
136 {
137
138#if REFERENCING_DEBUGGING
139
140 ::allocator::add_releaser(prefererOld);
141
142#endif
143
144 pOld->release();
145
146 }
147
148#if REFERENCING_DEBUGGING
149
150 m_preferer = prefererNew;
151
152#endif
153
154 }
155
156 return *this;
157
158}
159
160
161template < typename TYPE >
162template < typename TYPE2 >
163inline ::ptr < TYPE > & ptr < TYPE >::operator = (::pointer < TYPE2 > && p)
164{
165
166 if(::is_null(p))
167 {
168
169 this->release();
170
171 return * this;
172
173 }
174
175 auto pOld = m_p;
176
177 auto pNew = dynamic_cast < TYPE * >(p.m_psubparticle);
178
179 if(pOld != pNew)
180 {
181#if REFERENCING_DEBUGGING
182
183 auto prefererOld = m_preferer;
184
185 auto prefererNew = p.m_preferer;
186#endif
187 m_p = pNew;
188
189 p.m_p = nullptr;
190
191 p.m_psubparticle = nullptr;
192
193 if (__pointer_is_set(pOld))
194 {
195#if REFERENCING_DEBUGGING
196
197 ::allocator::add_releaser(prefererOld);
198#endif
199 pOld->release();
200
201 }
202#if REFERENCING_DEBUGGING
203
204 m_preferer = prefererNew;
205#endif
206 }
207
208 return *this;
209
210}
211
212
213
214
215
216template < typename TYPE >
217template < typename TYPE2 >
218cast<TYPE> & cast<TYPE>::operator = (const ::pointer < TYPE2 >& p2)
219{
220
221 m_p = dynamic_cast <TYPE*>((::subparticle*)(p2.m_psubparticle));
222
223 return *this;
224
225}
Definition cast.h:10
Definition subparticle.h:78