COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
bits_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#ifdef COMMS_MUST_DEFINE_BASE
17#define COMMS_AS_BITMASK_FUNC Base& asBitmask()
18#define COMMS_AS_BITMASK_CONST_FUNC const Base& asBitmask() const
19#else // #ifdef COMMS_MUST_DEFINE_BASE
20#define COMMS_AS_BITMASK_FUNC FUNC_AUTO_REF_RETURN(asBitmask, decltype(comms::field::toFieldBase(*this)))
21#define COMMS_AS_BITMASK_CONST_FUNC FUNC_AUTO_REF_RETURN_CONST(asBitmask, decltype(comms::field::toFieldBase(*this)))
22#endif // #ifdef COMMS_MUST_DEFINE_BASE
23
24#define COMMS_BIT_ACC_FUNC(f_, n_) \
25 bool COMMS_CONCATENATE(getBitValue_, n_)() const {\
26 return f_.getBitValue(COMMS_CONCATENATE(BitIdx_, n_)); \
27 } \
28 void COMMS_CONCATENATE(setBitValue_, n_)(bool val) {\
29 f_.setBitValue(COMMS_CONCATENATE(BitIdx_, n_), val); \
30 }
31
32#define COMMS_BIT_ACC_FUNC_1(f_, n_) COMMS_BIT_ACC_FUNC(f_, n_)
33#define COMMS_BIT_ACC_FUNC_2(f_, n_, ...) \
34 COMMS_BIT_ACC_FUNC(f_, n_) \
35 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_1(f_, __VA_ARGS__))
36#define COMMS_BIT_ACC_FUNC_3(f_, n_, ...) \
37 COMMS_BIT_ACC_FUNC(f_, n_) \
38 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_2(f_, __VA_ARGS__))
39#define COMMS_BIT_ACC_FUNC_4(f_, n_, ...) \
40 COMMS_BIT_ACC_FUNC(f_, n_) \
41 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_3(f_, __VA_ARGS__))
42#define COMMS_BIT_ACC_FUNC_5(f_, n_, ...) \
43 COMMS_BIT_ACC_FUNC(f_, n_) \
44 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_4(f_, __VA_ARGS__))
45#define COMMS_BIT_ACC_FUNC_6(f_, n_, ...) \
46 COMMS_BIT_ACC_FUNC(f_, n_) \
47 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_5(f_, __VA_ARGS__))
48#define COMMS_BIT_ACC_FUNC_7(f_, n_, ...) \
49 COMMS_BIT_ACC_FUNC(f_, n_) \
50 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_6(f_, __VA_ARGS__))
51#define COMMS_BIT_ACC_FUNC_8(f_, n_, ...) \
52 COMMS_BIT_ACC_FUNC(f_, n_) \
53 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_7(f_, __VA_ARGS__))
54#define COMMS_BIT_ACC_FUNC_9(f_, n_, ...) \
55 COMMS_BIT_ACC_FUNC(f_, n_) \
56 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_8(f_, __VA_ARGS__))
57#define COMMS_BIT_ACC_FUNC_10(f_, n_, ...) \
58 COMMS_BIT_ACC_FUNC(f_, n_) \
59 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_9(f_, __VA_ARGS__))
60#define COMMS_BIT_ACC_FUNC_11(f_, n_, ...) \
61 COMMS_BIT_ACC_FUNC(f_, n_) \
62 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_10(f_, __VA_ARGS__))
63#define COMMS_BIT_ACC_FUNC_12(f_, n_, ...) \
64 COMMS_BIT_ACC_FUNC(f_, n_) \
65 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_11(f_, __VA_ARGS__))
66#define COMMS_BIT_ACC_FUNC_13(f_, n_, ...) \
67 COMMS_BIT_ACC_FUNC(f_, n_) \
68 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_12(f_, __VA_ARGS__))
69#define COMMS_BIT_ACC_FUNC_14(f_, n_, ...) \
70 COMMS_BIT_ACC_FUNC(f_, n_) \
71 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_13(f_, __VA_ARGS__))
72#define COMMS_BIT_ACC_FUNC_15(f_, n_, ...) \
73 COMMS_BIT_ACC_FUNC(f_, n_) \
74 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_14(f_, __VA_ARGS__))
75#define COMMS_BIT_ACC_FUNC_16(f_, n_, ...) \
76 COMMS_BIT_ACC_FUNC(f_, n_) \
77 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_15(f_, __VA_ARGS__))
78#define COMMS_BIT_ACC_FUNC_17(f_, n_, ...) \
79 COMMS_BIT_ACC_FUNC(f_, n_) \
80 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_16(f_, __VA_ARGS__))
81#define COMMS_BIT_ACC_FUNC_18(f_, n_, ...) \
82 COMMS_BIT_ACC_FUNC(f_, n_) \
83 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_17(f_, __VA_ARGS__))
84#define COMMS_BIT_ACC_FUNC_19(f_, n_, ...) \
85 COMMS_BIT_ACC_FUNC(f_, n_) \
86 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_18(f_, __VA_ARGS__))
87#define COMMS_BIT_ACC_FUNC_20(f_, n_, ...) \
88 COMMS_BIT_ACC_FUNC(f_, n_) \
89 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_19(f_, __VA_ARGS__))
90#define COMMS_BIT_ACC_FUNC_21(f_, n_, ...) \
91 COMMS_BIT_ACC_FUNC(f_, n_) \
92 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_20(f_, __VA_ARGS__))
93#define COMMS_BIT_ACC_FUNC_22(f_, n_, ...) \
94 COMMS_BIT_ACC_FUNC(f_, n_) \
95 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_21(f_, __VA_ARGS__))
96#define COMMS_BIT_ACC_FUNC_23(f_, n_, ...) \
97 COMMS_BIT_ACC_FUNC(f_, n_) \
98 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_22(f_, __VA_ARGS__))
99#define COMMS_BIT_ACC_FUNC_24(f_, n_, ...) \
100 COMMS_BIT_ACC_FUNC(f_, n_) \
101 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_23(f_, __VA_ARGS__))
102#define COMMS_BIT_ACC_FUNC_25(f_, n_, ...) \
103 COMMS_BIT_ACC_FUNC(f_, n_) \
104 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_24(f_, __VA_ARGS__))
105#define COMMS_BIT_ACC_FUNC_26(f_, n_, ...) \
106 COMMS_BIT_ACC_FUNC(f_, n_) \
107 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_25(f_, __VA_ARGS__))
108#define COMMS_BIT_ACC_FUNC_27(f_, n_, ...) \
109 COMMS_BIT_ACC_FUNC(f_, n_) \
110 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_26(f_, __VA_ARGS__))
111#define COMMS_BIT_ACC_FUNC_28(f_, n_, ...) \
112 COMMS_BIT_ACC_FUNC(f_, n_) \
113 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_27(f_, __VA_ARGS__))
114#define COMMS_BIT_ACC_FUNC_29(f_, n_, ...) \
115 COMMS_BIT_ACC_FUNC(f_, n_) \
116 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_28(f_, __VA_ARGS__))
117#define COMMS_BIT_ACC_FUNC_30(f_, n_, ...) \
118 COMMS_BIT_ACC_FUNC(f_, n_) \
119 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_29(f_, __VA_ARGS__))
120#define COMMS_BIT_ACC_FUNC_31(f_, n_, ...) \
121 COMMS_BIT_ACC_FUNC(f_, n_) \
122 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_30(f_, __VA_ARGS__))
123#define COMMS_BIT_ACC_FUNC_32(f_, n_, ...) \
124 COMMS_BIT_ACC_FUNC(f_, n_) \
125 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_31(f_, __VA_ARGS__))
126#define COMMS_BIT_ACC_FUNC_33(f_, n_, ...) \
127 COMMS_BIT_ACC_FUNC(f_, n_) \
128 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_32(f_, __VA_ARGS__))
129#define COMMS_BIT_ACC_FUNC_34(f_, n_, ...) \
130 COMMS_BIT_ACC_FUNC(f_, n_) \
131 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_33(f_, __VA_ARGS__))
132#define COMMS_BIT_ACC_FUNC_35(f_, n_, ...) \
133 COMMS_BIT_ACC_FUNC(f_, n_) \
134 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_34(f_, __VA_ARGS__))
135#define COMMS_BIT_ACC_FUNC_36(f_, n_, ...) \
136 COMMS_BIT_ACC_FUNC(f_, n_) \
137 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_35(f_, __VA_ARGS__))
138#define COMMS_BIT_ACC_FUNC_37(f_, n_, ...) \
139 COMMS_BIT_ACC_FUNC(f_, n_) \
140 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_36(f_, __VA_ARGS__))
141#define COMMS_BIT_ACC_FUNC_38(f_, n_, ...) \
142 COMMS_BIT_ACC_FUNC(f_, n_) \
143 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_37(f_, __VA_ARGS__))
144#define COMMS_BIT_ACC_FUNC_39(f_, n_, ...) \
145 COMMS_BIT_ACC_FUNC(f_, n_) \
146 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_38(f_, __VA_ARGS__))
147#define COMMS_BIT_ACC_FUNC_40(f_, n_, ...) \
148 COMMS_BIT_ACC_FUNC(f_, n_) \
149 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_39(f_, __VA_ARGS__))
150#define COMMS_BIT_ACC_FUNC_41(f_, n_, ...) \
151 COMMS_BIT_ACC_FUNC(f_, n_) \
152 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_40(f_, __VA_ARGS__))
153#define COMMS_BIT_ACC_FUNC_42(f_, n_, ...) \
154 COMMS_BIT_ACC_FUNC(f_, n_) \
155 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_41(f_, __VA_ARGS__))
156#define COMMS_BIT_ACC_FUNC_43(f_, n_, ...) \
157 COMMS_BIT_ACC_FUNC(f_, n_) \
158 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_42(f_, __VA_ARGS__))
159#define COMMS_BIT_ACC_FUNC_44(f_, n_, ...) \
160 COMMS_BIT_ACC_FUNC(f_, n_) \
161 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_43(f_, __VA_ARGS__))
162#define COMMS_BIT_ACC_FUNC_45(f_, n_, ...) \
163 COMMS_BIT_ACC_FUNC(f_, n_) \
164 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_44(f_, __VA_ARGS__))
165#define COMMS_BIT_ACC_FUNC_46(f_, n_, ...) \
166 COMMS_BIT_ACC_FUNC(f_, n_) \
167 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_45(f_, __VA_ARGS__))
168#define COMMS_BIT_ACC_FUNC_47(f_, n_, ...) \
169 COMMS_BIT_ACC_FUNC(f_, n_) \
170 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_46(f_, __VA_ARGS__))
171#define COMMS_BIT_ACC_FUNC_48(f_, n_, ...) \
172 COMMS_BIT_ACC_FUNC(f_, n_) \
173 COMMS_EXPAND(COMMS_BIT_ACC_FUNC_47(f_, __VA_ARGS__))
174
175#define COMMS_CHOOSE_BIT_ACC_FUNC_(N, f_, ...) COMMS_EXPAND(COMMS_BIT_ACC_FUNC_ ## N(f_, __VA_ARGS__))
176#define COMMS_CHOOSE_BIT_ACC_FUNC(N, f_, ...) COMMS_EXPAND(COMMS_CHOOSE_BIT_ACC_FUNC_(N, f_, __VA_ARGS__))
177#define COMMS_DO_BIT_ACC_FUNC(f_, ...) \
178 COMMS_EXPAND(COMMS_CHOOSE_BIT_ACC_FUNC(COMMS_NUM_ARGS(__VA_ARGS__), f_, __VA_ARGS__))
179