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