1#ifndef LIBSBX_UTILITY_ENUM_HPP_
2#define LIBSBX_UTILITY_ENUM_HPP_
9#include <libsbx/utility/string_literal.hpp>
11namespace sbx::utility {
13template<
typename Enum>
14requires (std::is_enum_v<Enum>)
15constexpr auto to_underlying(
const Enum value) -> std::underlying_type_t<Enum> {
16 return static_cast<std::underlying_type_t<Enum>
>(value);
19template<
typename Enum>
20requires (std::is_enum_v<Enum>)
21constexpr auto from_underlying(
const std::underlying_type_t<Enum> value) -> Enum {
22 return static_cast<Enum
>(value);
25template<
typename Enum>
26requires (std::is_enum_v<Enum>)
32template<
typename Enum>
33requires (std::is_enum_v<Enum>)
37template<
typename Type>
38concept mapped_enum =
requires() {
43template<mapped_enum Enum>
44constexpr auto to_string(
const Enum value) -> std::string {
47 if (entry == std::ranges::end(enum_mapping<Enum>::values)) {
54template<mapped_enum Enum>
55constexpr auto from_string(
const std::string&
string) -> std::optional<Enum> {
56 auto entry = std::ranges::find_if(enum_mapping<Enum>::values, [&
string](
const auto& entry){
return entry.name == string; });
58 if (entry == std::ranges::end(enum_mapping<Enum>::values)) {