acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
object.h
1// Some cleanup by camilo on 2024-11-08 10:21 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5#include "acme/prototype/prototype/property_object.h"
6#include "acme/handler/handler_context.h"
7#include "acme/parallelization/create_task_attributes.h"
8
9
10class CLASS_DECL_ACME object :
11 virtual public property_object,
12 virtual public handler_context
13{
14
15protected:
16
17
18 ::pointer < ::object > m_pobjectParentTask;
19 ::pointer < ::pointer_array < ::particle > > m_pparticleaChildrenTask;
20 ::pointer < ::map_particle < atom_map_base < ::pointer < ::parallelization::queue > > > > m_pqueuemap;
21
22
23 ::pointer < ::procedure_array > m_pprocedureaDestroying;
24 ::pointer < ::comparable_array< ::particle * > > m_pparticleaNotify;
25
26
27public:
28
29
30 ::particle * m_pparticleContext;
31
32 ::object_meta * m_pmeta;
33
34
35 object() : m_pmeta(nullptr), m_pparticleContext(nullptr) { }
36 ~object() override;
37
38
39#ifdef _DEBUG
40
41
42 virtual ::i64 increment_reference_count() override;
43 virtual ::i64 decrement_reference_count() override;
44 virtual ::i64 release() override;
45
46
47#else
48
49
50 virtual ::i64 increment_reference_count();
51 virtual ::i64 decrement_reference_count();
52 virtual ::i64 release();
53
54
55#endif
56
57
58 ::procedure_array_base& destroyinga() { ødefer_raw_construct_new(m_pprocedureaDestroying);
59 return *m_pprocedureaDestroying; }
60 ::comparable_array_base< ::particle* >& notifya() { ødefer_raw_construct_new(m_pparticleaNotify);
61 return *m_pparticleaNotify; }
62 void on_notify(::particle * pparticle, enum_id eid) override;
63
64
65
66 template < typename BASE_TYPE >
67 ::pointer<BASE_TYPE>file_as(const ::payload& payloadFile);
68
69
70 virtual void add_procedure(const ::atom& idRoutine, const ::procedure & procedure);
71
72
73 virtual void add_each_routine_from(const ::atom& idRoutine, ::object* pobjectSource);
74
75
76 virtual ::procedure_array procedure_array(const ::atom& idRoutine);
77
78
79 virtual void call_routine2(const ::procedure & procedure);
80
81
82 virtual void call_procedures(const ::atom& atom);
83
84
85 virtual void post_procedures(const ::atom& atom);
86
87
88 virtual void send_procedures(const ::atom& atom);
89
90
91 //inline ::payload context_value(const ::payload& payload);
92
93
94 virtual ::text::text __text(const ::atom& atom);
95
96
97 virtual void task_erase(::task* ptask) override;
98
99
100 virtual void notify(::enum_id eid, ::handler_context * phandlercontext = nullptr);
101
102
103 virtual void sleep(const class ::time& time);
104
105
106 template < typename BASE_TYPE >
107 void save_to(const ::payload& payloadFile, BASE_TYPE* pparticle);
108
109
110 virtual void initialize(::particle * pparticle) override;
111 virtual void set_finish() override;
112 //virtual void destroy() override;
113
114 virtual void add_task(::object* pobjectTask);
115 virtual void erase_task_and_set_task_new_parent(::object* pobjectTask, ::object * pobjectTaskNewParent);
116 virtual void transfer_tasks_from(::object * ptask);
117 virtual bool is_ascendant_task(::object * ptaskCandidateAscendant) const;
118
119// void destroy() override;
120
121 //virtual void set_finish();
122
123
124 virtual bool is_thread_class() const override;
125 bool should_run() const override;
126 virtual bool is_task_set2() const;
127 //virtual void child_post_quit(const ::scoped_string & scopedstrTag);
128 //virtual void child_post_quit_and_wait(const ::scoped_string & scopedstrTag, const time& time);
129
130 virtual void branch_send(const ::procedure & procedure, manual_reset_happening * phappening);
131
132 //void destroy() override;
133
134 //virtual void finish(::property_object* pcontextobjectRootFinishingInitiator = nullptr) override;
135 //virtual void set_finish(::property_object* pcontextobjectRootFinishingInitiator) override;
136 //virtual void set_finish_composites(::property_object* pcontextobjectRootFinishingInitiator) override;
137 //virtual void on_finish() override;
138
139
140 virtual bool has_child_task() const;
141 virtual void set_child_tasks_to_finish();
142
143 //virtual bool set_children_to_finish_and_check_them_finished();
144
145 void destroy() override;
146
147 virtual void on_destroy();
148
149 virtual void destroy_tasks();
150
151
152 void create_object_meta();
153
154 inline void defer_object_meta() { if (::is_null(m_pmeta)) create_object_meta(); }
155
156 inline ::object_meta * get_meta() { defer_object_meta(); return m_pmeta; }
157
158
159 ::extended_topic_pointer create_extended_topic(const ::atom & atom) override;
160
161 virtual void dev_log(const ::scoped_string & scopedstr);
162
163
164 virtual void delete_this() override;
165
166 virtual void destruct();
167
168 virtual void handle_exception(const ::exception& e) override;
169
170 virtual void top_handle_exception(const ::exception& e);
171
172 virtual void process_exception(const ::exception& e);
173
174
175 ::property_object* parent_property_set_holder() const override;
176
177 //void copy_from(const object& o);
178
179
180 virtual string get_tag() const;
181
182
183 virtual void defer_update_object_id();
184 virtual ::atom calc_default_object_id() const;
185
186
187 //void install_message_routing(::channel* pchannel) override;
188
189 void message_receiver_destruct();
190
191 void _001OnUpdate(::message::message* pmessage);
192
193 //virtual void request_file(const ::payload& payloadFile);
194
195 //virtual void request_file(const ::payload& payloadFile, ::payload varQuery);
196
197 //virtual void request(arguments arguments);
198
199 //virtual void do_request(::create* pcreate);
200
201 //virtual void do_request(::request * prequest);
202
203 //virtual pointer< ::extended::sequence < ::conversation > > message_box(::user::interaction * puserinteraction, const ::scoped_string & scopedstrMessage, const ::scoped_string & scopedstrTitle = nullptr, const ::user::e_message_box& emessagebox = ::user::e_message_box_ok);
204 //{
205 //
206 // return message_box(nullptr, pszMessage, pszTitle, emessagebox, process);
207
208 //}
209
210
211 //virtual void message_box_timeout(const ::scoped_string & scopedstrMessage, const ::scoped_string & scopedstrTitle = nullptr, const class time & timeTimeout = ::time::infinite(), const ::user::e_message_box & emessagebox = ::user::e_message_box_ok, const ::future & future = ::future());
212 //{
213
214 // return message_box_timeout(nullptr, pszMessage, pszTitle, timeTimeout, emessagebox, process);
215
216 //}
217
218 //virtual void message_box(::user::interaction_base* puiOwner, const ::scoped_string & scopedstrMessage, const ::scoped_string & scopedstrTitle = nullptr, const ::user::e_message_box & emessagebox = ::user::e_message_box_ok, const ::future & future = ::future());
219 //virtual void message_box_timeout(::user::interaction_base* puserinteractionOwner, const ::scoped_string & scopedstrMessage, const ::scoped_string & scopedstrTitle = nullptr, const class ::time& timeTimeout = ::time::infinite(), const ::user::e_message_box & emessagebox = ::user::e_message_box_ok, const ::future & future = ::future());
220
221 //virtual void release_references();
222
223 //virtual ::pointer<::element>running(const ::scoped_string & scopedstrTag) const;
224
225 //virtual bool ___is_reference(::particle * pparticle) const;
226
227 //virtual bool __is_composite(::particle * pparticle) const;
228
229 virtual bool __is_child_task(::particle * pparticle) const;
230
231
232
233 bool IsSerializable() const;
234
235 void branch(const ::procedure_array& routinea);
236 void branch_each(const ::procedure_array& routinea);
237
238 template < typename TASK >
239 inline ::pointer<TASK>& defer_branch(::pointer<TASK> ptask, const ::procedure & procedure)
240 {
241
242 if (ptask && ptask->is_running())
243 {
244
245 return ptask;
246
247 }
248
249 defer_construct_newø(ptask);
250
251 ptask->m_procedure = procedure;
252
253 ptask->branch();
254
255 return ptask;
256
257 }
258
259
260 template < typename THREAD >
261 inline ::pointer<THREAD> defer_branch(::pointer<THREAD>pthread)
262 {
263
264 if (pthread && pthread->is_running())
265 {
266
267 return pthread;
268
269 }
270
271 pthread->begin_thread();
272
273 return pthread;
274
275 }
276
277
278 void defer_branch(::task_pointer& ptask, const ::procedure & procedure);
279
280 ::pointer<task> fork(const ::procedure & procedure);
281
282 ::pointer<task> fork(const ::procedure & procedure, const create_task_attributes& createtaskattributes);
283
284 dispatch_arrayø forkø();
285
286 virtual ::pointer < ::parallelization::queue> queue(const ::atom & atomQueue);
287
288 virtual ::pointer<::task> branch_procedure(const ::procedure& procedure, bool bAutoDelete = true, enum_parallelization eparallelization = e_parallelization_asynchronous, const create_task_attributes_t & createtaskattributes = {});
289
290 virtual ::pointer<::task> branch_procedure_synchronously(const ::procedure& procedure, bool bAutoDelete = true, const create_task_attributes_t& createtaskattributes = {});
291
292 virtual ::task_pointer run_procedure(enum_synchronicity esynchronicity, const ::procedure & procedure);
293
294 template < typename TYPE >
295 ::task_pointer branch_below_normal(void (TYPE::* pfn)())
296 {
297
298 return branch(pfn, ::e_priority_below_normal);
299
300 }
301
302
303 ::task_pointer defer_branch(const ::atom& atom, const ::procedure & procedure, enum_priority epriority = e_priority_normal);
304
305 virtual ::particle * get_taskpool_container() override;
306
307 ::object& operator = (const ::payload& payload);
308
309
310
311 string as_string() const override;
312
313 void single_fork(const ::procedure_array& routinea);
314 void multiple_fork(const ::procedure_array& routinea);
315
316
317 template < prototype_function FUNCTION >
318 void hold_signal_function(::data::signal<FUNCTION> * psignal, const FUNCTION & function);
319
320
321};
322
323
324
325
326#define __make_identifier(PART1, PART2) PART1 ## PART2
327
328
329#define __defer_branch(procedure) defer_branch(m_p ## procedure, [this](){procedure();})
330
331
332
333
334
335
336#define __PROPERTIES(xxx) \
337class __ ## xxx ## _properties : \
338 public ::property_set \
339{ \
340public: \
341
342
343#define __PROPERTY(type, name, ID) type & name = reference(ID)
344
345
346
Definition handler_context.h:9
Definition bbb_object.h:11
Definition property_object.h:21