acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
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
10
template
<
typename
NATURAL_DATA >
11
NATURAL_DATA* __nil() {
return
nullptr
; }
12
13
14
#define NATURAL_METADATA_ALIGN 32
15
16
17
//#pragma pack(push, base_data, 1)
18
19
20
template
<
typename
TYPE_DATA >
21
struct
ønil_base_data
;
22
23
24
template
<
typename
TYPE_DATA >
25
class
base_data
26
{
27
public
:
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
140
template
<
typename
TYPE_DATA >
141
class
ønil_character_data
142
{
143
public
:
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
667
template
<
typename
DATA >
668
inline
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
681
template
<
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
ønil_character_data
Definition
natural_pointer.h:142
base_data::storage_character_count
character_count storage_character_count() const
Definition
natural_pointer.h:118
interlocked_int
Definition
interlocked_count.h:58
ønil_base_data
Definition
natural_pointer.h:21
prototype
prototype
natural_pointer.h
Generated by
1.17.0