acme
Foundational cross-platform layer of the ca2 framework
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) \
85class PAIR : \
86 public memory_quantum\
87{ \
88public: \
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) \
131class PAIR : \
132public memory_quantum\
133{ \
134public: \
135\
136\
137using TYPE1 = T1; \
138using TYPE2 = T2; \
139using CONST_TYPE1 = ::const_of < TYPE1 >; \
140using CONST_TYPE2 = ::const_of < TYPE2 >; \
141using ARG_TYPE1 = ::argument_of < TYPE1 >;\
142using ARG_TYPE2 = ::argument_of < TYPE2 >;\
143\
144\
145T1 MEMBER1;\
146T2 MEMBER2;\
147\
148\
149inline T1 & element1() { return MEMBER1; } \
150inline T2 & element2() { return MEMBER2; } \
151inline T1 & member1() { return MEMBER1; } \
152inline T2 & member2() { return MEMBER2; } \
153inline CONST_TYPE1 & element1() const { return (CONST_TYPE1 &) MEMBER1; } \
154inline CONST_TYPE2 & element2() const { return (CONST_TYPE2 &) MEMBER2; } \
155inline CONST_TYPE1 & member1() const { return (CONST_TYPE1 &) MEMBER1; } \
156inline CONST_TYPE2 & member2() const { return (CONST_TYPE2 &) MEMBER2; } \
157inline T1 && transfer_element1() { return ::transfer(MEMBER1); } \
158inline T2 && transfer_element2() { return ::transfer(MEMBER2); } \
159inline T1 && transfer_##member1() { return ::transfer(MEMBER1); } \
160inline T2 && transfer_##member2() { return ::transfer(MEMBER2); } \
161inline CONST_TYPE1 && transfer_element1() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
162inline CONST_TYPE2 && transfer_element2() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
163inline CONST_TYPE1 && transfer_##member1() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
164inline CONST_TYPE2 && transfer_##member2() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
165inline T1 & key() { return MEMBER1; } \
166inline T2 & value() { return MEMBER2; } \
167inline CONST_TYPE1 & key() const { return (CONST_TYPE1 &) MEMBER1; } \
168inline CONST_TYPE2 & value() const { return (CONST_TYPE2 &) MEMBER2; } \
169inline T1 && transfer_key() { return ::transfer(MEMBER1); } \
170inline T2 && transfer_value() { return ::transfer(MEMBER2); } \
171inline CONST_TYPE1 && transfer_key() const { return (CONST_TYPE1 &&) ::transfer(MEMBER1); } \
172inline CONST_TYPE2 && transfer_value() const { return (CONST_TYPE2 &&) ::transfer(MEMBER2); } \
173\
174\
175PAIR() {} \
176PAIR(ARG_TYPE1 t1) : MEMBER1(t1) {} \
177PAIR(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
188template < typename T1, typename T2 >
189MAKE_PAIR(pair, T1, T2, m_element1, m_element2);
190
191
192
193
194
195
196
197template < typename PAIR >
198class make_pair :
199 public PAIR
200{
201public:
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
271template < typename A, typename B > pair(A, B) -> pair< A, B >;
272
273template < typename A, typename B > make_pair(A, B) -> make_pair < pair< A, B > >;
274
275
276//#include <utility>
277
278//#include <tuple>
279
280
281template < 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
290template < typename T1, typename T2, typename T3, typename T4 >
291bool 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
Definition pair.h:200
Definition _template_forward_declaration.h:327
Definition hash32.h:14