COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
field_alias.h
1//
2// Copyright 2019 - 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
11#include "comms/details/macro_common.h"
12
13#define COMMS_ALIAS_MEM_ACC(prefix_, m_) COMMS_CONCATENATE(prefix_, m_)()
14
15#define COMMS_ALIAS_MEM_ACC_1(prefix_, m_) COMMS_EXPAND(COMMS_ALIAS_MEM_ACC(prefix_, m_))
16#define COMMS_ALIAS_MEM_ACC_2(prefix_, m_, ...) \
17 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_1(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
18#define COMMS_ALIAS_MEM_ACC_3(prefix_, m_, ...) \
19 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_2(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
20#define COMMS_ALIAS_MEM_ACC_4(prefix_, m_, ...) \
21 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_3(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
22#define COMMS_ALIAS_MEM_ACC_5(prefix_, m_, ...) \
23 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_4(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
24#define COMMS_ALIAS_MEM_ACC_6(prefix_, m_, ...) \
25 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_5(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
26#define COMMS_ALIAS_MEM_ACC_7(prefix_, m_, ...) \
27 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_6(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
28#define COMMS_ALIAS_MEM_ACC_8(prefix_, m_, ...) \
29 COMMS_ALIAS_MEM_ACC(prefix_, m_) . COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_7(field_, __VA_ARGS__)) // using field_ as next prefix on purpose
30
31#define COMMS_ALIAS_ALL_MEM_ACC_(N, prefix_, ...) COMMS_EXPAND(COMMS_ALIAS_MEM_ACC_ ## N(prefix_, __VA_ARGS__))
32#define COMMS_ALIAS_ALL_MEM_ACC(N, prefix_, ...) COMMS_EXPAND(COMMS_ALIAS_ALL_MEM_ACC_(N, prefix_, __VA_ARGS__))
33#define COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, ...) \
34 COMMS_EXPAND(COMMS_ALIAS_ALL_MEM_ACC(COMMS_NUM_ARGS(__VA_ARGS__), prefix_, __VA_ARGS__))
35
36#if COMMS_IS_CPP14
37
38#define COMMS_DO_ALIAS(prefix_, f1_, ...) \
39 decltype(auto) COMMS_CONCATENATE(prefix_, f1_) () \
40 { \
41 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
42 }\
43 decltype(auto) COMMS_CONCATENATE(prefix_, f1_) () const \
44 { \
45 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
46 }
47
48#define COMMS_DO_ALIAS_NOTEMPLATE(prefix_, f1_, ...) COMMS_EXPAND(COMMS_DO_ALIAS(prefix_, f1_, __VA_ARGS__))
49
50#else // #if COMMS_IS_CPP14
51
52#ifndef COMMS_DO_ALIAS_RET_TYPE_PREFIX
53#define COMMS_DO_ALIAS_RET_TYPE_PREFIX
54#endif // #ifndef COMMS_DO_ALIAS_RET_TYPE_PREFIX
55
56#if defined(__GNUC__) && !defined(__clang__)
57#if __GNUC__ < 5
58#undef COMMS_DO_ALIAS_RET_TYPE_PREFIX
59#define COMMS_DO_ALIAS_RET_TYPE_PREFIX this->
60#endif // #if __GNUC__ < 5
61#endif // #if defined(__GNUC__) && !defined(__clang__)
62
63#define COMMS_DO_ALIAS(prefix_, f1_, ...) \
64 auto COMMS_CONCATENATE(prefix_, f1_) () -> decltype(COMMS_DO_ALIAS_RET_TYPE_PREFIX COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
65 { \
66 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
67 }\
68 auto COMMS_CONCATENATE(prefix_, f1_) () const -> decltype(COMMS_DO_ALIAS_RET_TYPE_PREFIX COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
69 { \
70 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
71 }
72
73#define COMMS_DO_ALIAS_NOTEMPLATE(prefix_, f1_, ...) \
74 auto COMMS_CONCATENATE(prefix_, f1_) () -> decltype(COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
75 { \
76 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
77 }\
78 auto COMMS_CONCATENATE(prefix_, f1_) () const -> decltype(COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
79 { \
80 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
81 }
82
83#endif // #if COMMS_IS_CPP14
84
85// ----------------------------------------------
86
87#define COMMS_FIELD_ALIAS_TYPE(P_, m_) COMMS_CONCATENATE(P_, m_)
88
89#define COMMS_FIELD_ALIAS_TYPE_1(P_, m_) COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE(P_, m_))
90#define COMMS_FIELD_ALIAS_TYPE_2(P_, m_, ...) \
91 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_1(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
92#define COMMS_FIELD_ALIAS_TYPE_3(P_, m_, ...) \
93 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_2(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
94#define COMMS_FIELD_ALIAS_TYPE_4(P_, m_, ...) \
95 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_3(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
96#define COMMS_FIELD_ALIAS_TYPE_5(P_, m_, ...) \
97 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_4(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
98#define COMMS_FIELD_ALIAS_TYPE_6(P_, m_, ...) \
99 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_5(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
100#define COMMS_FIELD_ALIAS_TYPE_7(P_, m_, ...) \
101 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_6(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
102#define COMMS_FIELD_ALIAS_TYPE_8(P_, m_, ...) \
103 COMMS_FIELD_ALIAS_TYPE(P_, m_) :: COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_7(Field_, __VA_ARGS__)) // using Field_ as next prefix on purpose
104
105#define COMMS_ALIAS_ALL_TYPES_(N, P_, ...) COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_ ## N(P_, __VA_ARGS__))
106#define COMMS_ALIAS_ALL_TYPES(N, P_, ...) COMMS_EXPAND(COMMS_ALIAS_ALL_TYPES_(N, P_, __VA_ARGS__))
107#define COMMS_DO_ALIAS_ALL_TYPES(P_, ...) \
108 COMMS_EXPAND(COMMS_ALIAS_ALL_TYPES(COMMS_NUM_ARGS(__VA_ARGS__), P_, __VA_ARGS__))
109
110#define COMMS_FIELD_ALIAS_TYPE_PREFIX_1
111#define COMMS_FIELD_ALIAS_TYPE_PREFIX_2 typename
112#define COMMS_FIELD_ALIAS_TYPE_PREFIX_3 typename
113#define COMMS_FIELD_ALIAS_TYPE_PREFIX_4 typename
114#define COMMS_FIELD_ALIAS_TYPE_PREFIX_5 typename
115#define COMMS_FIELD_ALIAS_TYPE_PREFIX_6 typename
116#define COMMS_FIELD_ALIAS_TYPE_PREFIX_7 typename
117#define COMMS_FIELD_ALIAS_TYPE_PREFIX_8 typename
118
119#define COMMS_FIELD_ALIAS_TYPE_PREFIX_(N) COMMS_FIELD_ALIAS_TYPE_PREFIX_ ## N
120#define COMMS_FIELD_ALIAS_TYPE_PREFIX(N) COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_PREFIX_(N))
121
122#define COMMS_DO_ALIAS_TYPEDEF(P_, n_, ...) \
123 using COMMS_CONCATENATE(P_, n_) = \
124 COMMS_EXPAND(COMMS_FIELD_ALIAS_TYPE_PREFIX(COMMS_NUM_ARGS(__VA_ARGS__))) COMMS_EXPAND(COMMS_DO_ALIAS_ALL_TYPES(P_, __VA_ARGS__));
Contains various compiler related definitions.