acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
Loading...
Searching...
No Matches
pair.h
1
#pragma once
2
3
4
#include "acme/prototype/prototype/transfer.h"
5
//#include "acme/prototype/prototype/_u32hash.h"
6
7
8
//#ifdef CPP17
9
//
10
//
11
//#define PAIR_IMPL(T1, T2, ARG_T1, ARG_T2, m_element1, m_element2)
12
//public:
13
//
14
//
15
// typedef T1 TYPE1;
16
// typedef ARG_T1 ARG_TYPE1;
17
// typedef T2 TYPE2;
18
// typedef ARG_T2 ARG_TYPE2;
19
//
20
//
21
// T1 m_element1;
22
// T2 m_element2;
23
//
24
//
25
// inline T1 & element1() { return m_element1; }
26
// inline T2 & element2() { return m_element2; }
27
// inline T1 & key() { return m_element1; }
28
// inline T2 & value() { return m_element2; }
29
//
30
// inline const T1 & element1() const { return m_element1; }
31
// inline const T2 & element2() const { return m_element2; }
32
// inline const T1 & key() const { return m_element1; }
33
// inline const T2 & value() const { return m_element2; }
34
//template<std::size_t N>
35
//auto & get() const {
36
// if constexpr (N == 0) return element1();
37
// else if constexpr (N == 1) return element2(); }
38
//
39
//template<std::size_t N>
40
//auto & get() {
41
//
42
// if constexpr (N == 0) return element1();
43
// else if constexpr (N == 1) return element2();
44
//}
45
//
46
//
47
//#else
48
//
49
//
50
//#define PAIR_IMPL(T1, T2, ARG_T1, ARG_T2, m_element1, m_element2)
51
52
//#define PAIR_TUPLE(PAIR, T1, T2, MEMBER1, MEMBER2) \
53
// template < > \
54
// struct std::tuple_element < 0, PAIR > \
55
// { \
56
// \
57
// using type = T1; \
58
// \
59
// }; \
60
// \
61
// \
62
// template < > \
63
// struct tuple_element < 1, PAIR > \
64
// { \
65
// \
66
// using type = T2; \
67
// \
68
// }; \
69
// \
70
//} \
71
//\
72
//template < > constexpr T1 & get<0>(PAIR & pair) { return pair.MEMBER1; } \
73
//template < > constexpr T2 & get<1>(PAIR & pair) { return pair.MEMBER2; } \
74
//template < > constexpr T1 && get<0>(PAIR && pair) { return pair.MEMBER1; } \
75
//template < > constexpr T2 && get<1>(PAIR && pair) { return pair.MEMBER2; } \
76
//template < > constexpr const T1 & get<0>(const PAIR & pair) { return pair.MEMBER1; } \
77
//template < > constexpr const T2 & get<1>(const PAIR & pair) { return pair.MEMBER2; } \
78
//template < > constexpr const T1 && get<0>(const PAIR && pair) { return pair.MEMBER1; } \
79
//template < > constexpr const T2 && get<1>(const PAIR && pair) { return pair.MEMBER2; }
80
81
#include "acme/memory/quantum.h"
82
83
84
#define MAKE_PAIR(PAIR, T1, T2, MEMBER1, MEMBER2) \
85
class PAIR : \
86
public memory_quantum\
87
{ \
88
public: \
89
\
90
\
91
using TYPE1 = T1; \
92
using TYPE2 = T2; \
93
using CONST_TYPE1 = ::const_of < TYPE1 >; \
94
using CONST_TYPE2 = ::const_of < TYPE2 >; \
95
using ARG_TYPE1 = ::argument_of < TYPE1 >;\
96
using ARG_TYPE2 = ::argument_of < TYPE2 >;\
97
\
98
\
99
T1 MEMBER1;\
100
T2 MEMBER2;\
101
\
102
\
103
inline T1 & element1() { return MEMBER1; } \
104
inline T2 & element2() { return MEMBER2; } \
105
inline CONST_TYPE1 & element1() const { return (CONST_TYPE1 &) MEMBER1; } \
106
inline CONST_TYPE2 & element2() const { return (CONST_TYPE2 &) MEMBER2; } \
107
inline T1 && transfer_element1() { return ::transfer(MEMBER1); } \
108
inline T2 && transfer_element2() { return ::transfer(MEMBER2); } \
109
inline CONST_TYPE1 && transfer_element1() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
110
inline CONST_TYPE2 && transfer_element2() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
111
inline T1 & key() { return MEMBER1; } \
112
inline T2 & value() { return MEMBER2; } \
113
inline CONST_TYPE1 & key() const { return (CONST_TYPE1 &) MEMBER1; } \
114
inline CONST_TYPE2 & value() const { return (CONST_TYPE2 &) MEMBER2; } \
115
inline T1 && transfer_key() { return ::transfer(MEMBER1); } \
116
inline T2 && transfer_value() { return ::transfer(MEMBER2); } \
117
inline CONST_TYPE1 && transfer_key() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
118
inline CONST_TYPE2 && transfer_value() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
119
\
120
\
121
PAIR() {} \
122
PAIR(ARG_TYPE1 t1) : MEMBER1(t1) {} \
123
PAIR(ARG_TYPE1 t1, ARG_TYPE2 t2) : MEMBER1(t1), MEMBER2(t2) {} \
124
\
125
\
126
}
127
128
129
130
#define MAKE_PAIR2(PAIR, T1, T2, MEMBER1, MEMBER2, member1, member2) \
131
class PAIR : \
132
public memory_quantum\
133
{ \
134
public: \
135
\
136
\
137
using TYPE1 = T1; \
138
using TYPE2 = T2; \
139
using CONST_TYPE1 = ::const_of < TYPE1 >; \
140
using CONST_TYPE2 = ::const_of < TYPE2 >; \
141
using ARG_TYPE1 = ::argument_of < TYPE1 >;\
142
using ARG_TYPE2 = ::argument_of < TYPE2 >;\
143
\
144
\
145
T1 MEMBER1;\
146
T2 MEMBER2;\
147
\
148
\
149
inline T1 & element1() { return MEMBER1; } \
150
inline T2 & element2() { return MEMBER2; } \
151
inline T1 & member1() { return MEMBER1; } \
152
inline T2 & member2() { return MEMBER2; } \
153
inline CONST_TYPE1 & element1() const { return (CONST_TYPE1 &) MEMBER1; } \
154
inline CONST_TYPE2 & element2() const { return (CONST_TYPE2 &) MEMBER2; } \
155
inline CONST_TYPE1 & member1() const { return (CONST_TYPE1 &) MEMBER1; } \
156
inline CONST_TYPE2 & member2() const { return (CONST_TYPE2 &) MEMBER2; } \
157
inline T1 && transfer_element1() { return ::transfer(MEMBER1); } \
158
inline T2 && transfer_element2() { return ::transfer(MEMBER2); } \
159
inline T1 && transfer_##member1() { return ::transfer(MEMBER1); } \
160
inline T2 && transfer_##member2() { return ::transfer(MEMBER2); } \
161
inline CONST_TYPE1 && transfer_element1() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
162
inline CONST_TYPE2 && transfer_element2() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
163
inline CONST_TYPE1 && transfer_##member1() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
164
inline CONST_TYPE2 && transfer_##member2() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
165
inline T1 & key() { return MEMBER1; } \
166
inline T2 & value() { return MEMBER2; } \
167
inline CONST_TYPE1 & key() const { return (CONST_TYPE1 &) MEMBER1; } \
168
inline CONST_TYPE2 & value() const { return (CONST_TYPE2 &) MEMBER2; } \
169
inline T1 && transfer_key() { return ::transfer(MEMBER1); } \
170
inline T2 && transfer_value() { return ::transfer(MEMBER2); } \
171
inline CONST_TYPE1 && transfer_key() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
172
inline CONST_TYPE2 && transfer_value() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
173
\
174
\
175
PAIR() {} \
176
PAIR(ARG_TYPE1 t1) : MEMBER1(t1) {} \
177
PAIR(ARG_TYPE1 t1, ARG_TYPE2 t2) : MEMBER1(t1), MEMBER2(t2) {} \
178
\
179
\
180
}
181
182
//#define MAKE_PAIR(PAIR, T1, T2, MEMBER1, MEMBER2) \
183
//_MAKE_PAIR(PAIR, T1, T2, MEMBER1, MEMBER2) \
184
//PAIR_TUPLE(PAIR, T1, T2, MEMBER1, MEMBER2)
185
186
187
188
template
<
typename
T1,
typename
T2 >
189
MAKE_PAIR(
pair
, T1, T2, m_element1, m_element2);
190
191
192
193
194
195
196
197
template
<
typename
PAIR >
198
class
make_pair :
199
public
PAIR
200
{
201
public
:
202
203
204
using
RAW_NODE = PAIR;
205
206
207
using
TYPE1 =
typename
PAIR::TYPE1;
208
using
TYPE2 =
typename
PAIR::TYPE2;
209
using
ARG_TYPE1 =
typename
PAIR::ARG_TYPE1;
210
using
ARG_TYPE2 =
typename
PAIR::ARG_TYPE2;
211
212
213
using
ELEMENT1 = TYPE1;
214
using
ELEMENT2 = TYPE2;
215
216
217
using
ARG_ELEMENT1 = ARG_TYPE1;
218
using
ARG_ELEMENT2 = ARG_TYPE2;
219
220
221
using
KEY = TYPE1;
222
using
PAYLOAD = TYPE2;
223
224
225
using
ARG_KEY = ARG_TYPE1;
226
using
ARG_PAYLOAD = ARG_TYPE2;
227
228
229
inline
auto
& key() {
return
this->element1(); }
230
inline
auto
& payload() {
return
this->element2(); }
231
inline
auto
& topic() {
return
*
this
; }
232
233
234
inline
auto
& key()
const
{
return
this->element1(); }
235
inline
auto
& payload()
const
{
return
this->element2(); }
236
inline
auto
& topic()
const
{
return
*
this
; }
237
238
239
inline
auto
transfer_key() { return ::transfer(this->transfer_element1()); }
240
inline
auto
transfer_payload() { return ::transfer(this->transfer_element2()); }
241
inline
auto
transfer_topic() { return ::transfer(*
this
); }
242
243
inline
auto
transfer() { return ::transfer(*
this
); }
244
245
make_pair() {}
246
make_pair(ARG_TYPE1 t1) : PAIR(t1) {}
247
make_pair(ARG_TYPE1 t1, ARG_TYPE2 t2) : PAIR(t1, t2) {}
248
249
250
void
defer_set_payload(ARG_PAYLOAD payload)
251
{
252
253
this->element2() = payload;
254
255
}
256
257
};
258
259
260
#if defined(__ANDROID__)
261
262
#define ALIENATED_ANDROID_ANARCHY class
263
264
#else
265
266
#define ALIENATED_ANDROID_ANARCHY struct
267
268
#endif
269
270
271
template
<
typename
A,
typename
B >
pair
(A, B) ->
pair< A, B >
;
272
273
template
<
typename
A,
typename
B >
make_pair
(A, B) -> make_pair < pair< A, B > >;
274
275
276
//#include <utility>
277
278
//#include <tuple>
279
280
281
template
<
typename
T1,
typename
T2 >
282
::hash32
as_hash32(const ::pair < T1, T2 >&
pair
)
283
{
284
285
return
hash32
(
hash32
(
pair
.element1()) +
hash32
(
pair
.transfer_element1()));
286
287
}
288
289
290
template
<
typename
T1,
typename
T2,
typename
T3,
typename
T4 >
291
bool
operator ==(const ::pair < T1, T2 >& pair1, const ::pair < T3, T4 >& pair2)
292
{
293
294
return
pair1.element1() == pair2.element1()
295
&& pair1.element2() == pair2.element2();
296
297
298
}
299
300
301
make_pair
Definition
pair.h:200
pair
Definition
_template_forward_declaration.h:327
hash32
Definition
hash32.h:14
prototype
collection
pair.h
Generated by
1.17.0