2
3
4
5
6
18
19
20
21
22
23
26 return static_cast<std::underlying_type_t<E>>(e);
29namespace enum_detail {
30 template<
const std::string_view &String,
char Delim>
32 static consteval
auto numParts() {
34 for (
char c: String) {
41 static consteval
auto extractString(
auto begin,
auto end) {
42 auto str = std::ranges::subrange(begin, end) |
43 std::views::drop_while([](
char c) {
return c ==
' '; });
44 return std::string_view(str.begin(), str.end());
47 static consteval
auto doSplit() {
48 std::array<std::string_view, numParts()> ret;
49 auto start = String.begin();
50 std::size_t arrayIdx = 0;
51 for (
auto curr = String.begin(); curr != String.end(); ++curr) {
53 ret[arrayIdx++] = extractString(start, curr);
58 ret[arrayIdx] = extractString(start, String.end());
63 static constexpr auto value = doSplit();
68
69
70
71
72
73#define PENUM(NAME, ...) enum class NAME { __VA_ARGS__ }; inline
74 constexpr std::string_view __##NAME##_enum_str_vals__ = #__VA_ARGS__; inline
75 constexpr std::array __##NAME##_converter__{enum_detail::split<__##NAME##_enum_str_vals__, ','>::value };inline
76 std::ostream &operator
<<(std::ostream &os, NAME e) {
77 os << __##NAME##_converter__.at(to_underlying(e));
79} inline
80 auto to_string(NAME e) {
81 return std::string(__##NAME##_converter__.at(to_underlying(e))); \
82}
constexpr auto to_underlying(E e) noexcept
Definition enum.hpp:25