acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
interlocked_count.h
1#pragma once
2
3
4#include "atomic.h"
5
6
7#if OSBIT == 64
8
9// memory must be aligned
10class INLINE_CLASS_DECL_ACME interlocked_i64
11{
12protected:
13
14
15 //::i8 m_sz[16];
16 //::i64 * m_plong;
17 ::i64 m_i64;
18
19
20public:
21
22
23
24 inline interlocked_i64(::i64 i = 0);
25
26
27 inline interlocked_i64(const interlocked_i64& ll);
28
29
30 inline interlocked_i64(interlocked_i64 && ll);
31
32
33 inline interlocked_i64& operator = (::i64 i);
34
35
36 inline operator ::i64() const;
37
38
39 inline ::i64 operator ++();
40 inline ::i64 operator--();
41 inline ::i64 operator ++(::i32);
42 inline ::i64 operator--(::i32);
43
44 inline interlocked_i64& operator +=(::i64 l);
45 inline interlocked_i64& operator-=(::i64 l);
46
47
48 inline ::i64 as_integer() const { return m_i64;}
49
50};
51
52
53#endif
54
55
56// memory must be aligned
57class INLINE_CLASS_DECL_ACME interlocked_int
58{
59protected:
60
61
62 //::i8 m_sz[8];
63 //::i32 * m_plong;
64 ::i32 m_i32;
65
66
67public:
68
69
70 inline interlocked_int(::i32 i = 0);
71
72 inline interlocked_int& operator = (::i32 i);
73
74 inline operator ::i32() const;
75
76
77 inline interlocked_int & operator ++();
78 inline interlocked_int & operator--();
79 inline ::i32 operator ++(::i32);
80 inline ::i32 operator--(::i32);
81
82
83 inline interlocked_int& operator +=(::i32 l);
84 inline interlocked_int& operator-=(::i32 l);
85
86
87 inline ::i32 as_integer() const { return m_i32;}
88
89
90};
91
92
93#if OSBIT == 32
94
95using interlocked_count = ::interlocked_int;
96
97#else
98
99using interlocked_count = ::interlocked_i64;
100
101#endif
102
103
104#if OSBIT == 64
105
106
107inline interlocked_i64::interlocked_i64(::i64 i) :
108 m_i64(i)
109{
110
111}
112
113
114inline interlocked_i64::interlocked_i64(const interlocked_i64 & ll) :
115 m_i64(ll.m_i64)
116{
117
118}
119
120
121inline interlocked_i64::interlocked_i64(interlocked_i64 && ll) :
122 m_i64(ll.m_i64)
123{
124 ll.m_i64 = 0;
125}
126
127
128inline interlocked_i64& interlocked_i64::operator = (::i64 i)
129{
130
131 atomic_assign64(&m_i64, i);
132
133 return *this;
134
135}
136
137
138inline interlocked_i64::operator ::i64() const
139{
140
141 return m_i64;
142
143}
144
145
146inline ::i64 interlocked_i64::operator ++()
147{
148
149 return atomic_increment64(&m_i64);
150
151}
152
153
154inline ::i64 interlocked_i64::operator--()
155{
156
157 return atomic_decrement64(&m_i64);
158
159}
160
161
162inline ::i64 interlocked_i64::operator ++(::i32)
163{
164
165 auto ll = m_i64;
166
167 atomic_increment64(&m_i64);
168
169 return ll;
170
171}
172
173
174inline ::i64 interlocked_i64::operator--(::i32)
175{
176
177 auto ll = m_i64;
178
179 atomic_decrement64(&m_i64);
180
181 return ll;
182
183}
184
185
186inline interlocked_i64& interlocked_i64::operator +=(::i64 ll)
187{
188
189 atomic_add64(&m_i64, ll);
190
191 return *this;
192
193}
194
195
196inline interlocked_i64& interlocked_i64::operator-=(::i64 ll)
197{
198
199 atomic_subtract64(&m_i64, ll);
200
201 return *this;
202
203}
204
205
206
207#endif
208
209
210
211//inline void interlocked_int::construct(::i32 l)
212//{
213//
214// m_plong = (::i32*)(((iptr)m_sz + 7) & ~7);
215//
216// *m_plong = l;
217//
218//}
219
220
221inline interlocked_int::interlocked_int(::i32 i) :
222 m_i32(i)
223{
224
225 //construct(l);
226
227}
228
229
230inline interlocked_int& interlocked_int::operator = (::i32 i)
231{
232
233 atomic_assign32(&m_i32, i);
234
235 return *this;
236
237}
238
239
240inline interlocked_int::operator ::i32() const
241{
242
243 return m_i32;
244
245}
246
247
248inline interlocked_int& interlocked_int::operator ++()
249{
250
251 atomic_increment32(&m_i32);
252
253 return *this;
254
255}
256
257
258inline interlocked_int& interlocked_int::operator--()
259{
260
261 atomic_decrement32(&m_i32);
262
263 return *this;
264
265}
266
267
268inline ::i32 interlocked_int::operator ++(::i32)
269{
270
271 auto i = m_i32;
272
273 atomic_increment32(&m_i32);
274
275 return i;
276
277}
278
279
280inline ::i32 interlocked_int::operator--(::i32)
281{
282
283 auto i = m_i32;
284
285 atomic_decrement32(&m_i32);
286
287 return i;
288
289}
290
291
292inline interlocked_int& interlocked_int::operator +=(::i32 i)
293{
294
295 atomic_add32(&m_i32, i);
296
297 return *this;
298
299}
300
301
302inline interlocked_int& interlocked_int::operator-=(::i32 l)
303{
304
305 atomic_subtract32(&m_i32, l);
306
307 return *this;
308
309}
310
311
312
Definition interlocked_count.h:58