12#if defined(__clang__) || defined(__GNUC__)
13#define REFL_PRETTY_FUNCTION __PRETTY_FUNCTION__
14#elif defined(_MSC_VER)
15#define REFL_PRETTY_FUNCTION __FUNCSIG__
17#error "unsupported compiler (pretty function)"
26export namespace refl {
30 template <std::size_t... Is>
32 return std::array{s[Is]...,
'\0'};
38 constexpr auto prefix = std::string_view{
"[T = "};
39 constexpr auto suffix = std::string_view{
"]"};
40#elif defined(__GNUC__)
41 constexpr auto prefix = std::string_view{
"with T = "};
42 constexpr auto suffix = std::string_view{
"]"};
43#elif defined(_MSC_VER)
44 constexpr auto prefix = std::string_view{
"type_name_array<"};
45 constexpr auto suffix = std::string_view{
">(void)"};
47#error "unsupported compiler (type_name_array)"
50 constexpr auto function = std::string_view{REFL_PRETTY_FUNCTION};
51 constexpr auto start = function.find(prefix) + prefix.size();
52 constexpr auto end = function.rfind(suffix);
54 static_assert(start < end);
56 constexpr auto name = function.substr(start, (end - start));
57 constexpr auto size = name.size();
63 template <
template <
typename...>
typename Pack>
66 constexpr auto prefix = std::string_view{
"[Pack = "};
67 constexpr auto suffix = std::string_view{
"]"};
68#elif defined(__GNUC__)
69 constexpr auto prefix = std::string_view{
"with T = "};
70 constexpr auto suffix = std::string_view{
"]"};
71#elif defined(_MSC_VER)
72 constexpr auto prefix = std::string_view{
"type_name_array<"};
73 constexpr auto suffix = std::string_view{
">(void)"};
75#error "unsupported compiler (type_name_array)"
78 constexpr auto function = std::string_view{REFL_PRETTY_FUNCTION};
79 constexpr auto start = function.find(prefix) + prefix.size();
80 constexpr auto end = function.rfind(suffix);
82 static_assert(start < end);
84 constexpr auto name = function.substr(start, (end - start));
85 constexpr auto size = name.size();
91 template <
template <
typename T, std::
size_t I>
typename Pack>
94 constexpr auto prefix = std::string_view{
"[T = "};
95 constexpr auto suffix = std::string_view{
"]"};
96#elif defined(__GNUC__)
97 constexpr auto prefix = std::string_view{
"with T = "};
98 constexpr auto suffix = std::string_view{
"]"};
99#elif defined(_MSC_VER)
100 constexpr auto prefix = std::string_view{
"type_name_array<"};
101 constexpr auto suffix = std::string_view{
">(void)"};
103#error "unsupported compiler (type_name_array)"
106 constexpr auto function = std::string_view{REFL_PRETTY_FUNCTION};
107 constexpr auto start = function.find(prefix) + prefix.size();
108 constexpr auto end = function.rfind(suffix);
110 static_assert(start < end);
112 constexpr auto name = function.substr(start, (end - start));
113 constexpr auto size = name.size();
121 template <
typename T>
125 template <
template <
typename...>
typename Pack>
129 template <
template <
typename T, std::
size_t I>
typename Pack>
135 template <
typename T>
138 return std::string_view{val.data(), val.size() - 1};
140 template <
template <
typename...>
typename Pack>
143 return std::string_view{val.data(), val.size() - 1};
145 template <
template <
typename T, std::
size_t I>
typename Pack>
148 return std::string_view{val.data(), val.size() - 1};
152 constexpr std::uint64_t
fnv1a_partial(std::uint64_t partial, std::string_view s) {
153 if (s.length() == 0) {
157 partial = (partial ^ s[0]) * 1099511628211u;
158 return s.length() == 1 ? partial :
fnv1a_partial(partial, s.substr(1));
162 constexpr std::uint64_t
fnv1a_append(std::uint64_t partial, std::string_view s) {
163 if (s.length() >= 256) {
170 constexpr std::uint64_t
fnv1a(std::string_view s) {
176 template <
typename T>
179 template <
template <
typename...>
typename Pack>
182 template <
template <
typename T, std::
size_t I>
typename Pack>
185 template <
typename T>
188 template <
template <
typename...>
typename Pack>
191 template <
template <
typename T, std::
size_t I>
typename Pack>
195 template <
typename T>
199 template <
template <
typename...>
typename Pack,
typename... Ts>
203 template <
template <
typename, std::
size_t>
typename Pack,
typename T, std::size_t I>
209 template <
typename T>
constexpr std::uint64_t fnv1a_append(std::uint64_t partial, std::string_view s)
constexpr auto type_name_array()
constexpr auto type_name_str()
constexpr auto type_name_array_pack_1t1i()
constexpr std::uint64_t fnv1a_partial(std::uint64_t partial, std::string_view s)
constexpr auto type_name_str_pack()
constexpr std::uint64_t fnv1a(std::string_view s)
constexpr auto substring_as_array(std::string_view s, std::index_sequence< Is... >)
constexpr auto type_name_str_pack_1t1i()
constexpr auto type_name_array_pack()
constexpr auto pack_1t1i_name
constexpr type_id_t pack_1t1i_id
constexpr type_id_t type_id
constexpr type_id_t pack_type_id
constexpr type_id_t pack_id
static constexpr type_id_t value
static constexpr type_id_t value
static constexpr type_id_t value
static constexpr auto value
static constexpr auto value
static constexpr auto value