acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
natural_pointer.h
1#pragma once
2
3
4#include "acme/platform/acme.h"
5#include "acme/memory/allocator.h"
6#include "acme/memory/management.h"
7#include "acme/prototype/prototype/interlocked_count.h"
8
9
10template < typename NATURAL_DATA >
11NATURAL_DATA* __nil() { return nullptr; }
12
13
14#define NATURAL_METADATA_ALIGN 32
15
16
17//#pragma pack(push, base_data, 1)
18
19
20template < typename TYPE_DATA >
22
23
24template < typename TYPE_DATA >
25class base_data
26{
27public:
28
29
30 using BASE_DATA_BASE = base_data < TYPE_DATA >;
31
32 using DATA = non_const < TYPE_DATA >;
33
34
35 interlocked_int m_countReference;
36 ::heap::enum_memory m_ememoryHeap;
37 ::collection::count m_count;
38
39 //memsize_storage m_countData;
40
41
42 //heap_data(): m_countData(0), m_sizeStorageInBytes(0), m_countReference(1) {}
43 //heap_data(enum_zero_init) : m_countData(0), m_sizeStorageInBytes(0), m_countReference(1) {}
44
45 base_data(::collection::count count) : m_count(count), m_countReference(1) {}
46 //heap_data(enum_zero_init) : m_sizeStorageInBytes(0), m_countReference(1) {}
47
48 bool base_data_is_shared() const { return m_countReference >= 2; }
49
50
51 auto base_data_increment_reference_count() { return ++m_countReference; }
52
53
54 auto base_data_decrement_reference_count() { return --m_countReference; }
55
56
57 //inline static base_data * base_nil_data();
58
59 //constexpr static ::memsize base_dataoffset() { return (offsetof(base_data, m_endofmetadata) + NATURAL_METADATA_ALIGN - 1) & (~(NATURAL_METADATA_ALIGN - 1)); }
60
61
62 DATA * data() const { return (DATA *)&(this[1]); }
63
64 const DATA* c_data() const { return (const DATA*)&(this[1]); }
65
66
67 //DATA * end() const { return (DATA *)(begin() + this->m_countData); }
68
69
70 static base_data * base_data_from_data(const DATA * pdata) { return &((base_data *) pdata)[-1]; }
71
72
73 ::i32 base_data_defer_release()
74 {
75
76 auto i = base_data_decrement_reference_count();
77
78 if (i == 0)
79 {
80
81 memory_free(this);
82
83 }
84
85 return i;
86
87 }
88
89
90 static base_data * create_base_data2(::collection::count count, ::heap::enum_memory ememory = ::heap::e_memory_string)
91 {
92
93 memsize memsizeAllocation = count * sizeof(DATA);
94
95 const memsize memsizeBaseData = sizeof(base_data);
96
97 auto p = ::acme::get()->m_pheapmanagement->memory(ememory)->allocate(
98 memsizeAllocation + memsizeBaseData, &memsizeAllocation);
99
100 auto pbasedata = øraw_new (p) base_data((memsizeAllocation - memsizeBaseData) / sizeof(DATA));
101
102 return pbasedata;
103
104 }
105
106
107 inline ::collection::count storage_count() const
108 {
109
110 return m_count;
111
112 }
113
118 inline character_count storage_character_count() const
119 {
120
121 if (::is_null(this))
122 {
123
124 return 0;
125
126 }
127
128 auto s = this->storage_count();
129
130 auto n = s - 1;
131
132 return n;
133
134 }
135
136
137};
138
139
140template < typename TYPE_DATA >
142{
143public:
144
145
146
147 inline static const TYPE_DATA m_data[1]={};
148
149 //ønil_character_data() {}
150
151
152 inline static const TYPE_DATA * get()
153 {
154
155 return m_data;
156
157 }
158
159};
160
161
162
163
164// template < typename TYPE_DATA>
165// inline const TYPE_DATA * ønil_character_data <TYPE_DATA>::base_nil_data()
166// {
167//
168// static ønil_base_data<TYPE_DATA> ønil{};
169//
170// return &ønil;
171//
172// }
173
174
175//#pragma pack(pop, base_data)
176
177
178// template < typename BASE_DATA_BASE >
179// class base_data :
180// public BASE_DATA_BASE
181// {
182// public:
183//
184//
185// using BASE_DATA = typename BASE_DATA_BASE::BASE_DATA_BASE;
186// using DATA = typename BASE_DATA_BASE::DATA;
187//
188// ::u8 m_data[sizeof(DATA)] = {};
189//
190//
191// base_data() {}
192//
193// base_data(enum_zero_init) :BASE_DATA_BASE(e_zero_init){}
194//
195//
196// /*bool is_set() { return ::is_set(this->m_begin); }
197//
198//
199// bool is_null() { return !is_null(); }*/
200//
201//
202// inline static base_data * base_data_from_data(const DATA* pdata)
203// {
204//
205// //return ::is_set(pdata) ?
206// // (BASE_DATA*)BASE_DATA_BASE::base_data_from_data(pdata) :
207// // nullptr;
208// return (base_data*) BASE_DATA_BASE::base_data_from_data(pdata);
209//
210// }
211//
212//
213// inline static DATA* base_data_to_data(const BASE_DATA * pbasedata)
214// {
215//
216// return (DATA *) pbasedata->data();
217//
218// }
219//
220//
221// //inline BASE_DATA* metadata()
222// //{
223//
224// // return from_data(this->m_begin);
225//
226// //}
227//
228//
229// //inline BASE_DATA* metadata() const
230// //{
231//
232// // return from_data(this->m_begin);
233//
234// //}
235//
236//
237// };
238//
239//
240// //#pragma pack(push,1)
241//
242//
243// template < typename BASE_DATA_BASE, ::heap::enum_memory t_ememory >
244// class natural_pointer
245// //class natural_pointer :
246// // public RANGE_TYPE
247// {
248// public:
249//
250//
251// using BASE_DATA = base_data < BASE_DATA_BASE >;
252// //using META_DATA = BASE_DATA_BASE;
253// using BASE = BASE_DATA_BASE;
254// using DATA = typename BASE_DATA::DATA;
255// //using iterator = typename RANGE_TYPE::iterator;
256//
257//
258// //inline natural_pointer() : RANGE_TYPE(no_initialize_t{}) { }
259// //inline natural_pointer(nullptr_t) : RANGE_TYPE(nullptr) { }
260// //inline natural_pointer(const natural_pointer & natural_pointer)
261// //{
262//
263// // natural_pointer.metadata()->base_data_increment_reference_count();
264//
265// // RANGE_TYPE::operator = (natural_pointer);
266//
267// //}
268// /*inline natural_pointer(natural_pointer && natural_pointer)
269// {
270//
271// RANGE_TYPE::operator = (::transfer(natural_pointer));
272//
273// }
274// inline natural_pointer() : natural_pointer(no_initialize_t{})
275// {
276//
277// natural_pointer_default_construct();
278//
279// }*/
280// /*~natural_pointer()
281// {
282//
283// destroy();
284//
285// }*/
286//
287// inline static ::heap::memory * memory() { return ::acme::get()->m_pheapmanagement->memory(t_ememory); }
288//
289// // void base_data_destroy()
290// // {
291// //
292// //
293// // base_data() {}
294// //
295// // base_data(enum_zero_init) :BASE_DATA_BASE(e_zero_init){}
296// //
297// //
298// // /*bool is_set() { return ::is_set(this->m_begin); }
299// //
300// //
301// // bool is_null() { return !is_null(); }*/
302// //
303// //
304// // inline static base_data * base_data_from_data(const DATA* pdata)
305// // {
306// //
307// // //return ::is_set(pdata) ?
308// // // (BASE_DATA*)BASE_DATA_BASE::base_data_from_data(pdata) :
309// // // nullptr;
310// // return (base_data*) BASE_DATA_BASE::base_data_from_data(pdata);
311// //
312// // }
313// //
314// //
315// // inline static DATA* base_data_to_data(const BASE_DATA * pbasedata)
316// // {
317// //
318// // return (DATA *) pbasedata->data();
319// //
320// // }
321// //
322// //
323// // //inline BASE_DATA* metadata()
324// // //{
325// //
326// // // return from_data(this->m_begin);
327// //
328// // //}
329// //
330// //
331// // //inline BASE_DATA* metadata() const
332// // //{
333// //
334// // // return from_data(this->m_begin);
335// //
336// // //}
337// //
338// //
339// // };
340//
341//
342// //#pragma pack(push,1)
343//
344//
345// // template < typename BASE_DATA_BASE, ::heap::enum_memory t_ememory >
346// // class natural_pointer
347// // //class natural_pointer :
348// // // public RANGE_TYPE
349// // {
350// // public:
351// //
352// //
353// // using BASE_DATA = base_data < BASE_DATA_BASE >;
354// // //using META_DATA = BASE_DATA_BASE;
355// // using BASE = BASE_DATA_BASE;
356// // using DATA = typename BASE_DATA::DATA;
357// // //using iterator = typename RANGE_TYPE::iterator;
358// //
359// //
360// // //inline natural_pointer() : RANGE_TYPE(no_initialize_t{}) { }
361// // //inline natural_pointer(nullptr_t) : RANGE_TYPE(nullptr) { }
362// // //inline natural_pointer(const natural_pointer & natural_pointer)
363// // //{
364// //
365// // // natural_pointer.metadata()->base_data_increment_reference_count();
366// //
367// // // RANGE_TYPE::operator = (natural_pointer);
368// //
369// // //}
370// // /*inline natural_pointer(natural_pointer && natural_pointer)
371// // {
372// //
373// // RANGE_TYPE::operator = (::transfer(natural_pointer));
374// //
375// // }
376// // inline natural_pointer() : natural_pointer(no_initialize_t{})
377// // {
378// //
379// // natural_pointer_default_construct();
380// //
381// // }*/
382// // /*~natural_pointer()
383// // {
384// //
385// // destroy();
386// //
387// // }*/
388// //
389// // inline static ::heap::memory * memory() { return ::acme::get()->m_pheapmanagement->memory(t_ememory); }
390// //
391// // // void base_data_destroy()
392// // // {
393// // //
394// // // //if (this->is_natural_pointer() && ::is_set(this->begin()))
395// // // if (this->is_string() && ::is_set(this->begin()))
396// // // {
397// // //
398// // // //if (this->is_string())
399// // // //{
400// // //
401// // // this->base_data_defer_release(base_data_from_data(this->begin()));
402// // //
403// // //// this->clear_string_flag();
404// // //
405// // // // }
406// // //
407// // // this->m_begin = nullptr;
408// // //
409// // // this->m_end = nullptr;
410// // //
411// // // }
412// // //
413// // // }
414// //
415// //
416// // //natural_pointer & operator = (const natural_pointer & natural_pointer)
417// // //{
418// //
419// // // if (this != &natural_pointer)
420// // // {
421// //
422// // // if (natural_pointer.is_string())
423// // // {
424// //
425// // // natural_pointer.metadata()->natural_increment_reference_count();
426// //
427// // // }
428// //
429// // // destroy();
430// //
431// // // RANGE_TYPE::operator = (natural_pointer);
432// //
433// // // }
434// //
435// // // return *this;
436// //
437// // //}
438// //
439// //
440// // inline static BASE_DATA * base_data_create(character_count n)
441// // {
442// //
443// // memsize sizeStorageInBytes = n * sizeof(DATA);
444// //
445// // auto p = memory()->allocate(sizeStorageInBytes + sizeof(BASE), &sizeStorageInBytes);
446// //
447// // auto pbasedata = øraw_new (p) BASE_DATA();
448// //
449// // pbasedata->m_sizeStorageInBytes = sizeStorageInBytes - sizeof(BASE);
450// //
451// // return pbasedata;
452// //
453// // }
454// //
455// //
456// // //natural_pointer & operator = (natural_pointer && natural_pointer)
457// // //{
458// //
459// // // if (this->begin() != natural_pointer.begin())
460// // // {
461// //
462// // // destroy();
463// //
464// // // RANGE_TYPE::operator = (::transfer(natural_pointer));
465// //
466// // // }
467// // //
468// // // return *this;
469// // //
470// // //}
471// //
472// //
473// // //void base_data_default_data()
474// // //{
475// //
476// // // auto p = this->default_construct_natural_pointer();
477// //
478// // // this->m_begin = (iterator) p->begin();
479// //
480// // // this->m_end = (iterator) p->end();
481// //
482// // // this->set_string_flag();
483// //
484// // //}
485// //
486// //
487// // inline BASE_DATA * base_data_default_data()
488// // {
489// //
490// // auto pnil = __nil< BASE_DATA >();
491// //
492// // return pnil;
493// //
494// // //pnil->natural_increment_reference_count();
495// //
496// // //return pnil;
497// //
498// // }
499// //
500// //
501// //
502// //
503// // //inline BASE_DATA * metadata() const
504// // //{
505// //
506// // // //return ::is_set(this) && ::is_set(this->m_begin) ? BASE_DATA::from_data(this->m_begin) : nullptr;
507// // // return BASE_DATA::from_data(this->m_begin);
508// //
509// // //}
510// //
511// //
512// // inline static void base_data_destroy(BASE_DATA * pbasedata)
513// // {
514// //
515// // memory()->free(pbasedata);
516// //
517// // }
518// //
519// //
520// // //void assign_natural_pointer(const natural_pointer& pointer)
521// // //{
522// //
523// // // assign_natural_base_data(BASE_DATA::from_data(pointer.m_begin));
524// //
525// // //}
526// //
527// //
528// // //void create_assign_natural_base_data(BASE_DATA * p)
529// // //{
530// //
531// // // p->natural_increment_reference_count();
532// //
533// // // this->m_begin = (iterator) p->begin();
534// //
535// // // this->m_end = (iterator) p->end();
536// // //
537// // // this->set_string_flag();
538// //
539// // //}
540// //
541// //
542// // //void assign_natural_base_data(BASE_DATA * pNew)
543// // //{
544// //
545// // // auto pOld = BASE_DATA::from_data(this->m_begin);
546// //
547// // // if (pOld != pNew)
548// // // {
549// //
550// // // pNew->natural_increment_reference_count();
551// //
552// // // this->m_begin = (iterator)pNew->begin();
553// //
554// // // this->m_end = (iterator)pNew->end();
555// //
556// // // this->set_string_flag();
557// //
558// // // natural_release(pOld);
559// //
560// // // }
561// //
562// // //}
563// //
564// //
565// // //void place_natural_base_data(BASE_DATA * pNew)
566// // //{
567// //
568// // // auto pOld = BASE_DATA::from_data(this->m_begin);
569// //
570// // // if (pOld != pNew)
571// // // {
572// //
573// // // this->m_begin = (iterator)pNew->begin();
574// //
575// // // this->m_end = (iterator)pNew->end();
576// //
577// // // this->set_string_flag();
578// //
579// // // natural_release(pOld);
580// //
581// // // }
582// //
583// // //}
584// //
585// //
586// // //void natural_release()
587// // //{
588// //
589// // // DATA * pdataOld = nullptr;
590// // //
591// // // if (this->is_string())
592// // // {
593// //
594// // // pdataOld = (DATA *)this->m_begin;
595// //
596// // // }
597// //
598// // // auto p = default_construct_natural_pointer();
599// //
600// // // this->m_begin = (iterator)p->begin();
601// //
602// // // this->m_end = (iterator)p->end();
603// //
604// // // this->set_string_flag();
605// //
606// // // if (::is_set(pdataOld))
607// // // {
608// //
609// // // natural_release(pdataOld);
610// //
611// // // }
612// //
613// // //}
614// //
615// //
616// // //static void natural_release(DATA * pdata)
617// // //{
618// //
619// // // natural_release(BASE_DATA::from_data(pdata));
620// //
621// // //}
622// //
623// // /* static void base_data_defer_release(BASE_DATA * pbasedata)
624// // {
625// //
626// // if (::is_null(pbasedata))
627// // {
628// //
629// // return;
630// //
631// // }
632// //
633// // _natural_release(pbasedata);
634// //
635// // }*/
636// //
637// //
638// // static void base_data_defer_release(BASE_DATA * pbasedata)
639// // {
640// //
641// // if (pbasedata->base_data_decrement_reference_count() == 0)
642// // {
643// //
644// // base_data_destroy(pbasedata);
645// //
646// // }
647// //
648// // }
649// //
650// //
651// // static BASE_DATA* base_data_from_data(const DATA* pdata)
652// // {
653// //
654// // return BASE_DATA::base_data_from_data(pdata);
655// //
656// // }
657// //
658// //
659// // };
660//
661//
662// //#pragma pack(pop)
663//
664//
665//
666
667template < typename DATA >
668inline void base_data_defer_add_reference(::base_data < DATA >* pbasedata)
669{
670
671 if (::is_set(pbasedata))
672 {
673
674 pbasedata->base_data_increment_reference_count();
675
676 }
677
678}
679
680
681template < typename DATA >
682::i32 base_data_defer_release(::base_data < DATA > * & pbasedata)
683{
684
685 auto p = pbasedata;
686
687 pbasedata = nullptr;
688
689 ::i32 i = -1;
690
691 if (::is_set(p))
692 {
693
694 try
695 {
696
697 i = p->base_data_defer_release();
698
699 }
700 catch (...)
701 {
702
703 }
704
705 }
706
707 return i;
708
709}
710
711
712
Definition natural_pointer.h:142
character_count storage_character_count() const
Definition natural_pointer.h:118
Definition interlocked_count.h:58
Definition natural_pointer.h:21