AsmGrader 0.0.0
Loading...
Searching...
No Matches
enum.hpp
Go to the documentation of this file.
1#pragma once
2
8
9#include <boost/describe/enum.hpp>
10#include <boost/describe/enumerators.hpp>
11#include <boost/mp11/algorithm.hpp>
12#include <boost/pfr.hpp>
13#include <boost/type_index.hpp>
14#include <fmt/base.h>
15#include <fmt/format.h>
16#include <range/v3/algorithm/copy.hpp>
17#include <range/v3/algorithm/find_if.hpp>
18#include <range/v3/range/concepts.hpp>
19
20#include <optional>
21#include <string_view>
22#include <utility>
23
24namespace asmgrader::detail {
25
29template <typename Enum, StaticString EnumName, auto... Enumerators>
31{
33
34 constexpr auto parse(fmt::format_parse_context& ctx) {
35 // parse a potential '?' spec
36 return debug_parser.parse(ctx);
37 }
38
39 constexpr auto get_enumerator(const Enum& from) const {
40 auto val = [from] {
41 std::optional<::asmgrader::pair<std::string_view, Enum>> res;
42 ((Enumerators.second == from ? res = Enumerators : res), ...);
43 return res;
44 }();
45
46 return val;
47 }
48
49 constexpr auto normal_format(const Enum& from, fmt::format_context& ctx) const {
50 auto val = get_enumerator(from);
51
52 if (val.has_value()) {
53 return fmt::format_to(ctx.out(), "{}", val->first);
54 }
55
56 return fmt::format_to(ctx.out(), "<unknown ({})>", fmt::underlying(from));
57 }
58
59 constexpr auto debug_format(const Enum& from, fmt::format_context& ctx) const {
60 fmt_appender_wrapper ctx_iter{ctx.out()};
61
62 fmt::format_to(ctx_iter, "{}{{", EnumName);
63
64 ctx.advance_to(normal_format(from, ctx));
65
66 ranges::copy("}", ctx_iter);
67
68 return ctx_iter.out;
69 }
70
71 constexpr auto format(const Enum& from, fmt::format_context& ctx) const {
73 return debug_format(from, ctx);
74 }
75 // else
76 return normal_format(from, ctx);
77 }
78};
79
80} // namespace asmgrader::detail
fmt::appender is non-comformat to the std iterator specification, and thus does not work with the eno...
Definition asm_function.hpp:123
StaticString(const char(&input)[N]) -> StaticString< N - 1 >
Definition debug.hpp:9
constexpr auto parse(fmt::format_parse_context &ctx)
Definition debug.hpp:12
bool is_debug_format
Definition debug.hpp:10
Definition enum.hpp:31
constexpr auto parse(fmt::format_parse_context &ctx)
Definition enum.hpp:34
constexpr auto format(const Enum &from, fmt::format_context &ctx) const
Definition enum.hpp:71
constexpr auto get_enumerator(const Enum &from) const
Definition enum.hpp:39
constexpr auto normal_format(const Enum &from, fmt::format_context &ctx) const
Definition enum.hpp:49
constexpr auto debug_format(const Enum &from, fmt::format_context &ctx) const
Definition enum.hpp:59
DebugFormatter debug_parser
Definition enum.hpp:32
Definition fmt_appender_adaptor.hpp:15