17 #ifndef CARBON_DEF_H_INCLUDED
18 #define CARBON_DEF_H_INCLUDED
21 #ifndef ALCHEMY_H_INCLUDED
22 # error Do not include this file directly. Use <Alchemy.h> instead
29 #if defined(ALCHEMY_CARBONATE)
37 #define EACH_C_PARAM(r, data, i, x) \
38 BOOST_PP_TUPLE_ELEM(2,0,x) BOOST_PP_TUPLE_ELEM(2,1,x);
43 #define DEFINE_C_STRUCT_PARAMS(S) \
44 BOOST_PP_SEQ_FOR_EACH_I(EACH_C_PARAM, unused, BOOST_PP_VARIADIC_TO_SEQ(S))
48 #define DEFINE_C_STRUCT_PARAMS(...) \
49 BOOST_PP_SEQ_FOR_EACH_I(EACH_C_PARAM, unused, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
63 #define C_DECLARE_STRUCT_HEADER(F, ...) \
64 extern "C" typedef struct tag_##F \
66 DEFINE_C_STRUCT_PARAMS(__VA_ARGS__) \
67 C_DECLARE_STRUCT_FOOTER(F)
72 #define C_DECLARE_STRUCT_HEADER(F, ...) \
73 typedef struct tag_##F \
75 DEFINE_C_STRUCT_PARAMS(__VA_ARGS__) \
76 C_DECLARE_STRUCT_FOOTER(F)
80 #define C_DECLARE_STRUCT_FOOTER(F) \
82 extern const uint32_t k_##F##_id;
86 #define C_DATUM_X(T,P) (T,P)
89 #define C_DECLARE_DATUM(T,P) C_DATUM_X(T,P)
92 #define C_DECLARE_ARRAY_DATUM(T, N, P) C_DATUM_X(T,P[N])
95 #define C_DECLARE_VECTOR_DATUM(T, N, P) C_DATUM_X(T*, P)
98 #define C_DECLARE_ALLOCATOR_DATUM(T, A, N, P) C_DECLARE_ALLOC(T, N, P)
105 #define C_EACH_BIT_FIELD(r, data, i, x) \
108 #if defined(_MSC_VER)
110 #define C_DEFINE_PACKED_FIELDS(S) \
111 BOOST_PP_SEQ_FOR_EACH_I(C_EACH_BIT_FIELD, unused, BOOST_PP_VARIADIC_TO_SEQ(S))
115 #define C_DEFINE_PACKED_FIELDS(...) \
116 BOOST_PP_SEQ_FOR_EACH_I(C_EACH_BIT_FIELD, unused, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
123 # define C_DECLARE_PACKED_HEADER(T,P, ...) \
124 extern "C" typedef struct tag_##P \
126 C_DEFINE_PACKED_FIELDS(__VA_ARGS__) \
132 # define C_DECLARE_PACKED_HEADER(T,P, ...) \
133 typedef struct tag_##P \
135 C_DEFINE_PACKED_FIELDS(__VA_ARGS__) \
140 # define C_DECLARE_BIT_FIELD(IDX,P,N) \
154 template< typename T, typename U >
155 U& struct_to_msg(T& src, U& dest);
157 template< typename T, typename U >
158 U& msg_to_struct(T& src, U& dest);
162 #define EACH_C_VALUE(r, xlate, i, x) \
163 C::xlate(src.##BOOST_PP_TUPLE_ELEM(2,1,x), dest.##BOOST_PP_TUPLE_ELEM(2,1,x));
166 #if defined(_MSC_VER)
168 #define DEFINE_C_TYPE_TRANSLATION(XLATE,S) \
169 BOOST_PP_SEQ_FOR_EACH_I(EACH_C_VALUE, XLATE, BOOST_PP_VARIADIC_TO_SEQ(S))
173 #define DEFINE_C_TYPE_TRANSLATION(XLATE,...) \
174 BOOST_PP_SEQ_FOR_EACH_I(EACH_C_VALUE, XLATE, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
181 #define C_DECLARE_STRUCT_TO_MSG(NAME, ...) \
184 Hg::##NAME& struct_to_msg(NAME& src, Hg::##NAME& dest) \
185 { using namespace Hg; \
186 DEFINE_C_TYPE_TRANSLATION(struct_to_msg, __VA_ARGS__) \
193 #define C_DECLARE_MSG_TO_STRUCT(NAME, ...) \
196 NAME& msg_to_struct(Hg::##NAME& src, NAME& dest) \
197 { using namespace Hg; \
198 DEFINE_C_TYPE_TRANSLATION(msg_to_struct, __VA_ARGS__) \
205 #define C_DECLARE_STRUCT_TO_MSG(NAME, ...)
206 #define C_DECLARE_MSG_TO_STRUCT(NAME, ...)
217 # define C_DECLARE_STRUCT_HEADER(F, ...)
218 # define C_DECLARE_STRUCT_FOOTER(F)
220 # define C_DATUM_X(T,P)
221 # define C_DECLARE_DATUM(T,P)
222 # define C_DECLARE_ARRAY(T, N, P)
223 # define C_DECLARE_DYNAMIC(T, N, P)
224 # define C_DECLARE_ALLOCATOR(T, A, N, P)
226 # define C_DECLARE_PACKED_HEADER(T,C, ...)
227 # define C_DECLARE_BIT_FIELD(IDX,P,N)
228 # define C_DECLARE_PACKED_FOOTER