COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
transport_fields_access.h
1//
2// Copyright 2016 - 2026 (C). Alex Robenko. All rights reserved.
3//
4// SPDX-License-Identifier: MPL-2.0
5//
6// This Source Code Form is subject to the terms of the Mozilla Public
7// License, v. 2.0. If a copy of the MPL was not distributed with this
8// file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#pragma once
11
12#include "comms/details/base_detection.h"
13#include "comms/details/gen_enum.h"
14#include "comms/details/macro_common.h"
15
16#include <tuple>
17
18#ifdef COMMS_MUST_DEFINE_BASE
19#define COMMS_ACCESS_TRANSPORT_FIELD_FUNC(T_, t_, n_) \
20 typename std::tuple_element<COMMS_CONCATENATE(TransportFieldIdx_, n_), typename Base::T_>::type& COMMS_CONCATENATE(transportField_, n_)()
21#define COMMS_ACCESS_TRANSPORT_FIELD_CONST_FUNC(T_, t_, n_) \
22 const typename std::tuple_element<COMMS_CONCATENATE(TransportFieldIdx_, n_), typename Base::T_>::type& COMMS_CONCATENATE(transportField_, n_)() const
23#define COMMS_MSG_TRANSPORT_FIELDS_ACCESS_FUNC \
24 typename Base::TransportFields& transportFields()
25#define COMMS_MSG_TRANSPORT_FIELDS_ACCESS_CONST_FUNC \
26 const typename Base::TransportFields& transportFields() const
27
28#else // #ifdef COMMS_MUST_DEFINE_BASE
29#define COMMS_ACCESS_TRANSPORT_FIELD_FUNC(T_, t_, n_) FUNC_AUTO_REF_RETURN(COMMS_CONCATENATE(transportField_, n_), decltype(std::get<COMMS_CONCATENATE(TransportFieldIdx_, n_)>(t_)))
30#define COMMS_ACCESS_TRANSPORT_FIELD_CONST_FUNC(T_, t_, n_) FUNC_AUTO_REF_RETURN_CONST(COMMS_CONCATENATE(transportField_, n_), decltype(std::get<COMMS_CONCATENATE(TransportFieldIdx_, n_)>(t_)))
31#define COMMS_MSG_TRANSPORT_FIELDS_ACCESS_FUNC FUNC_AUTO_REF_RETURN(transportFields, decltype(comms::toMessage(*this).transportFields()))
32#define COMMS_MSG_TRANSPORT_FIELDS_ACCESS_CONST_FUNC FUNC_AUTO_REF_RETURN_CONST(transportFields, decltype(comms::toMessage(*this).transportFields()))
33#endif // #ifdef COMMS_MUST_DEFINE_BASE
34
35#define COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
36 COMMS_ACCESS_TRANSPORT_FIELD_FUNC(T_, t_, n_) {\
37 return std::get<COMMS_CONCATENATE(TransportFieldIdx_, n_)>(t_); \
38 } \
39 COMMS_ACCESS_TRANSPORT_FIELD_CONST_FUNC(T_, t_, n_) {\
40 return std::get<COMMS_CONCATENATE(TransportFieldIdx_, n_)>(t_); \
41 }
42
43#define COMMS_TRANSPORT_FIELD_ACC_FUNC_1(T_, t_, n_) COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_)
44#define COMMS_TRANSPORT_FIELD_ACC_FUNC_2(T_, t_, n_, ...) \
45 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
46 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_1(T_, t_, __VA_ARGS__))
47#define COMMS_TRANSPORT_FIELD_ACC_FUNC_3(T_, t_, n_, ...) \
48 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
49 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_2(T_, t_, __VA_ARGS__))
50#define COMMS_TRANSPORT_FIELD_ACC_FUNC_4(T_, t_, n_, ...) \
51 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
52 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_3(T_, t_, __VA_ARGS__))
53#define COMMS_TRANSPORT_FIELD_ACC_FUNC_5(T_, t_, n_, ...) \
54 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
55 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_4(T_, t_, __VA_ARGS__))
56#define COMMS_TRANSPORT_FIELD_ACC_FUNC_6(T_, t_, n_, ...) \
57 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
58 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_5(T_, t_, __VA_ARGS__))
59#define COMMS_TRANSPORT_FIELD_ACC_FUNC_7(T_, t_, n_, ...) \
60 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
61 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_6(T_, t_, __VA_ARGS__))
62#define COMMS_TRANSPORT_FIELD_ACC_FUNC_8(T_, t_, n_, ...) \
63 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
64 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_7(T_, t_, __VA_ARGS__))
65#define COMMS_TRANSPORT_FIELD_ACC_FUNC_9(T_, t_, n_, ...) \
66 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
67 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_8(T_, t_, __VA_ARGS__))
68#define COMMS_TRANSPORT_FIELD_ACC_FUNC_10(T_, t_, n_, ...) \
69 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
70 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_9(T_, t_, __VA_ARGS__))
71#define COMMS_TRANSPORT_FIELD_ACC_FUNC_11(T_, t_, n_, ...) \
72 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
73 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_10(T_, t_, __VA_ARGS__))
74#define COMMS_TRANSPORT_FIELD_ACC_FUNC_12(T_, t_, n_, ...) \
75 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
76 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_11(T_, t_, __VA_ARGS__))
77#define COMMS_TRANSPORT_FIELD_ACC_FUNC_13(T_, t_, n_, ...) \
78 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
79 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_12(T_, t_, __VA_ARGS__))
80#define COMMS_TRANSPORT_FIELD_ACC_FUNC_14(T_, t_, n_, ...) \
81 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
82 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_13(T_, t_, __VA_ARGS__))
83#define COMMS_TRANSPORT_FIELD_ACC_FUNC_15(T_, t_, n_, ...) \
84 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
85 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_14(T_, t_, __VA_ARGS__))
86#define COMMS_TRANSPORT_FIELD_ACC_FUNC_16(T_, t_, n_, ...) \
87 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
88 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_15(T_, t_, __VA_ARGS__))
89#define COMMS_TRANSPORT_FIELD_ACC_FUNC_17(T_, t_, n_, ...) \
90 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
91 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_16(T_, t_, __VA_ARGS__))
92#define COMMS_TRANSPORT_FIELD_ACC_FUNC_18(T_, t_, n_, ...) \
93 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
94 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_17(T_, t_, __VA_ARGS__))
95#define COMMS_TRANSPORT_FIELD_ACC_FUNC_19(T_, t_, n_, ...) \
96 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
97 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_18(T_, t_, __VA_ARGS__))
98#define COMMS_TRANSPORT_FIELD_ACC_FUNC_20(T_, t_, n_, ...) \
99 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
100 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_19(T_, t_, __VA_ARGS__))
101#define COMMS_TRANSPORT_FIELD_ACC_FUNC_21(T_, t_, n_, ...) \
102 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
103 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_20(T_, t_, __VA_ARGS__))
104#define COMMS_TRANSPORT_FIELD_ACC_FUNC_22(T_, t_, n_, ...) \
105 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
106 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_21(T_, t_, __VA_ARGS__))
107#define COMMS_TRANSPORT_FIELD_ACC_FUNC_23(T_, t_, n_, ...) \
108 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
109 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_22(T_, t_, __VA_ARGS__))
110#define COMMS_TRANSPORT_FIELD_ACC_FUNC_24(T_, t_, n_, ...) \
111 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
112 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_23(T_, t_, __VA_ARGS__))
113#define COMMS_TRANSPORT_FIELD_ACC_FUNC_25(T_, t_, n_, ...) \
114 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
115 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_24(T_, t_, __VA_ARGS__))
116#define COMMS_TRANSPORT_FIELD_ACC_FUNC_26(T_, t_, n_, ...) \
117 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
118 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_25(T_, t_, __VA_ARGS__))
119#define COMMS_TRANSPORT_FIELD_ACC_FUNC_27(T_, t_, n_, ...) \
120 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
121 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_26(T_, t_, __VA_ARGS__))
122#define COMMS_TRANSPORT_FIELD_ACC_FUNC_28(T_, t_, n_, ...) \
123 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
124 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_27(T_, t_, __VA_ARGS__))
125#define COMMS_TRANSPORT_FIELD_ACC_FUNC_29(T_, t_, n_, ...) \
126 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
127 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_28(T_, t_, __VA_ARGS__))
128#define COMMS_TRANSPORT_FIELD_ACC_FUNC_30(T_, t_, n_, ...) \
129 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
130 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_29(T_, t_, __VA_ARGS__))
131#define COMMS_TRANSPORT_FIELD_ACC_FUNC_31(T_, t_, n_, ...) \
132 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
133 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_30(T_, t_, __VA_ARGS__))
134#define COMMS_TRANSPORT_FIELD_ACC_FUNC_32(T_, t_, n_, ...) \
135 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
136 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_31(T_, t_, __VA_ARGS__))
137#define COMMS_TRANSPORT_FIELD_ACC_FUNC_33(T_, t_, n_, ...) \
138 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
139 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_32(T_, t_, __VA_ARGS__))
140#define COMMS_TRANSPORT_FIELD_ACC_FUNC_34(T_, t_, n_, ...) \
141 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
142 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_33(T_, t_, __VA_ARGS__))
143#define COMMS_TRANSPORT_FIELD_ACC_FUNC_35(T_, t_, n_, ...) \
144 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
145 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_34(T_, t_, __VA_ARGS__))
146#define COMMS_TRANSPORT_FIELD_ACC_FUNC_36(T_, t_, n_, ...) \
147 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
148 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_35(T_, t_, __VA_ARGS__))
149#define COMMS_TRANSPORT_FIELD_ACC_FUNC_37(T_, t_, n_, ...) \
150 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
151 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_36(T_, t_, __VA_ARGS__))
152#define COMMS_TRANSPORT_FIELD_ACC_FUNC_38(T_, t_, n_, ...) \
153 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
154 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_37(T_, t_, __VA_ARGS__))
155#define COMMS_TRANSPORT_FIELD_ACC_FUNC_39(T_, t_, n_, ...) \
156 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
157 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_38(T_, t_, __VA_ARGS__))
158#define COMMS_TRANSPORT_FIELD_ACC_FUNC_40(T_, t_, n_, ...) \
159 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
160 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_39(T_, t_, __VA_ARGS__))
161#define COMMS_TRANSPORT_FIELD_ACC_FUNC_41(T_, t_, n_, ...) \
162 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
163 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_40(T_, t_, __VA_ARGS__))
164#define COMMS_TRANSPORT_FIELD_ACC_FUNC_42(T_, t_, n_, ...) \
165 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
166 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_41(T_, t_, __VA_ARGS__))
167#define COMMS_TRANSPORT_FIELD_ACC_FUNC_43(T_, t_, n_, ...) \
168 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
169 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_42(T_, t_, __VA_ARGS__))
170#define COMMS_TRANSPORT_FIELD_ACC_FUNC_44(T_, t_, n_, ...) \
171 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
172 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_43(T_, t_, __VA_ARGS__))
173#define COMMS_TRANSPORT_FIELD_ACC_FUNC_45(T_, t_, n_, ...) \
174 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
175 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_44(T_, t_, __VA_ARGS__))
176#define COMMS_TRANSPORT_FIELD_ACC_FUNC_46(T_, t_, n_, ...) \
177 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
178 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_45(T_, t_, __VA_ARGS__))
179#define COMMS_TRANSPORT_FIELD_ACC_FUNC_47(T_, t_, n_, ...) \
180 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
181 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_46(T_, t_, __VA_ARGS__))
182#define COMMS_TRANSPORT_FIELD_ACC_FUNC_48(T_, t_, n_, ...) \
183 COMMS_TRANSPORT_FIELD_ACC_FUNC(T_, t_, n_) \
184 COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_47(T_, t_, __VA_ARGS__))
185
186#define COMMS_CHOOSE_TRANSPORT_FIELD_ACC_FUNC_(N, T_, t_, ...) COMMS_EXPAND(COMMS_TRANSPORT_FIELD_ACC_FUNC_ ## N(T_, t_, __VA_ARGS__))
187#define COMMS_CHOOSE_TRANSPORT_FIELD_ACC_FUNC(N, T_, t_, ...) COMMS_EXPAND(COMMS_CHOOSE_TRANSPORT_FIELD_ACC_FUNC_(N, T_, t_, __VA_ARGS__))
188#define COMMS_DO_TRANSPORT_FIELD_ACC_FUNC(T_, t_, ...) \
189 COMMS_EXPAND(COMMS_CHOOSE_TRANSPORT_FIELD_ACC_FUNC(COMMS_NUM_ARGS(__VA_ARGS__), T_, t_, __VA_ARGS__))
190
191#define COMMS_DEFINE_TRANSPORT_FIELD_ENUM(...) COMMS_EXPAND(COMMS_DEFINE_ENUM(TransportFieldIdx, __VA_ARGS__));
192