SRS-control 0.1.4
Loading...
Searching...
No Matches
EnumConvertFunctions.hpp
Go to the documentation of this file.
1// IWYU pragma: private
2#pragma once
3
4#include <algorithm>
5#include <array>
6#include <magic_enum/magic_enum.hpp>
7#include <map>
8#include <ranges>
9#include <string>
10#include <string_view>
11#include <vector>
12
14{
15
16 constexpr auto enum_to_dash_converter = [](const auto char_val)
17 {
18 if (char_val == '_')
19 {
20 return '-';
21 }
22 return char_val;
23 };
24
25 constexpr auto enum_from_dash_converter = [](const auto char_val)
26 {
27 if (char_val == '-')
28 {
29 return '_';
30 }
31 return char_val;
32 };
33
34 template <typename Enum>
35 constexpr auto get_enum_dashed_names()
36 {
37 constexpr auto enum_names = magic_enum::enum_names<Enum>();
38 constexpr auto enum_size = enum_names.size();
39 constexpr auto MAX_SIZE = 20 * enum_size;
40 constexpr auto arr = [&]()
41 {
42 auto output_str = std::array<char, MAX_SIZE>{};
43 auto tmp_vec = enum_names | std::views::join | std::views::transform(enum_to_dash_converter) |
44 std::ranges::to<std::vector<char>>();
45 std::ranges::copy(tmp_vec, output_str.begin());
46 return std::make_pair(tmp_vec.size(), output_str);
47 }();
48 static constexpr auto output_arr = [&]()
49 {
50 auto output_str = std::array<char, arr.first>{};
51 std::ranges::copy(arr.second | std::ranges::views::take(arr.first), output_str.begin());
52 return output_str;
53 }();
54 constexpr auto output_str_vs = [&]()
55 {
56 auto arr = std::array<std::string_view, enum_size>{};
57 auto front_iter = output_arr.begin();
58
59 for (auto [enum_name, enum_name_view] : std::views::zip(enum_names, arr))
60 {
61 const auto distance = enum_name.size();
62 // NOLINTBEGIN (cppcoreguidelines-pro-bounds-pointer-arithmetic)
63 enum_name_view = std::string_view{ front_iter, front_iter + distance };
64 front_iter += distance;
65 // NOLINTEND (cppcoreguidelines-pro-bounds-pointer-arithmetic)
66 }
67 return arr;
68 }();
69 return output_str_vs;
70 }
71
72 template <auto EnumVal>
73 constexpr auto get_enum_dashed_name()
74 {
75 constexpr auto enum_name = magic_enum::enum_name<decltype(EnumVal)>(EnumVal);
76 static constexpr auto enum_arr = [&]()
77 {
78 auto arr = std::array<char, enum_name.size()>{};
79 auto tmp_vec =
80 enum_name | std::views::transform(enum_to_dash_converter) | std::ranges::to<std::vector<char>>();
81 std::ranges::copy(tmp_vec, arr.begin());
82 return arr;
83 }();
84 return std::string_view{ enum_arr.begin(), enum_arr.end() };
85 }
86
87 constexpr auto get_enum_dashed_name(auto EnumVal) -> std::string
88 {
89 return magic_enum::enum_name<decltype(EnumVal)>(EnumVal) | std::views::transform(enum_to_dash_converter) |
90 std::ranges::to<std::string>();
91 }
92
93 template <typename Enum>
94 constexpr auto get_enum(std::string_view enum_name)
95 {
96 return magic_enum::enum_cast<Enum>(
97 enum_name | std::views::transform(enum_from_dash_converter) | std::ranges::to<std::string>(),
98 magic_enum::case_insensitive);
99 }
100
101 template <typename Enum>
102 constexpr auto get_enum_dash_map()
103 {
104 return magic_enum::enum_values<Enum>() |
105 std::views::transform([](auto enum_val)
106 { return std::make_pair(get_enum_dashed_name(enum_val), enum_val); }) |
107 std::ranges::to<std::map<std::string, Enum>>();
108 }
109} // namespace srs::common::internal
constexpr auto enum_from_dash_converter
constexpr auto get_enum_dashed_names()
constexpr auto get_enum_dashed_name()
constexpr auto get_enum(std::string_view enum_name)
constexpr auto enum_to_dash_converter