acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
pool.h
1// Created by camilo on 2025-06-30 01:22 <3ThomasBorregaardSørensen!!
2#pragma once
3
4
5#include "acme/prototype/prototype/call.h"
6
7class CLASS_DECL_ACME ongoing_particle_array_source :
8 virtual public ::particle
9{
10public:
11
12 virtual ::particle_array* ongoing_particle_array();
13
14
15};
16
17
18class CLASS_DECL_ACME pool_group :
19 virtual public ::particle
20{
21public:
22
23
24 ::particle* m_pallocator;
25 // frame
26 //::array<::particle_array > m_particleaOngoing;
27 ::pointer < ongoing_particle_array_source > m_pongoingparticlearraysource;
28
29
30 pool_group();
31 ~pool_group() override;
32
33
34 void on_initialize_particle() override;
35
36
37 virtual void call_ongoing(const ::call& call);
38
39
40 virtual ::particle_array* ongoing_particle_array();
41
42
43};
44
45
46
47
48
49template < typename TYPE >
50class pool
51{
52public:
53
54
55 pool_group* m_ppoolgroup;
56 ::pointer_array < TYPE > m_aPool;
57
58
59 pool()
60 {
61
62 m_ppoolgroup = nullptr;
63
64 }
65
66
67 ~pool()
68 {
69
70 }
71
72
73 TYPE* get()
74 {
75
76 _synchronous_lock synchronouslock(m_ppoolgroup->synchronization(), m_ppoolgroup, SYNCHRONOUS_LOCK_SUFFIX);
77
78 TYPE* pGet;
79
80 if (m_aPool.is_empty())
81 {
82
83 auto p = m_ppoolgroup->m_pallocator->createø<TYPE >();
84
85 p->m_ppool = this;
86
87 pGet = p;
88
89 m_ppoolgroup->ongoing_particle_array()->add(::transfer(p));
90
91 }
92 else
93 {
94
95 auto p = m_aPool.pop();
96
97 ASSERT(p->m_ppool == this);
98
99 if (p->m_bNew)
100 {
101
102 p->m_bNew = false;
103
104 }
105
106 pGet = p;
107
108 m_ppoolgroup->ongoing_particle_array()->add(::transfer(p));
109
110 }
111
112 return pGet;
113
114 }
115
116
117};
118
119
120
121
Definition synchronous_lock.h:31
Definition pool.h:20