COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
variant_access.h
1//
2// Copyright 2017 - 2025 (C). Alex Robenko. All rights reserved.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
8#pragma once
9
10
11#include "comms/details/base_detection.h"
12#include "comms/details/gen_enum.h"
13#include "comms/details/macro_common.h"
14
15#include <tuple>
16#include <type_traits>
17#include <utility>
18
19#ifdef COMMS_MUST_DEFINE_BASE
20#define COMMS_AS_VARIANT_FUNC Base& asVariant()
21#define COMMS_AS_VARIANT_CONST_FUNC const Base& asVariant() const
22#define COMMS_VARIANT_INIT_FIELD_FUNC(v_, n_) \
23 typename std::tuple_element<COMMS_CONCATENATE(FieldIdx_, n_), typename Base::Members>::type& COMMS_CONCATENATE(initField_, n_)(TArgs&&... args)
24#define COMMS_VARIANT_ACCESS_FIELD_FUNC(v_, n_) \
25 typename std::tuple_element<COMMS_CONCATENATE(FieldIdx_, n_), typename Base::Members>::type& COMMS_CONCATENATE(accessField_, n_)()
26#define COMMS_VARIANT_ACCESS_FIELD_CONST_FUNC(v_, n_) \
27 const typename std::tuple_element<COMMS_CONCATENATE(FieldIdx_, n_), typename Base::Members>::type& COMMS_CONCATENATE(accessField_, n_)() const
28
29#else // #ifdef COMMS_MUST_DEFINE_BASE
30#define COMMS_AS_VARIANT_FUNC FUNC_AUTO_REF_RETURN(asVariant, decltype(comms::field::toFieldBase(*this)))
31#define COMMS_AS_VARIANT_CONST_FUNC FUNC_AUTO_REF_RETURN_CONST(asVariant, decltype(comms::field::toFieldBase(*this)))
32#define COMMS_VARIANT_INIT_FIELD_FUNC(v_, n_) \
33 FUNC_ARGS_AUTO_REF_RETURN(COMMS_CONCATENATE(initField_, n_), TArgs&&... args, decltype(v_.template initField<COMMS_CONCATENATE(FieldIdx_, n_)>(std::forward<TArgs>(args)...)))
34#define COMMS_VARIANT_ACCESS_FIELD_FUNC(v_, n_) \
35 FUNC_AUTO_REF_RETURN(COMMS_CONCATENATE(accessField_, n_), decltype(v_.template accessField<COMMS_CONCATENATE(FieldIdx_, n_)>()))
36#define COMMS_VARIANT_ACCESS_FIELD_CONST_FUNC(v_, n_) \
37 FUNC_AUTO_REF_RETURN_CONST(COMMS_CONCATENATE(accessField_, n_), decltype(v_.template accessField<COMMS_CONCATENATE(FieldIdx_, n_)>()))
38#endif // #ifdef COMMS_MUST_DEFINE_BASE
39
40#define COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
41 template <typename... TArgs> \
42 COMMS_VARIANT_INIT_FIELD_FUNC(v_, n_) {\
43 return v_.template initField<COMMS_CONCATENATE(FieldIdx_, n_)>(std::forward<TArgs>(args)...); \
44 } \
45 void COMMS_CONCATENATE(deinitField_, n_)() {\
46 v_.template deinitField<COMMS_CONCATENATE(FieldIdx_, n_)>(); \
47 } \
48 COMMS_VARIANT_ACCESS_FIELD_FUNC(v_, n_) { \
49 return v_.template accessField<COMMS_CONCATENATE(FieldIdx_, n_)>(); \
50 } \
51 COMMS_VARIANT_ACCESS_FIELD_CONST_FUNC(v_, n_) { \
52 return v_.template accessField<COMMS_CONCATENATE(FieldIdx_, n_)>(); \
53 }
54
55#define COMMS_VARIANT_MEM_ACC_FUNC_1(v_, n_) COMMS_VARIANT_MEM_ACC_FUNC(v_, n_)
56#define COMMS_VARIANT_MEM_ACC_FUNC_2(v_, n_, ...) \
57 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
58 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_1(v_, __VA_ARGS__))
59#define COMMS_VARIANT_MEM_ACC_FUNC_3(v_, n_, ...) \
60 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
61 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_2(v_, __VA_ARGS__))
62#define COMMS_VARIANT_MEM_ACC_FUNC_4(v_, n_, ...) \
63 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
64 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_3(v_, __VA_ARGS__))
65#define COMMS_VARIANT_MEM_ACC_FUNC_5(v_, n_, ...) \
66 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
67 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_4(v_, __VA_ARGS__))
68#define COMMS_VARIANT_MEM_ACC_FUNC_6(v_, n_, ...) \
69 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
70 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_5(v_, __VA_ARGS__))
71#define COMMS_VARIANT_MEM_ACC_FUNC_7(v_, n_, ...) \
72 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
73 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_6(v_, __VA_ARGS__))
74#define COMMS_VARIANT_MEM_ACC_FUNC_8(v_, n_, ...) \
75 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
76 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_7(v_, __VA_ARGS__))
77#define COMMS_VARIANT_MEM_ACC_FUNC_9(v_, n_, ...) \
78 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
79 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_8(v_, __VA_ARGS__))
80#define COMMS_VARIANT_MEM_ACC_FUNC_10(v_, n_, ...) \
81 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
82 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_9(v_, __VA_ARGS__))
83#define COMMS_VARIANT_MEM_ACC_FUNC_11(v_, n_, ...) \
84 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
85 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_10(v_, __VA_ARGS__))
86#define COMMS_VARIANT_MEM_ACC_FUNC_12(v_, n_, ...) \
87 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
88 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_11(v_, __VA_ARGS__))
89#define COMMS_VARIANT_MEM_ACC_FUNC_13(v_, n_, ...) \
90 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
91 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_12(v_, __VA_ARGS__))
92#define COMMS_VARIANT_MEM_ACC_FUNC_14(v_, n_, ...) \
93 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
94 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_13(v_, __VA_ARGS__))
95#define COMMS_VARIANT_MEM_ACC_FUNC_15(v_, n_, ...) \
96 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
97 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_14(v_, __VA_ARGS__))
98#define COMMS_VARIANT_MEM_ACC_FUNC_16(v_, n_, ...) \
99 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
100 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_15(v_, __VA_ARGS__))
101#define COMMS_VARIANT_MEM_ACC_FUNC_17(v_, n_, ...) \
102 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
103 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_16(v_, __VA_ARGS__))
104#define COMMS_VARIANT_MEM_ACC_FUNC_18(v_, n_, ...) \
105 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
106 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_17(v_, __VA_ARGS__))
107#define COMMS_VARIANT_MEM_ACC_FUNC_19(v_, n_, ...) \
108 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
109 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_18(v_, __VA_ARGS__))
110#define COMMS_VARIANT_MEM_ACC_FUNC_20(v_, n_, ...) \
111 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
112 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_19(v_, __VA_ARGS__))
113#define COMMS_VARIANT_MEM_ACC_FUNC_21(v_, n_, ...) \
114 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
115 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_20(v_, __VA_ARGS__))
116#define COMMS_VARIANT_MEM_ACC_FUNC_22(v_, n_, ...) \
117 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
118 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_21(v_, __VA_ARGS__))
119#define COMMS_VARIANT_MEM_ACC_FUNC_23(v_, n_, ...) \
120 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
121 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_22(v_, __VA_ARGS__))
122#define COMMS_VARIANT_MEM_ACC_FUNC_24(v_, n_, ...) \
123 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
124 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_23(v_, __VA_ARGS__))
125#define COMMS_VARIANT_MEM_ACC_FUNC_25(v_, n_, ...) \
126 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
127 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_24(v_, __VA_ARGS__))
128#define COMMS_VARIANT_MEM_ACC_FUNC_26(v_, n_, ...) \
129 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
130 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_25(v_, __VA_ARGS__))
131#define COMMS_VARIANT_MEM_ACC_FUNC_27(v_, n_, ...) \
132 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
133 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_26(v_, __VA_ARGS__))
134#define COMMS_VARIANT_MEM_ACC_FUNC_28(v_, n_, ...) \
135 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
136 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_27(v_, __VA_ARGS__))
137#define COMMS_VARIANT_MEM_ACC_FUNC_29(v_, n_, ...) \
138 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
139 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_28(v_, __VA_ARGS__))
140#define COMMS_VARIANT_MEM_ACC_FUNC_30(v_, n_, ...) \
141 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
142 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_29(v_, __VA_ARGS__))
143#define COMMS_VARIANT_MEM_ACC_FUNC_31(v_, n_, ...) \
144 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
145 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_30(v_, __VA_ARGS__))
146#define COMMS_VARIANT_MEM_ACC_FUNC_32(v_, n_, ...) \
147 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
148 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_31(v_, __VA_ARGS__))
149#define COMMS_VARIANT_MEM_ACC_FUNC_33(v_, n_, ...) \
150 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
151 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_32(v_, __VA_ARGS__))
152#define COMMS_VARIANT_MEM_ACC_FUNC_34(v_, n_, ...) \
153 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
154 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_33(v_, __VA_ARGS__))
155#define COMMS_VARIANT_MEM_ACC_FUNC_35(v_, n_, ...) \
156 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
157 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_34(v_, __VA_ARGS__))
158#define COMMS_VARIANT_MEM_ACC_FUNC_36(v_, n_, ...) \
159 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
160 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_35(v_, __VA_ARGS__))
161#define COMMS_VARIANT_MEM_ACC_FUNC_37(v_, n_, ...) \
162 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
163 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_36(v_, __VA_ARGS__))
164#define COMMS_VARIANT_MEM_ACC_FUNC_38(v_, n_, ...) \
165 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
166 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_37(v_, __VA_ARGS__))
167#define COMMS_VARIANT_MEM_ACC_FUNC_39(v_, n_, ...) \
168 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
169 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_38(v_, __VA_ARGS__))
170#define COMMS_VARIANT_MEM_ACC_FUNC_40(v_, n_, ...) \
171 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
172 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_39(v_, __VA_ARGS__))
173#define COMMS_VARIANT_MEM_ACC_FUNC_41(v_, n_, ...) \
174 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
175 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_40(v_, __VA_ARGS__))
176#define COMMS_VARIANT_MEM_ACC_FUNC_42(v_, n_, ...) \
177 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
178 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_41(v_, __VA_ARGS__))
179#define COMMS_VARIANT_MEM_ACC_FUNC_43(v_, n_, ...) \
180 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
181 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_42(v_, __VA_ARGS__))
182#define COMMS_VARIANT_MEM_ACC_FUNC_44(v_, n_, ...) \
183 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
184 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_43(v_, __VA_ARGS__))
185#define COMMS_VARIANT_MEM_ACC_FUNC_45(v_, n_, ...) \
186 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
187 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_44(v_, __VA_ARGS__))
188#define COMMS_VARIANT_MEM_ACC_FUNC_46(v_, n_, ...) \
189 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
190 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_45(v_, __VA_ARGS__))
191#define COMMS_VARIANT_MEM_ACC_FUNC_47(v_, n_, ...) \
192 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
193 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_46(v_, __VA_ARGS__))
194#define COMMS_VARIANT_MEM_ACC_FUNC_48(v_, n_, ...) \
195 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
196 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_47(v_, __VA_ARGS__))
197#define COMMS_VARIANT_MEM_ACC_FUNC_49(v_, n_, ...) \
198 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
199 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_48(v_, __VA_ARGS__))
200#define COMMS_VARIANT_MEM_ACC_FUNC_50(v_, n_, ...) \
201 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
202 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_49(v_, __VA_ARGS__))
203#define COMMS_VARIANT_MEM_ACC_FUNC_51(v_, n_, ...) \
204 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
205 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_50(v_, __VA_ARGS__))
206#define COMMS_VARIANT_MEM_ACC_FUNC_52(v_, n_, ...) \
207 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
208 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_51(v_, __VA_ARGS__))
209#define COMMS_VARIANT_MEM_ACC_FUNC_53(v_, n_, ...) \
210 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
211 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_52(v_, __VA_ARGS__))
212#define COMMS_VARIANT_MEM_ACC_FUNC_54(v_, n_, ...) \
213 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
214 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_53(v_, __VA_ARGS__))
215#define COMMS_VARIANT_MEM_ACC_FUNC_55(v_, n_, ...) \
216 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
217 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_54(v_, __VA_ARGS__))
218#define COMMS_VARIANT_MEM_ACC_FUNC_56(v_, n_, ...) \
219 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
220 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_55(v_, __VA_ARGS__))
221#define COMMS_VARIANT_MEM_ACC_FUNC_57(v_, n_, ...) \
222 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
223 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_56(v_, __VA_ARGS__))
224#define COMMS_VARIANT_MEM_ACC_FUNC_58(v_, n_, ...) \
225 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
226 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_57(v_, __VA_ARGS__))
227#define COMMS_VARIANT_MEM_ACC_FUNC_59(v_, n_, ...) \
228 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
229 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_58(v_, __VA_ARGS__))
230#define COMMS_VARIANT_MEM_ACC_FUNC_60(v_, n_, ...) \
231 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
232 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_59(v_, __VA_ARGS__))
233#define COMMS_VARIANT_MEM_ACC_FUNC_61(v_, n_, ...) \
234 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
235 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_60(v_, __VA_ARGS__))
236#define COMMS_VARIANT_MEM_ACC_FUNC_62(v_, n_, ...) \
237 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
238 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_61(v_, __VA_ARGS__))
239#define COMMS_VARIANT_MEM_ACC_FUNC_63(v_, n_, ...) \
240 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
241 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_62(v_, __VA_ARGS__))
242#define COMMS_VARIANT_MEM_ACC_FUNC_64(v_, n_, ...) \
243 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
244 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_63(v_, __VA_ARGS__))
245#define COMMS_VARIANT_MEM_ACC_FUNC_65(v_, n_, ...) \
246 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
247 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_64(v_, __VA_ARGS__))
248#define COMMS_VARIANT_MEM_ACC_FUNC_66(v_, n_, ...) \
249 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
250 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_65(v_, __VA_ARGS__))
251#define COMMS_VARIANT_MEM_ACC_FUNC_67(v_, n_, ...) \
252 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
253 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_66(v_, __VA_ARGS__))
254#define COMMS_VARIANT_MEM_ACC_FUNC_68(v_, n_, ...) \
255 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
256 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_67(v_, __VA_ARGS__))
257#define COMMS_VARIANT_MEM_ACC_FUNC_69(v_, n_, ...) \
258 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
259 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_68(v_, __VA_ARGS__))
260#define COMMS_VARIANT_MEM_ACC_FUNC_70(v_, n_, ...) \
261 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
262 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_69(v_, __VA_ARGS__))
263#define COMMS_VARIANT_MEM_ACC_FUNC_71(v_, n_, ...) \
264 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
265 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_70(v_, __VA_ARGS__))
266#define COMMS_VARIANT_MEM_ACC_FUNC_72(v_, n_, ...) \
267 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
268 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_71(v_, __VA_ARGS__))
269#define COMMS_VARIANT_MEM_ACC_FUNC_73(v_, n_, ...) \
270 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
271 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_72(v_, __VA_ARGS__))
272#define COMMS_VARIANT_MEM_ACC_FUNC_74(v_, n_, ...) \
273 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
274 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_73(v_, __VA_ARGS__))
275#define COMMS_VARIANT_MEM_ACC_FUNC_75(v_, n_, ...) \
276 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
277 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_74(v_, __VA_ARGS__))
278#define COMMS_VARIANT_MEM_ACC_FUNC_76(v_, n_, ...) \
279 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
280 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_75(v_, __VA_ARGS__))
281#define COMMS_VARIANT_MEM_ACC_FUNC_77(v_, n_, ...) \
282 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
283 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_76(v_, __VA_ARGS__))
284#define COMMS_VARIANT_MEM_ACC_FUNC_78(v_, n_, ...) \
285 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
286 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_77(v_, __VA_ARGS__))
287#define COMMS_VARIANT_MEM_ACC_FUNC_79(v_, n_, ...) \
288 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
289 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_78(v_, __VA_ARGS__))
290#define COMMS_VARIANT_MEM_ACC_FUNC_80(v_, n_, ...) \
291 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
292 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_79(v_, __VA_ARGS__))
293#define COMMS_VARIANT_MEM_ACC_FUNC_81(v_, n_, ...) \
294 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
295 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_80(v_, __VA_ARGS__))
296#define COMMS_VARIANT_MEM_ACC_FUNC_82(v_, n_, ...) \
297 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
298 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_81(v_, __VA_ARGS__))
299#define COMMS_VARIANT_MEM_ACC_FUNC_83(v_, n_, ...) \
300 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
301 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_82(v_, __VA_ARGS__))
302#define COMMS_VARIANT_MEM_ACC_FUNC_84(v_, n_, ...) \
303 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
304 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_83(v_, __VA_ARGS__))
305#define COMMS_VARIANT_MEM_ACC_FUNC_85(v_, n_, ...) \
306 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
307 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_84(v_, __VA_ARGS__))
308#define COMMS_VARIANT_MEM_ACC_FUNC_86(v_, n_, ...) \
309 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
310 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_85(v_, __VA_ARGS__))
311#define COMMS_VARIANT_MEM_ACC_FUNC_87(v_, n_, ...) \
312 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
313 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_86(v_, __VA_ARGS__))
314#define COMMS_VARIANT_MEM_ACC_FUNC_88(v_, n_, ...) \
315 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
316 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_87(v_, __VA_ARGS__))
317#define COMMS_VARIANT_MEM_ACC_FUNC_89(v_, n_, ...) \
318 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
319 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_88(v_, __VA_ARGS__))
320#define COMMS_VARIANT_MEM_ACC_FUNC_90(v_, n_, ...) \
321 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
322 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_89(v_, __VA_ARGS__))
323#define COMMS_VARIANT_MEM_ACC_FUNC_91(v_, n_, ...) \
324 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
325 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_90(v_, __VA_ARGS__))
326#define COMMS_VARIANT_MEM_ACC_FUNC_92(v_, n_, ...) \
327 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
328 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_91(v_, __VA_ARGS__))
329#define COMMS_VARIANT_MEM_ACC_FUNC_93(v_, n_, ...) \
330 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
331 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_92(v_, __VA_ARGS__))
332#define COMMS_VARIANT_MEM_ACC_FUNC_94(v_, n_, ...) \
333 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
334 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_93(v_, __VA_ARGS__))
335#define COMMS_VARIANT_MEM_ACC_FUNC_95(v_, n_, ...) \
336 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
337 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_94(v_, __VA_ARGS__))
338#define COMMS_VARIANT_MEM_ACC_FUNC_96(v_, n_, ...) \
339 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
340 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_95(v_, __VA_ARGS__))
341#define COMMS_VARIANT_MEM_ACC_FUNC_97(v_, n_, ...) \
342 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
343 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_96(v_, __VA_ARGS__))
344#define COMMS_VARIANT_MEM_ACC_FUNC_98(v_, n_, ...) \
345 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
346 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_97(v_, __VA_ARGS__))
347#define COMMS_VARIANT_MEM_ACC_FUNC_99(v_, n_, ...) \
348 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
349 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_98(v_, __VA_ARGS__))
350#define COMMS_VARIANT_MEM_ACC_FUNC_100(v_, n_, ...) \
351 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
352 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_99(v_, __VA_ARGS__))
353#define COMMS_VARIANT_MEM_ACC_FUNC_101(v_, n_, ...) \
354 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
355 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_100(v_, __VA_ARGS__))
356#define COMMS_VARIANT_MEM_ACC_FUNC_102(v_, n_, ...) \
357 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
358 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_101(v_, __VA_ARGS__))
359#define COMMS_VARIANT_MEM_ACC_FUNC_103(v_, n_, ...) \
360 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
361 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_102(v_, __VA_ARGS__))
362#define COMMS_VARIANT_MEM_ACC_FUNC_104(v_, n_, ...) \
363 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
364 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_103(v_, __VA_ARGS__))
365#define COMMS_VARIANT_MEM_ACC_FUNC_105(v_, n_, ...) \
366 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
367 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_104(v_, __VA_ARGS__))
368#define COMMS_VARIANT_MEM_ACC_FUNC_106(v_, n_, ...) \
369 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
370 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_105(v_, __VA_ARGS__))
371#define COMMS_VARIANT_MEM_ACC_FUNC_107(v_, n_, ...) \
372 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
373 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_106(v_, __VA_ARGS__))
374#define COMMS_VARIANT_MEM_ACC_FUNC_108(v_, n_, ...) \
375 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
376 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_107(v_, __VA_ARGS__))
377#define COMMS_VARIANT_MEM_ACC_FUNC_109(v_, n_, ...) \
378 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
379 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_108(v_, __VA_ARGS__))
380#define COMMS_VARIANT_MEM_ACC_FUNC_110(v_, n_, ...) \
381 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
382 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_109(v_, __VA_ARGS__))
383#define COMMS_VARIANT_MEM_ACC_FUNC_111(v_, n_, ...) \
384 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
385 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_110(v_, __VA_ARGS__))
386#define COMMS_VARIANT_MEM_ACC_FUNC_112(v_, n_, ...) \
387 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
388 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_111(v_, __VA_ARGS__))
389#define COMMS_VARIANT_MEM_ACC_FUNC_113(v_, n_, ...) \
390 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
391 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_112(v_, __VA_ARGS__))
392#define COMMS_VARIANT_MEM_ACC_FUNC_114(v_, n_, ...) \
393 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
394 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_113(v_, __VA_ARGS__))
395#define COMMS_VARIANT_MEM_ACC_FUNC_115(v_, n_, ...) \
396 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
397 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_114(v_, __VA_ARGS__))
398#define COMMS_VARIANT_MEM_ACC_FUNC_116(v_, n_, ...) \
399 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
400 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_115(v_, __VA_ARGS__))
401#define COMMS_VARIANT_MEM_ACC_FUNC_117(v_, n_, ...) \
402 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
403 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_116(v_, __VA_ARGS__))
404#define COMMS_VARIANT_MEM_ACC_FUNC_118(v_, n_, ...) \
405 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
406 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_117(v_, __VA_ARGS__))
407#define COMMS_VARIANT_MEM_ACC_FUNC_119(v_, n_, ...) \
408 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
409 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_118(v_, __VA_ARGS__))
410#define COMMS_VARIANT_MEM_ACC_FUNC_120(v_, n_, ...) \
411 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
412 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_119(v_, __VA_ARGS__))
413#define COMMS_VARIANT_MEM_ACC_FUNC_121(v_, n_, ...) \
414 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
415 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_120(v_, __VA_ARGS__))
416#define COMMS_VARIANT_MEM_ACC_FUNC_122(v_, n_, ...) \
417 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
418 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_121(v_, __VA_ARGS__))
419#define COMMS_VARIANT_MEM_ACC_FUNC_123(v_, n_, ...) \
420 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
421 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_122(v_, __VA_ARGS__))
422#define COMMS_VARIANT_MEM_ACC_FUNC_124(v_, n_, ...) \
423 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
424 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_123(v_, __VA_ARGS__))
425#define COMMS_VARIANT_MEM_ACC_FUNC_125(v_, n_, ...) \
426 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
427 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_124(v_, __VA_ARGS__))
428#define COMMS_VARIANT_MEM_ACC_FUNC_126(v_, n_, ...) \
429 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
430 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_125(v_, __VA_ARGS__))
431#define COMMS_VARIANT_MEM_ACC_FUNC_127(v_, n_, ...) \
432 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
433 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_126(v_, __VA_ARGS__))
434#define COMMS_VARIANT_MEM_ACC_FUNC_128(v_, n_, ...) \
435 COMMS_VARIANT_MEM_ACC_FUNC(v_, n_) \
436 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_127(v_, __VA_ARGS__))
437
438#define COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC_(N, v_, ...) COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_ ## N(v_, __VA_ARGS__))
439#define COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC(N, v_, ...) COMMS_EXPAND(COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC_(N, v_, __VA_ARGS__))
440#define COMMS_DO_VARIANT_MEM_ACC_FUNC(v_, ...) \
441 COMMS_EXPAND(COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC(COMMS_NUM_ARGS(__VA_ARGS__), v_, __VA_ARGS__))
442
443// --------------------------------------------
444
445#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
446 template <typename... TArgs> \
447 typename std::tuple_element<COMMS_CONCATENATE(FieldIdx_, n_), Members>::type& COMMS_CONCATENATE(initField_, n_)(TArgs&&... args) {\
448 return initField<COMMS_CONCATENATE(FieldIdx_, n_)>(std::forward<TArgs>(args)...); \
449 } \
450 typename std::tuple_element<COMMS_CONCATENATE(FieldIdx_, n_), Members>::type& COMMS_CONCATENATE(accessField_, n_)() { \
451 return accessField<COMMS_CONCATENATE(FieldIdx_, n_)>(); \
452 } \
453 const typename std::tuple_element<COMMS_CONCATENATE(FieldIdx_, n_), Members>::type& COMMS_CONCATENATE(accessField_, n_)() const { \
454 return accessField<COMMS_CONCATENATE(FieldIdx_, n_)>(); \
455 }
456
457#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_1(n_) COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_)
458#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_2(n_, ...) \
459 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
460 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_1(__VA_ARGS__))
461#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_3(n_, ...) \
462 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
463 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_2(__VA_ARGS__))
464#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_4(n_, ...) \
465 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
466 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_3(__VA_ARGS__))
467#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_5(n_, ...) \
468 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
469 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_4(__VA_ARGS__))
470#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_6(n_, ...) \
471 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
472 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_5(__VA_ARGS__))
473#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_7(n_, ...) \
474 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
475 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_6(__VA_ARGS__))
476#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_8(n_, ...) \
477 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
478 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_7(__VA_ARGS__))
479#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_9(n_, ...) \
480 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
481 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_8(__VA_ARGS__))
482#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_10(n_, ...) \
483 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
484 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_9(__VA_ARGS__))
485#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_11(n_, ...) \
486 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
487 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_10(__VA_ARGS__))
488#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_12(n_, ...) \
489 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
490 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_11(__VA_ARGS__))
491#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_13(n_, ...) \
492 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
493 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_12(__VA_ARGS__))
494#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_14(n_, ...) \
495 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
496 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_13(__VA_ARGS__))
497#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_15(n_, ...) \
498 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
499 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_14(__VA_ARGS__))
500#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_16(n_, ...) \
501 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
502 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_15(__VA_ARGS__))
503#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_17(n_, ...) \
504 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
505 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_16(__VA_ARGS__))
506#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_18(n_, ...) \
507 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
508 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_17(__VA_ARGS__))
509#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_19(n_, ...) \
510 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
511 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_18(__VA_ARGS__))
512#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_20(n_, ...) \
513 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
514 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_19(__VA_ARGS__))
515#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_21(n_, ...) \
516 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
517 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_20(__VA_ARGS__))
518#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_22(n_, ...) \
519 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
520 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_21(__VA_ARGS__))
521#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_23(n_, ...) \
522 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
523 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_22(__VA_ARGS__))
524#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_24(n_, ...) \
525 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
526 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_23(__VA_ARGS__))
527#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_25(n_, ...) \
528 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
529 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_24(__VA_ARGS__))
530#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_26(n_, ...) \
531 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
532 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_25(__VA_ARGS__))
533#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_27(n_, ...) \
534 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
535 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_26(__VA_ARGS__))
536#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_28(n_, ...) \
537 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
538 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_27(__VA_ARGS__))
539#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_29(n_, ...) \
540 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
541 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_28(__VA_ARGS__))
542#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_30(n_, ...) \
543 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
544 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_29(__VA_ARGS__))
545#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_31(n_, ...) \
546 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
547 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_30(__VA_ARGS__))
548#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_32(n_, ...) \
549 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
550 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_31(__VA_ARGS__))
551#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_33(n_, ...) \
552 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
553 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_32(__VA_ARGS__))
554#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_34(n_, ...) \
555 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
556 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_33(__VA_ARGS__))
557#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_35(n_, ...) \
558 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
559 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_34(__VA_ARGS__))
560#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_36(n_, ...) \
561 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
562 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_35(__VA_ARGS__))
563#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_37(n_, ...) \
564 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
565 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_36(__VA_ARGS__))
566#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_38(n_, ...) \
567 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
568 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_37(__VA_ARGS__))
569#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_39(n_, ...) \
570 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
571 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_38(__VA_ARGS__))
572#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_40(n_, ...) \
573 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
574 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_39(__VA_ARGS__))
575#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_41(n_, ...) \
576 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
577 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_40(__VA_ARGS__))
578#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_42(n_, ...) \
579 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
580 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_41(__VA_ARGS__))
581#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_43(n_, ...) \
582 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
583 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_42(__VA_ARGS__))
584#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_44(n_, ...) \
585 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
586 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_43(__VA_ARGS__))
587#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_45(n_, ...) \
588 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
589 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_44(__VA_ARGS__))
590#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_46(n_, ...) \
591 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
592 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_45(__VA_ARGS__))
593#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_47(n_, ...) \
594 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
595 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_46(__VA_ARGS__))
596#define COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_48(n_, ...) \
597 COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(n_) \
598 COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_47(__VA_ARGS__))
599
600#define COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_(N, ...) COMMS_EXPAND(COMMS_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_ ## N(__VA_ARGS__))
601#define COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(N, ...) COMMS_EXPAND(COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC_NOTEMPLATE_(N, __VA_ARGS__))
602#define COMMS_DO_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(...) \
603 COMMS_EXPAND(COMMS_CHOOSE_VARIANT_MEM_ACC_FUNC_NOTEMPLATE(COMMS_NUM_ARGS(__VA_ARGS__), __VA_ARGS__))
604
605
606
607
608
609
610
611
612
613
614