acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
subparticle.h
1// Created by camilo on 2024-02-07 22:52 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5#include "pointer.h"
6#include "acme/prototype/prototype/interlocked_count.h"
7#include "acme/prototype/time/time/time.h"
8
9
10//#include "parallelization/manual_reset_happening.h"
11
12
13class notify_lock;
14#ifdef WINDOWS
15using hsynchronization = void*;
16#else
17using hsynchronization = ::subparticle *;
18#endif
19
20
21class sequence;
22
23
24#include "quantum.h"
25
26
27//typedef bool FUNCTION_CONTINUE(::subparticle * psubparticle);
28//using PFN_FUNCTION_CONTINUE = FUNCTION_CONTINUE *;
29//
30//
31//struct continue_predicate_t
32//{
33//
34//
35// PFN_FUNCTION_CONTINUE m_pfnContinue;
36// ::pointer<::subparticle> m_psubparticle;
37//
38//
39// continue_predicate_t() : m_pfnContinue(nullptr) {}
40// continue_predicate_t(const continue_predicate_t &predicate) :
41// m_pfnContinue(predicate.m_pfnContinue), m_psubparticle(predicate.m_psubparticle)
42// {
43// }
44// continue_predicate_t(PFN_FUNCTION_CONTINUE pfnContinue, ::subparticle *psubparticle) :
45// m_pfnContinue(pfnContinue), m_psubparticle(psubparticle)
46// {
47// }
48//
49// bool should_continue() const
50// {
51//
52// bool bShouldContinue = true;
53//
54// if (m_pfnContinue)
55// {
56//
57// bShouldContinue = m_pfnContinue(m_psubparticle);
58//
59// }
60//
61// return bShouldContinue;
62//
63// }
64//
65// bool operator()() const
66// {
67//
68// return this->should_continue();
69//
70// }
71//
72//
73//};
74
75
76class CLASS_DECL_ACME subparticle :
77 virtual public ::quantum
78{
79public:
80
81
82 ::interlocked_count m_countReference;
83 //::pointer < ::sequence > m_psequence;
84
85
86#if REFERENCING_DEBUGGING
87 subparticle();
88#else
89 subparticle() : m_countReference(1) { }
90#endif
91
92//
93//#if REFERENCING_DEBUGGING
94// subparticle(const ::e_flag & eflag, const ::e_status & estatus = undefined);
95//#else
96// subparticle(const ::e_flag & eflag, const ::e_status & estatus = undefined) :
97// ::quantum(eflag, estatus),
98// m_countReference(1)
99// {
100//
101//
102// }
103//#endif
104
105
106#if REFERENCING_DEBUGGING
107 subparticle(const ::subparticle & subparticle);
108#else
109 subparticle(const ::subparticle & subparticle) :
110 ::quantum(subparticle),
111 m_countReference(1)
112 {
113
114 }
115#endif
116#if REFERENCING_DEBUGGING
117 subparticle(::subparticle&& subparticle);
118#else
119 subparticle(::subparticle&& subparticle) :
120 ::quantum(::transfer(subparticle)),
121 m_countReference(::transfer(subparticle.m_countReference))
122 {
123 }
124#endif
125
126 ~subparticle() override;
127
128
129#if REFERENCING_DEBUGGING
130
131 void subparticle_referencing_debugging_construct();
132
133#endif
134
135
136 virtual void initialize(::particle * pparticle);
137 //virtual void finalize();
138
139
140 //virtual bool is_proto() const;
141 inline bool should_disable_referencing_debugging() const { return this->has_proto_flag(); }
142
143
144 ::platform::system* system() const;
145
146 //virtual void on_sequence();
147
149
150 virtual bool defer_consume_main_arguments(::i32 argc, char_pointer * argv, ::i32 & iArgument);
151
152 virtual void call();
153
154 virtual void get_debug_title(char_pointer sz, character_count c) const;
155
156 virtual ::string get_short_debug_text(::i32 i) const;
157
158 virtual void operator()();
159 virtual void run();
160
161 virtual class ::time get_run_timeout();
162
163 virtual bool subparticle_step();
164
165
166 inline ::collection::count reference_count() const { return m_countReference; }
167
168
169#ifdef _DEBUG
170
171
172 virtual ::i64 increment_reference_count();
173 virtual ::i64 decrement_reference_count();
174 virtual ::i64 replace_reference();
175 virtual ::i64 release();
176
177
178#else
179
180
181 inline ::i64 increment_reference_count();
182 inline ::i64 decrement_reference_count();
183 inline ::i64 replace_reference();
184 inline ::i64 release();
185
186
187#endif
188
189
190#if REFERENCING_DEBUGGING
191
192
193 ::subparticle* refdbg_this() const { return (::subparticle*)this; }
194
195
196protected:
197
198
199 ::subparticle* m_psubparticleTopTrack = nullptr;
200
201
202public:
203
204 ::subparticle * get_top_track() const;
205 void add_top_track(::subparticle* psubparticle);
206 void erase_top_track(::subparticle* psubparticle);
207 bool contains_top_track(::subparticle* psubparticle) const;
208 bool find_top_track(::subparticle* psubparticle, ::subparticle** ppsubparticleeParent) const;
209
210
211 class ::time m_timeAllocation;
212 class reference_item_array * m_preferenceitema = nullptr;
213 bool m_bHeapAllocation = false;
214 void * m_pType = nullptr;
215 memsize m_sType = sizeof(::subparticle);
216 ::reference_referer * m_prefererTransfer2 = nullptr;
217 ::reference_referer * m_prefererLast2 = nullptr;
218 bool m_bReferencingDebuggingEnabled5 = true;
219 bool m_bIncludeCallStackTrace = false;
220
221 void set_size_type(memsize s) { m_sType = s; }
222
223 bool contains_object_in_address_space(::subparticle * psubparticle) const
224 {
225
226 return
227 ::is_set(this->m_pType)
228 && this->m_sType >= sizeof(::subparticle)
229 && ((::u8 *)psubparticle >= this->m_pType
230 && (((::u8 *)psubparticle) + psubparticle->m_sType)
231 <= (((::u8 *)this->m_pType) + this->m_sType));
232
233 }
234
235 class reference_item_array * reference_itema();
236
237 bool is_referencing_debugging_enabled() const
238 {
239
240 return !this->should_disable_referencing_debugging() && m_bReferencingDebuggingEnabled5;
241
242 }
243
244 virtual void on_after_construct(::reference_referer* preferer);
245
246
247 void disable_referencing_debugging();
248
249 //void add_initial_reference_item();
250 void add_reference_item(bool bConstructing, bool bIncludeCallStackTrace);
251 void add_referer(::reference_referer * preferer);
252 //void _add_reference_item();
253 void erase_reference_item();
254 void check_pending_releases();
255
256#else
257
258 bool is_referencing_debugging_enabled() const { return false; }
259
260#endif
261
262
263 virtual bool _is_set() const;
264 virtual bool _is_ok() const;
265
266
267 virtual enum_type get_payload_type() const;
268
269
270 virtual void init_task();
271 virtual void term_task();
272
273
274 virtual void destroy();
275 virtual void destroy_impl_data();
276 virtual void destroy_os_data();
277
278 template < typename TYPE >
279 ::cast < TYPE > cast() { return this; }
280
281 template < typename TYPE >
282 ::cast < TYPE > cast() const { return ((::subparticle *)this)->cast < TYPE >() ; }
283
284 virtual ::subparticle_pointer clone();
285
286//#if REFERENCING_DEBUGGING
287//
288// virtual void set_creation_referer(::reference_referer* preferer);
289//
290//#endif
291
292 virtual void delete_this();
293
294 virtual void call_member(enum_id eid);
295
296
297 virtual void write_to_stream(::binary_stream & stream);
298 virtual void read_from_stream(::binary_stream & stream);
299
300 [[nodiscard]] virtual class ::time timeout() const;
301
302
303 virtual void set_timeout(const class time & time);
304
305 virtual hsynchronization get_synchronization_handle();
306
307
308 // currently expected returned statuses:
309// ::error_failed
310// ::error_wait_timeout
311// ::success
312 virtual ::e_status lock();
313 virtual ::e_status lock(const class time& timeWait);
314
315 virtual ::e_status wait();
316 virtual ::e_status wait(const class time& timeWait);
317 virtual ::e_status wait(const ::function < bool() > & functionShouldContinue);
318
319 virtual void _lock();
320 virtual bool _lock(const class time& timeWait);
321
322 virtual void _wait();
323 virtual bool _wait(const class time& timeWait);
324
325 virtual bool is_locked() const;
326
327 virtual void unlock();
328 virtual void unlock(::i32 lCount, ::i32* pPrevCount=nullptr);
329
330
331 virtual void init_wait();
332 virtual void exit_wait();
333
334
335 virtual void acquire_ownership();
336 virtual void release_ownership();
337
338
339 [[nodiscard]] virtual character_count sz_len() const;
340 virtual void to_sz(char_pointer sz, character_count len) const;
341
342
343 virtual void on_timed_out();
344
345
346 virtual bool start_notify_lock(::notify_lock * pnotifylock);
347 virtual void end_notify_lock(::notify_lock * pnotifylock);
348
349};
350//
351// template < typename TYPE >
352// class ARRAY_BASE
353// {
354// public:
355//
356// ARRAY_BASE(){}
357// ARRAY_BASE(const ARRAY_BASE & base){}
358//
359// };
360//
361//
362// class particle
363// {
364// public:
365//
366// ::i32 flag = 0;
367//
368// };
369//
370//
371// template < typename TYPE, ::i32 t_iFlag >
372// class make_particle :
373// public TYPE,
374// virtual public ::particle
375// {
376// public:
377//
378// using TYPE::TYPE;
379// using TYPE::operator =;
380//
381// };
382
383inline bool is_nok(const ::subparticle * p) { return !::is_set(p) || !p->_is_ok(); }
384
385//
386//
387//
388// template < typename TYPE >
389// class proto :
390// public TYPE
391// {
392// public:
393//
394//
395// using TYPE::TYPE;
396// using TYPE::operator =;
397//
398//
399// proto(const ::e_flag & eflag = e_flag_none, const ::e_status & estatus = undefined):
400// TYPE(eflag | e_flag_proto, estatus),
401// ::subparticle(eflag | e_flag_proto, estatus),
402// ::quantum(eflag | e_flag_proto, estatus)
403// {
404//
405// }
406// //
407// //
408// // ~no_referencing_debugging() override
409// // {
410// //
411// //
412// // }
413//
414// //
415// // bool is_proto() const override
416// // {
417// //
418// // // if (!(this->m_eflagElement & e_flag_disable_referencing_debugging))
419// // // {
420// // //
421// // // ((proto *) this)->m_eflagElement |= e_flag_disable_referencing_debugging;
422// // //
423// // // }
424// // //
425// // // if (!this->m_bReferencingDebuggingEnabled3)
426// // // {
427// // //
428// // // ((proto *) this)->m_bReferencingDebuggingEnabled3 = false;
429// // //
430// // // }
431// //
432// // return true;
433// //
434// // }
435//
436//
437// };
Definition binary_stream.h:12
Definition manual_reset_happening.h:50
Definition particle.h:95
Definition system.h:53
Definition ___serialization_draft.h:42
Definition subparticle.h:78
virtual bool defer_consume_main_arguments(::i32 argc, char_pointer *argv, ::i32 &iArgument)
virtual bool should_create_sequence_on_synchronicity();
Definition subparticle.cpp:295
virtual void unlock()
Definition subparticle.cpp:795
Definition aaa_time.h:13