6 #ifndef ECHELON_HDF5_ADAPT_TYPE_HPP 7 #define ECHELON_HDF5_ADAPT_TYPE_HPP 9 #include <echelon/hdf5/type.hpp> 10 #include <echelon/hdf5/type_traits_fwd.hpp> 11 #include <echelon/hdf5/static_type_layout.hpp> 17 #include <boost/mpl/bool.hpp> 19 #include <boost/preprocessor/seq/transform.hpp> 20 #include <boost/preprocessor/seq/to_tuple.hpp> 22 #include <boost/preprocessor/stringize.hpp> 24 #define ECHELON_TUPLE_TO_VARIADIC_(...) __VA_ARGS__ 26 #define ECHELON_TUPLE_TO_VARIADIC(ARG) ECHELON_TUPLE_TO_VARIADIC_ ARG 28 #define ECHELON_CREATE_ID_OFFSET_PAIR(d, data, value) \ 29 id_offset_pair(BOOST_PP_STRINGIZE(value), offsetof(data, value)) 31 #define ECHELON_PROCESS_MEMBER_LIST(TYPE_NAME, MEMBERS) \ 33 ECHELON_TUPLE_TO_VARIADIC(BOOST_PP_SEQ_TO_TUPLE( \ 34 BOOST_PP_SEQ_TRANSFORM(ECHELON_CREATE_ID_OFFSET_PAIR, TYPE_NAME, MEMBERS))) \ 37 #define ECHELON_GET_MEMBER_TYPE(d, data, value) decltype(data::value) 39 #define ECHELON_GET_MEMBER_TYPES(TYPE_NAME, MEMBERS) \ 40 ECHELON_TUPLE_TO_VARIADIC(BOOST_PP_SEQ_TO_TUPLE( \ 41 BOOST_PP_SEQ_TRANSFORM(ECHELON_GET_MEMBER_TYPE, TYPE_NAME, MEMBERS))) 43 #define ECHELON_ADAPT_COMPOUND_TYPE(TYPE_NAME, MEMBERS) \ 47 struct static_type_layout<TYPE_NAME> \ 49 static constexpr static_type_layout_category category = \ 50 static_type_layout_category::generic; \ 51 typedef std::tuple<ECHELON_GET_MEMBER_TYPES(TYPE_NAME, MEMBERS)> member_types; \ 52 static const char* name() \ 54 return BOOST_PP_STRINGIZE(TYPE_NAME); \ 56 static constexpr std::size_t size = sizeof(TYPE_NAME); \ 57 static const id_offset_pair* members() \ 59 static constexpr id_offset_pair members_[] = \ 60 ECHELON_PROCESS_MEMBER_LIST(TYPE_NAME, MEMBERS); \ 63 static constexpr std::size_t num_members = std::tuple_size<member_types>::value; \ 67 struct is_hdf5_type<TYPE_NAME> : boost::mpl::true_ \ 72 #define ECHELON_CREATE_ID_SIZE_PAIR__(d, data, TYPE, NAME) \ 73 id_size_pair(BOOST_PP_STRINGIZE(NAME), sizeof(TYPE)) 75 #define ECHELON_CREATE_ID_SIZE_PAIR_(d, data, ...) \ 76 ECHELON_CREATE_ID_SIZE_PAIR__(d, data, __VA_ARGS__) 78 #define ECHELON_CREATE_ID_SIZE_PAIR(d, data, value) \ 79 ECHELON_CREATE_ID_SIZE_PAIR_(d, data, ECHELON_TUPLE_TO_VARIADIC(value)) 81 #define ECHELON_PROCESS_PACKED_MEMBER_LIST(TYPE_NAME, MEMBERS) \ 83 ECHELON_TUPLE_TO_VARIADIC(BOOST_PP_SEQ_TO_TUPLE( \ 84 BOOST_PP_SEQ_TRANSFORM(ECHELON_CREATE_ID_SIZE_PAIR, TYPE_NAME, MEMBERS))) \ 87 #define ECHELON_GET_PACKED_MEMBER_TYPE__(d, data, TYPE, NAME) TYPE 89 #define ECHELON_GET_PACKED_MEMBER_TYPE_(d, data, ...) \ 90 ECHELON_GET_PACKED_MEMBER_TYPE__(d, data, __VA_ARGS__) 92 #define ECHELON_GET_PACKED_MEMBER_TYPE(d, data, value) \ 93 ECHELON_GET_PACKED_MEMBER_TYPE_(d, data, ECHELON_TUPLE_TO_VARIADIC(value)) 95 #define ECHELON_GET_PACKED_MEMBER_TYPES(MEMBERS) \ 96 ECHELON_TUPLE_TO_VARIADIC( \ 97 BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_TRANSFORM(ECHELON_GET_PACKED_MEMBER_TYPE, _, MEMBERS))) 99 #define ECHELON_ADAPT_PACKED_COMPOUND_TYPE(TYPE_NAME, MEMBERS) \ 105 struct static_type_layout<TYPE_NAME> \ 107 static constexpr static_type_layout_category category = \ 108 static_type_layout_category::packed; \ 109 typedef std::tuple<ECHELON_GET_PACKED_MEMBER_TYPES(MEMBERS)> member_types; \ 110 static const char* name() \ 112 return BOOST_PP_STRINGIZE(TYPE_NAME); \ 114 static constexpr std::size_t size = sizeof(TYPE_NAME); \ 115 static const id_size_pair* members() \ 117 static constexpr id_size_pair members_[] = \ 118 ECHELON_PROCESS_PACKED_MEMBER_LIST(TYPE_NAME, MEMBERS); \ 121 static constexpr std::size_t num_members = std::tuple_size<member_types>::value; \ 125 struct is_hdf5_type<TYPE_NAME> : boost::mpl::true_ \