ProtoCore v1.0.16
Deterministic, zero-heap network stack for embedded targets
Loading...
Searching...
No Matches
ns_contract.h
Go to the documentation of this file.
1// ProtoCore v1.0.16 - Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3#ifndef PROTOCORE_NS_CONTRACT_H
4#define PROTOCORE_NS_CONTRACT_H
5
6/**
7 * @file ns_contract.h
8 * @brief What a namespace IS: how its table is stored, how its slots are pinned, and how a call
9 * with several operands is written.
10 *
11 * Taken from MMgr (include/MMgr/src/mmgr_compiler_directives.h), which is the shape this tree is
12 * converging on. The three pieces are the whole contract:
13 *
14 * PROTOCORE_NS the table is `static const`, which is what lets a call through it inline
15 * PROTOCORE_NS_LAYOUT every entry is pinned to its dispatch slot, at compile time
16 * PROTOCORE_CALL an entry's operands travel as a compound literal, not on a shared global
17 *
18 * @author Douglas Quigg (dstroy0)
19 * @date 2026
20 */
21
22#include <assert.h> // static_assert, which every pin below is written with
23#include <stddef.h> // offsetof
24
25/**
26 * @brief Suppress the unused warning. Every module ends in a namespace most callers only partly use.
27 *
28 * The table is `static const` in the header, so a translation unit that includes the module and
29 * calls two of its twelve entries still declares all twelve, and a plain -Wunused build would
30 * report the ones it did not reach.
31 */
32#ifndef PROTOCORE_UNUSED
33#if defined(__GNUC__) || defined(__clang__)
34#define PROTOCORE_UNUSED __attribute__((unused))
35#else
36#define PROTOCORE_UNUSED
37#endif
38#endif
39
40/** @brief Paste two tokens after expanding both. */
41#define PROTOCORE_CAT_(a, b) a##b
42#define PROTOCORE_CAT(a, b) PROTOCORE_CAT_(a, b)
43
44/** @brief Count variadic arguments, up to 72 - the longest dispatch table in the tree is 69. */
45#define PROTOCORE_NARG(...) \
46 PROTOCORE_NARG_(__VA_ARGS__, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, \
47 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, \
48 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, \
49 0)
50#define PROTOCORE_NARG_(...) PROTOCORE_ARG_N(__VA_ARGS__)
51#define PROTOCORE_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
52 _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \
53 _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, \
54 _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, _71, _72, N, ...) \
55 N
56
57/**
58 * @brief Call an entry with a compound literal, so the aggregate never appears at the call site.
59 *
60 * #define protocore_sha256_hash(...) PROTOCORE_CALL(protocore_sha256_hash_at, Sha256HashArgs, __VA_ARGS__)
61 * Sha256.hash(.data = p, .len = n, .out = digest);
62 *
63 * This is what replaces the operands global. Writing `Sha256V.hash_args.data = p;` before every call
64 * put one module's arguments in a place every other translation unit can reach and every reentrant
65 * path can overwrite; a compound literal is the caller's, lives on the caller's stack, and cannot be
66 * read by anyone else.
67 *
68 * Two properties come from the standard rather than the compiler, so they hold on every target:
69 * unnamed fields are zero initialised, which is how a default costs nothing and is never spelled;
70 * and a compound literal in argument position lives until the end of the enclosing block, so the
71 * entry may hold the pointer for the whole call.
72 *
73 * Designated initialisers are the intended spelling. A positional call still compiles, but -Wextra
74 * reports the fields it left behind and designated calls it does not.
75 */
76#define PROTOCORE_CALL(entry, ArgsType, ...) entry(&(ArgsType){__VA_ARGS__})
77
78/** @brief Size of a function pointer. Not void *, which is the wrong ruler where code and data
79 * pointers differ in width. */
80#define PROTOCORE_FP_SIZE (sizeof(void (*)(void)))
81
82/** @brief Assert one member sits at one dispatch slot. */
83#define PROTOCORE_NS_SLOT(T, member, slot) \
84 static_assert(offsetof(T, member) == (size_t)(slot) * PROTOCORE_FP_SIZE, \
85 #T "." #member " is not at dispatch slot " #slot)
86
87/*
88 * Unrolled rather than recursive, because a failed assert should name the member and the slot and
89 * nothing else. One line per arity.
90 */
91#define PROTOCORE_NS_L1(T, a1) PROTOCORE_NS_SLOT(T, a1, 0);
92#define PROTOCORE_NS_L2(T, a1, a2) PROTOCORE_NS_L1(T, a1) PROTOCORE_NS_SLOT(T, a2, 1);
93#define PROTOCORE_NS_L3(T, a1, a2, a3) PROTOCORE_NS_L2(T, a1, a2) PROTOCORE_NS_SLOT(T, a3, 2);
94#define PROTOCORE_NS_L4(T, a1, a2, a3, a4) PROTOCORE_NS_L3(T, a1, a2, a3) PROTOCORE_NS_SLOT(T, a4, 3);
95#define PROTOCORE_NS_L5(T, a1, a2, a3, a4, a5) PROTOCORE_NS_L4(T, a1, a2, a3, a4) PROTOCORE_NS_SLOT(T, a5, 4);
96#define PROTOCORE_NS_L6(T, a1, a2, a3, a4, a5, a6) PROTOCORE_NS_L5(T, a1, a2, a3, a4, a5) PROTOCORE_NS_SLOT(T, a6, 5);
97#define PROTOCORE_NS_L7(T, a1, a2, a3, a4, a5, a6, a7) \
98 PROTOCORE_NS_L6(T, a1, a2, a3, a4, a5, a6) PROTOCORE_NS_SLOT(T, a7, 6);
99#define PROTOCORE_NS_L8(T, a1, a2, a3, a4, a5, a6, a7, a8) \
100 PROTOCORE_NS_L7(T, a1, a2, a3, a4, a5, a6, a7) PROTOCORE_NS_SLOT(T, a8, 7);
101#define PROTOCORE_NS_L9(T, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
102 PROTOCORE_NS_L8(T, a1, a2, a3, a4, a5, a6, a7, a8) PROTOCORE_NS_SLOT(T, a9, 8);
103#define PROTOCORE_NS_L10(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
104 PROTOCORE_NS_L9(T, a1, a2, a3, a4, a5, a6, a7, a8, a9) PROTOCORE_NS_SLOT(T, a10, 9);
105#define PROTOCORE_NS_L11(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
106 PROTOCORE_NS_L10(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) PROTOCORE_NS_SLOT(T, a11, 10);
107#define PROTOCORE_NS_L12(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
108 PROTOCORE_NS_L11(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) PROTOCORE_NS_SLOT(T, a12, 11);
109#define PROTOCORE_NS_L13(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
110 PROTOCORE_NS_L12(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) PROTOCORE_NS_SLOT(T, a13, 12);
111#define PROTOCORE_NS_L14(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) \
112 PROTOCORE_NS_L13(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) PROTOCORE_NS_SLOT(T, a14, 13);
113#define PROTOCORE_NS_L15(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) \
114 PROTOCORE_NS_L14(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) PROTOCORE_NS_SLOT(T, a15, 14);
115#define PROTOCORE_NS_L16(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) \
116 PROTOCORE_NS_L15(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) PROTOCORE_NS_SLOT(T, a16, 15);
117#define PROTOCORE_NS_L17(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) \
118 PROTOCORE_NS_L16(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) \
119 PROTOCORE_NS_SLOT(T, a17, 16);
120#define PROTOCORE_NS_L18(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) \
121 PROTOCORE_NS_L17(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) \
122 PROTOCORE_NS_SLOT(T, a18, 17);
123#define PROTOCORE_NS_L19(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
124 PROTOCORE_NS_L18(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) \
125 PROTOCORE_NS_SLOT(T, a19, 18);
126#define PROTOCORE_NS_L20(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) \
127 PROTOCORE_NS_L19(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
128 PROTOCORE_NS_SLOT(T, a20, 19);
129#define PROTOCORE_NS_L21(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
130 a21) \
131 PROTOCORE_NS_L20(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) \
132 PROTOCORE_NS_SLOT(T, a21, 20);
133#define PROTOCORE_NS_L22(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
134 a21, a22) \
135 PROTOCORE_NS_L21(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
136 a21) \
137 PROTOCORE_NS_SLOT(T, a22, 21);
138#define PROTOCORE_NS_L23(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
139 a21, a22, a23) \
140 PROTOCORE_NS_L22(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
141 a21, a22) \
142 PROTOCORE_NS_SLOT(T, a23, 22);
143#define PROTOCORE_NS_L24(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
144 a21, a22, a23, a24) \
145 PROTOCORE_NS_L23(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
146 a21, a22, a23) \
147 PROTOCORE_NS_SLOT(T, a24, 23);
148#define PROTOCORE_NS_L25(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
149 a21, a22, a23, a24, a25) \
150 PROTOCORE_NS_L24(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
151 a21, a22, a23, a24) \
152 PROTOCORE_NS_SLOT(T, a25, 24);
153#define PROTOCORE_NS_L26(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
154 a21, a22, a23, a24, a25, a26) \
155 PROTOCORE_NS_L25(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
156 a21, a22, a23, a24, a25) \
157 PROTOCORE_NS_SLOT(T, a26, 25);
158#define PROTOCORE_NS_L27(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
159 a21, a22, a23, a24, a25, a26, a27) \
160 PROTOCORE_NS_L26(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
161 a21, a22, a23, a24, a25, a26) \
162 PROTOCORE_NS_SLOT(T, a27, 26);
163#define PROTOCORE_NS_L28(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
164 a21, a22, a23, a24, a25, a26, a27, a28) \
165 PROTOCORE_NS_L27(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
166 a21, a22, a23, a24, a25, a26, a27) \
167 PROTOCORE_NS_SLOT(T, a28, 27);
168#define PROTOCORE_NS_L29(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
169 a21, a22, a23, a24, a25, a26, a27, a28, a29) \
170 PROTOCORE_NS_L28(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
171 a21, a22, a23, a24, a25, a26, a27, a28) \
172 PROTOCORE_NS_SLOT(T, a29, 28);
173#define PROTOCORE_NS_L30(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
174 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30) \
175 PROTOCORE_NS_L29(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
176 a21, a22, a23, a24, a25, a26, a27, a28, a29) \
177 PROTOCORE_NS_SLOT(T, a30, 29);
178#define PROTOCORE_NS_L31(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
179 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31) \
180 PROTOCORE_NS_L30(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
181 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30) \
182 PROTOCORE_NS_SLOT(T, a31, 30);
183#define PROTOCORE_NS_L32(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
184 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32) \
185 PROTOCORE_NS_L31(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
186 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31) \
187 PROTOCORE_NS_SLOT(T, a32, 31);
188#define PROTOCORE_NS_L33(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
189 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33) \
190 PROTOCORE_NS_L32(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
191 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32) \
192 PROTOCORE_NS_SLOT(T, a33, 32);
193#define PROTOCORE_NS_L34(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
194 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34) \
195 PROTOCORE_NS_L33(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
196 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33) \
197 PROTOCORE_NS_SLOT(T, a34, 33);
198#define PROTOCORE_NS_L35(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
199 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35) \
200 PROTOCORE_NS_L34(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
201 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34) \
202 PROTOCORE_NS_SLOT(T, a35, 34);
203#define PROTOCORE_NS_L36(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
204 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36) \
205 PROTOCORE_NS_L35(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
206 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35) \
207 PROTOCORE_NS_SLOT(T, a36, 35);
208#define PROTOCORE_NS_L37(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
209 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37) \
210 PROTOCORE_NS_L36(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
211 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36) \
212 PROTOCORE_NS_SLOT(T, a37, 36);
213#define PROTOCORE_NS_L38(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
214 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38) \
215 PROTOCORE_NS_L37(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
216 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37) \
217 PROTOCORE_NS_SLOT(T, a38, 37);
218#define PROTOCORE_NS_L39(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
219 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
220 a39) \
221 PROTOCORE_NS_L38(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
222 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38) \
223 PROTOCORE_NS_SLOT(T, a39, 38);
224#define PROTOCORE_NS_L40(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
225 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
226 a39, a40) \
227 PROTOCORE_NS_L39(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
228 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39) \
229 PROTOCORE_NS_SLOT(T, a40, 39);
230#define PROTOCORE_NS_L41(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
231 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
232 a39, a40, a41) \
233 PROTOCORE_NS_L40(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
234 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
235 a40) \
236 PROTOCORE_NS_SLOT(T, a41, 40);
237#define PROTOCORE_NS_L42(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
238 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
239 a39, a40, a41, a42) \
240 PROTOCORE_NS_L41(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
241 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
242 a40, a41) \
243 PROTOCORE_NS_SLOT(T, a42, 41);
244#define PROTOCORE_NS_L43(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
245 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
246 a39, a40, a41, a42, a43) \
247 PROTOCORE_NS_L42(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
248 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
249 a40, a41, a42) \
250 PROTOCORE_NS_SLOT(T, a43, 42);
251#define PROTOCORE_NS_L44(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
252 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
253 a39, a40, a41, a42, a43, a44) \
254 PROTOCORE_NS_L43(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
255 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
256 a40, a41, a42, a43) \
257 PROTOCORE_NS_SLOT(T, a44, 43);
258#define PROTOCORE_NS_L45(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
259 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
260 a39, a40, a41, a42, a43, a44, a45) \
261 PROTOCORE_NS_L44(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
262 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
263 a40, a41, a42, a43, a44) \
264 PROTOCORE_NS_SLOT(T, a45, 44);
265#define PROTOCORE_NS_L46(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
266 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
267 a39, a40, a41, a42, a43, a44, a45, a46) \
268 PROTOCORE_NS_L45(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
269 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
270 a40, a41, a42, a43, a44, a45) \
271 PROTOCORE_NS_SLOT(T, a46, 45);
272#define PROTOCORE_NS_L47(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
273 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
274 a39, a40, a41, a42, a43, a44, a45, a46, a47) \
275 PROTOCORE_NS_L46(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
276 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
277 a40, a41, a42, a43, a44, a45, a46) \
278 PROTOCORE_NS_SLOT(T, a47, 46);
279#define PROTOCORE_NS_L48(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
280 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
281 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48) \
282 PROTOCORE_NS_L47(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
283 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
284 a40, a41, a42, a43, a44, a45, a46, a47) \
285 PROTOCORE_NS_SLOT(T, a48, 47);
286#define PROTOCORE_NS_L49(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
287 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
288 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49) \
289 PROTOCORE_NS_L48(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
290 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
291 a40, a41, a42, a43, a44, a45, a46, a47, a48) \
292 PROTOCORE_NS_SLOT(T, a49, 48);
293#define PROTOCORE_NS_L50(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
294 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
295 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50) \
296 PROTOCORE_NS_L49(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
297 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
298 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49) \
299 PROTOCORE_NS_SLOT(T, a50, 49);
300#define PROTOCORE_NS_L51(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
301 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
302 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51) \
303 PROTOCORE_NS_L50(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
304 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
305 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50) \
306 PROTOCORE_NS_SLOT(T, a51, 50);
307#define PROTOCORE_NS_L52(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
308 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
309 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52) \
310 PROTOCORE_NS_L51(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
311 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
312 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51) \
313 PROTOCORE_NS_SLOT(T, a52, 51);
314#define PROTOCORE_NS_L53(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
315 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
316 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53) \
317 PROTOCORE_NS_L52(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
318 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
319 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52) \
320 PROTOCORE_NS_SLOT(T, a53, 52);
321#define PROTOCORE_NS_L54(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
322 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
323 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54) \
324 PROTOCORE_NS_L53(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
325 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
326 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53) \
327 PROTOCORE_NS_SLOT(T, a54, 53);
328#define PROTOCORE_NS_L55(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
329 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
330 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55) \
331 PROTOCORE_NS_L54(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
332 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
333 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54) \
334 PROTOCORE_NS_SLOT(T, a55, 54);
335#define PROTOCORE_NS_L56(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
336 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
337 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56) \
338 PROTOCORE_NS_L55(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
339 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
340 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55) \
341 PROTOCORE_NS_SLOT(T, a56, 55);
342#define PROTOCORE_NS_L57(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
343 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
344 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
345 a57) \
346 PROTOCORE_NS_L56(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
347 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
348 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56) \
349 PROTOCORE_NS_SLOT(T, a57, 56);
350#define PROTOCORE_NS_L58(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
351 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
352 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
353 a57, a58) \
354 PROTOCORE_NS_L57(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
355 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
356 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57) \
357 PROTOCORE_NS_SLOT(T, a58, 57);
358#define PROTOCORE_NS_L59(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
359 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
360 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
361 a57, a58, a59) \
362 PROTOCORE_NS_L58(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
363 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
364 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58) \
365 PROTOCORE_NS_SLOT(T, a59, 58);
366#define PROTOCORE_NS_L60(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
367 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
368 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
369 a57, a58, a59, a60) \
370 PROTOCORE_NS_L59(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
371 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
372 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
373 a59) \
374 PROTOCORE_NS_SLOT(T, a60, 59);
375#define PROTOCORE_NS_L61(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
376 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
377 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
378 a57, a58, a59, a60, a61) \
379 PROTOCORE_NS_L60(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
380 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
381 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
382 a59, a60) \
383 PROTOCORE_NS_SLOT(T, a61, 60);
384#define PROTOCORE_NS_L62(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
385 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
386 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
387 a57, a58, a59, a60, a61, a62) \
388 PROTOCORE_NS_L61(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
389 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
390 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
391 a59, a60, a61) \
392 PROTOCORE_NS_SLOT(T, a62, 61);
393#define PROTOCORE_NS_L63(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
394 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
395 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
396 a57, a58, a59, a60, a61, a62, a63) \
397 PROTOCORE_NS_L62(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
398 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
399 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
400 a59, a60, a61, a62) \
401 PROTOCORE_NS_SLOT(T, a63, 62);
402#define PROTOCORE_NS_L64(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
403 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
404 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
405 a57, a58, a59, a60, a61, a62, a63, a64) \
406 PROTOCORE_NS_L63(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
407 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
408 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
409 a59, a60, a61, a62, a63) \
410 PROTOCORE_NS_SLOT(T, a64, 63);
411#define PROTOCORE_NS_L65(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
412 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
413 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
414 a57, a58, a59, a60, a61, a62, a63, a64, a65) \
415 PROTOCORE_NS_L64(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
416 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
417 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
418 a59, a60, a61, a62, a63, a64) \
419 PROTOCORE_NS_SLOT(T, a65, 64);
420#define PROTOCORE_NS_L66(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
421 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
422 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
423 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66) \
424 PROTOCORE_NS_L65(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
425 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
426 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
427 a59, a60, a61, a62, a63, a64, a65) \
428 PROTOCORE_NS_SLOT(T, a66, 65);
429#define PROTOCORE_NS_L67(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
430 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
431 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
432 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67) \
433 PROTOCORE_NS_L66(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
434 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
435 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
436 a59, a60, a61, a62, a63, a64, a65, a66) \
437 PROTOCORE_NS_SLOT(T, a67, 66);
438#define PROTOCORE_NS_L68(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
439 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
440 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
441 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68) \
442 PROTOCORE_NS_L67(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
443 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
444 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
445 a59, a60, a61, a62, a63, a64, a65, a66, a67) \
446 PROTOCORE_NS_SLOT(T, a68, 67);
447#define PROTOCORE_NS_L69(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
448 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
449 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
450 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69) \
451 PROTOCORE_NS_L68(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
452 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
453 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
454 a59, a60, a61, a62, a63, a64, a65, a66, a67, a68) \
455 PROTOCORE_NS_SLOT(T, a69, 68);
456#define PROTOCORE_NS_L70(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
457 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
458 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
459 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70) \
460 PROTOCORE_NS_L69(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
461 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
462 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
463 a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69) \
464 PROTOCORE_NS_SLOT(T, a70, 69);
465#define PROTOCORE_NS_L71(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
466 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
467 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
468 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71) \
469 PROTOCORE_NS_L70(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
470 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
471 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
472 a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70) \
473 PROTOCORE_NS_SLOT(T, a71, 70);
474#define PROTOCORE_NS_L72(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
475 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
476 a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
477 a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72) \
478 PROTOCORE_NS_L71(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
479 a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
480 a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
481 a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71) \
482 PROTOCORE_NS_SLOT(T, a72, 71);
483
484/**
485 * @brief Pin every dispatch slot of a table that is nothing but function pointers.
486 *
487 * PROTOCORE_NS_LAYOUT(Sha256Ns, init, update, final, hash);
488 *
489 * A `<X>Ns` is a run of function pointers, and a positional initialiser mis-wires silently when a
490 * member is inserted, removed or moved - which this tree has already been bitten by: radio_power.c
491 * initialised its table positionally across a feature-flag split, so an arm that compiled out
492 * shifted every member below it onto the wrong function, and it still built. This asserts each
493 * named member is at its own slot, in the order given, and that sizeof is exactly that many
494 * pointers, so the mis-wiring fails at the declaration instead of at a wrong call.
495 *
496 * Costs nothing at run time.
497 */
498#define PROTOCORE_NS_LAYOUT(T, ...) \
499 PROTOCORE_CAT(PROTOCORE_NS_L, PROTOCORE_NARG(__VA_ARGS__))(T, __VA_ARGS__) static_assert( \
500 sizeof(T) == (size_t)PROTOCORE_NARG(__VA_ARGS__) * PROTOCORE_FP_SIZE, \
501 #T " has a member that is not in its dispatch list, or is padded")
502
503/**
504 * @brief Pin the dispatch slots of a table that carries state after its entries.
505 *
506 * A table whose tail is not function pointers cannot be pinned by sizeof, so @p tail names the
507 * first member after the run and its offset does the same job: insert or drop an entry and the tail
508 * moves, which fails.
509 */
510#define PROTOCORE_NS_LAYOUT_OPEN(T, tail, ...) \
511 PROTOCORE_CAT(PROTOCORE_NS_L, PROTOCORE_NARG(__VA_ARGS__))(T, __VA_ARGS__) static_assert( \
512 offsetof(T, tail) == (size_t)PROTOCORE_NARG(__VA_ARGS__) * PROTOCORE_FP_SIZE, \
513 #T "." #tail " does not begin where the dispatch run ends")
514
515/**
516 * @brief Storage for a dispatch table. The const is load bearing.
517 *
518 * Measured on gcc: a call through a `static const <X>Ns` devirtualises to the inlined body, the same
519 * instructions as calling the entry directly, and the same call through a non-const one does not -
520 * that becomes a real call with a frame. clang devirtualises both, so const is what makes the two
521 * agree.
522 */
523#define PROTOCORE_NS static const
524
525#endif // PROTOCORE_NS_CONTRACT_H