COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
include
comms
details
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
Generated by
1.9.8