34#include "../detail/compat.hpp"
55#if RELOCO_HAS_REFLECTION
67struct reflect_dump_entry {
68 std::string type_name;
69 std::string generated_code;
77inline std::vector<reflect_dump_entry> &reflect_dump_registry() {
78 static std::vector<reflect_dump_entry> registry;
87template <
typename E> std::string generate_reflect_enum_dump(std::string_view type_name) {
89 out +=
"template <> struct microfmt::formatter<";
91 out +=
"> {\n constexpr void parse(format_parse_context &ctx) noexcept { (void)ctx; }\n";
92 out +=
" void format(";
94 out +=
" val, const sink &out) const noexcept {\n switch (val) {\n";
96 template for (
constexpr auto e : define_static_array(std::meta::enumerators_of(^^E))) {
97 constexpr std::string_view enumerator_name = std::meta::identifier_of(e);
101 out += enumerator_name;
102 out +=
": out.write(\"";
103 out += enumerator_name;
104 out +=
"\"); return;\n";
107 out +=
" default: break;\n }\n format_to(out, \"{}\", static_cast<std::underlying_type_t<";
109 out +=
">>(val));\n }\n};\n";
133template <
typename T> std::string generate_reflect_struct_dump(std::string_view type_name) {
134 std::string members_code;
135 bool has_members =
false;
137 template for (
constexpr auto member :
138 define_static_array(std::meta::nonstatic_data_members_of(^^T, std::meta::access_context::current()))) {
139 constexpr std::string_view name = std::meta::identifier_of(member);
141 members_code +=
" out.write(\", \");\n";
144 members_code +=
" out.write(\"";
145 members_code += name;
146 members_code +=
": \");\n microfmt::format_to(out, \"{}\", microfmt::as_debug(val.";
147 members_code += name;
148 members_code +=
"));\n";
152 out +=
"template <> struct reloco::Debug<";
154 out +=
"> {\n static void format(const ";
156 out +=
" &val, const reloco::sink &out) noexcept {\n";
159 out +=
" out.write(\"";
163 out +=
" out.write(\"";
167 out +=
" out.write(\" }\");\n";
174template <
typename E>
bool register_reflect_dump_enum(std::string_view type_name) {
175 reflect_dump_registry().push_back({std::string(type_name), generate_reflect_enum_dump<E>(type_name)});
179template <
typename T>
bool register_reflect_dump_struct(std::string_view type_name) {
180 reflect_dump_registry().push_back({std::string(type_name), generate_reflect_struct_dump<T>(type_name)});
195inline std::string render_reflect_dump() {
196 std::string out =
"// SPDX-FileCopyrightText: 2026 Jarosław Pelczar <jarek@jpelczar.com>\n"
197 "//\n// SPDX-License-Identifier: BSD-2-Clause\n\n"
198 "// Auto-generated by tools/reflect_dump -- do not edit by hand.\n"
199 "// Regenerate with a -freflection build; see docs/reflection.md.\n\n"
201 "#include <microfmt/detail/compat.hpp>\n\n"
202 "#if !RELOCO_HAS_REFLECTION\n\n"
203 "#include <microfmt/microfmt.hpp>\n"
204 "#include <type_traits>\n\n";
206 for (
const auto &entry : reflect_dump_registry()) {
207 out += entry.generated_code;
211 out +=
"#endif // !RELOCO_HAS_REFLECTION\n";
217#if defined(MICROFMT_REFLECT_DUMP_MODE)
225#define MICROFMT_REFLECT_DUMP_ENUM_IMPL(Type, Counter) \
226 static const bool microfmt_reflect_dump_enum_##Counter = ::microfmt::detail::register_reflect_dump_enum<Type>(#Type)
227#define MICROFMT_REFLECT_DUMP_ENUM_FWD(Type, Counter) MICROFMT_REFLECT_DUMP_ENUM_IMPL(Type, Counter)
228#define MICROFMT_REFLECT_DUMP_ENUM(Type) MICROFMT_REFLECT_DUMP_ENUM_FWD(Type, __COUNTER__)
230#define MICROFMT_REFLECT_DUMP_STRUCT_IMPL(Type, Counter) \
231 static const bool microfmt_reflect_dump_struct_##Counter = \
232 ::microfmt::detail::register_reflect_dump_struct<Type>(#Type)
233#define MICROFMT_REFLECT_DUMP_STRUCT_FWD(Type, Counter) MICROFMT_REFLECT_DUMP_STRUCT_IMPL(Type, Counter)
234#define MICROFMT_REFLECT_DUMP_STRUCT(Type) MICROFMT_REFLECT_DUMP_STRUCT_FWD(Type, __COUNTER__)
238#define MICROFMT_REFLECT_DUMP_ENUM(Type)
239#define MICROFMT_REFLECT_DUMP_STRUCT(Type)
264#define MICROFMT_REFLECT_FORMAT(Type) \
265 template <> struct microfmt::enable_reflect_format<Type> : std::true_type {}; \
266 MICROFMT_REFLECT_DUMP_STRUCT(Type)
270#define MICROFMT_REFLECT_FORMAT(Type)
271#define MICROFMT_REFLECT_DUMP_ENUM(Type)
272#define MICROFMT_REFLECT_DUMP_STRUCT(Type)
Definition bintime.hpp:22