11#include "comms/details/macro_common.h"
13#define COMMS_ALIAS_MEM_ACC(prefix_, m_) COMMS_CONCATENATE(prefix_, m_)()
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__))
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__))
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__))
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__))
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__))
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__))
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__))
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__))
38#define COMMS_DO_ALIAS(prefix_, f1_, ...) \
39 decltype(auto) COMMS_CONCATENATE(prefix_, f1_) () \
41 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
43 decltype(auto) COMMS_CONCATENATE(prefix_, f1_) () const \
45 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
48#define COMMS_DO_ALIAS_NOTEMPLATE(prefix_, f1_, ...) COMMS_EXPAND(COMMS_DO_ALIAS(prefix_, f1_, __VA_ARGS__))
52#ifndef COMMS_DO_ALIAS_RET_TYPE_PREFIX
53#define COMMS_DO_ALIAS_RET_TYPE_PREFIX
56#if defined(__GNUC__) && !defined(__clang__)
58#undef COMMS_DO_ALIAS_RET_TYPE_PREFIX
59#define COMMS_DO_ALIAS_RET_TYPE_PREFIX this->
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__)) \
66 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
68 auto COMMS_CONCATENATE(prefix_, f1_) () const -> decltype(COMMS_DO_ALIAS_RET_TYPE_PREFIX COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
70 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
73#define COMMS_DO_ALIAS_NOTEMPLATE(prefix_, f1_, ...) \
74 auto COMMS_CONCATENATE(prefix_, f1_) () -> decltype(COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
76 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
78 auto COMMS_CONCATENATE(prefix_, f1_) () const -> decltype(COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__)) \
80 return COMMS_DO_ALIAS_ALL_MEM_ACC(prefix_, __VA_ARGS__); \
87#define COMMS_FIELD_ALIAS_TYPE(P_, m_) COMMS_CONCATENATE(P_, m_)
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__))
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__))
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__))
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__))
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__))
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__))
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__))
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__))
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
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))
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.