acme
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages Concepts
_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
12template < typename TYPE >
13inline ::ptr < TYPE > & ptr < TYPE >::operator = (const ::pointer < TYPE > & p)
14{
15
16 auto pOld = m_p;
17
18 if(pOld != p.m_p)
19 {
20
21#if REFERENCING_DEBUGGING
22
23 auto prefererOld = m_preferer;
24
25 auto prefererNew = ::allocator::defer_push_referer(p.m_p, {p.m_p, this, __FUNCTION_FILE_LINE__});
26
27#endif
28
29 p.m_p->increment_reference_count();
30
31 m_p = p.m_p;
32
33 if (__pointer_is_set(pOld))
34 {
35
36#if REFERENCING_DEBUGGING
37
38 ::allocator::add_releaser(prefererOld);
39
40#endif
41
42 pOld->release();
43
44 }
45
46#if REFERENCING_DEBUGGING
47
48 m_preferer = prefererNew;
49
50#endif
51
52 }
53
54 return *this;
55
56}
57
58
59template < typename TYPE >
60inline ::ptr < TYPE > & ptr < TYPE >::operator = (::pointer < TYPE > && p)
61{
62
63 auto pOld = m_p;
64
65 if (pOld != p.m_p)
66 {
67#if REFERENCING_DEBUGGING
68
69 auto prefererOld = m_preferer;
70
71 auto prefererNew = p.m_preferer;
72#endif
73 m_p = p.m_p;
74
75 p.m_p = nullptr;
76
77 p.m_pparticle = nullptr;
78
79 if (__pointer_is_set(pOld))
80 {
81#if REFERENCING_DEBUGGING
82
83 ::allocator::add_releaser(prefererOld);
84#endif
85 pOld->release();
86
87 }
88#if REFERENCING_DEBUGGING
89
90 m_preferer = prefererNew;
91#endif
92 }
93
94 return *this;
95
96}
97
98
99template < typename TYPE >
100template < typename TYPE2 >
101inline ::ptr < TYPE > & ptr < TYPE >::operator = (const ::pointer < TYPE2 > & p)
102{
103
104 if(is_null(p))
105 {
106
107 this->release();
108
109 return * this;
110
111 }
112
113 auto pOld = m_p;
114
115 auto pNew = dynamic_cast < TYPE >(p.m_pparticle);
116
117 if(pOld != pNew)
118 {
119
120#if REFERENCING_DEBUGGING
121
122 auto prefererOld = m_preferer;
123
124 auto prefererNew = ::allocator::defer_push_referer(p.m_p, {p.m_p, this, __FUNCTION_FILE_LINE__});
125
126#endif
127
128 pNew->increment_reference_count();
129
130 m_p = pNew;
131
132 if (__pointer_is_set(pOld))
133 {
134
135#if REFERENCING_DEBUGGING
136
137 ::allocator::add_releaser(prefererOld);
138
139#endif
140
141 pOld->release();
142
143 }
144
145#if REFERENCING_DEBUGGING
146
147 m_preferer = prefererNew;
148
149#endif
150
151 }
152
153 return *this;
154
155}
156
157
158template < typename TYPE >
159template < typename TYPE2 >
160inline ::ptr < TYPE > & ptr < TYPE >::operator = (::pointer < TYPE2 > && p)
161{
162
163 if(::is_null(p))
164 {
165
166 this->release();
167
168 return * this;
169
170 }
171
172 auto pOld = m_p;
173
174 auto pNew = dynamic_cast < TYPE * >(p.m_psubparticle);
175
176 if(pOld != pNew)
177 {
178#if REFERENCING_DEBUGGING
179
180 auto prefererOld = m_preferer;
181
182 auto prefererNew = p.m_preferer;
183#endif
184 m_p = pNew;
185
186 p.m_p = nullptr;
187
188 p.m_psubparticle = nullptr;
189
190 if (__pointer_is_set(pOld))
191 {
192#if REFERENCING_DEBUGGING
193
194 ::allocator::add_releaser(prefererOld);
195#endif
196 pOld->release();
197
198 }
199#if REFERENCING_DEBUGGING
200
201 m_preferer = prefererNew;
202#endif
203 }
204
205 return *this;
206
207}
208
209
210
211