#ifndef RFL_INTERNAL_ENUMS_NAMES_HPP_ #define RFL_INTERNAL_ENUMS_NAMES_HPP_ #include #include #include #include #include "../../Literal.hpp" //#include "../../config.hpp" //#include "../../define_literal.hpp" #include "../../make_named_tuple.hpp" //#include "../../thirdparty/enchantum/enchantum.hpp" #include "../StringLiteral.hpp" namespace rfl::internal::enums { template struct Names { /// Contains a collection of enums as compile-time strings. using Literal = LiteralType; /// The number of possible values constexpr static size_t size = N; /// A list of all the possible enums constexpr static auto enums_ = std::array{_enums...}; }; template auto names_to_enumerator_named_tuple( Names, N, _is_flag, _enums...>) { return make_named_tuple(Field<_names, EnumType>{_enums}...); } template auto names_to_underlying_enumerator_named_tuple( Names, N, _is_flag, _enums...>) { return make_named_tuple(Field<_names, std::underlying_type_t>{ static_cast>(_enums)}...); } template constexpr std::array, N> names_to_enumerator_array( Names, N, _is_flag, _enums...>) { return { std::make_pair(LiteralHelper<_names>::name_.string_view(), _enums)...}; } template constexpr std::array< std::pair>, N> names_to_underlying_enumerator_array( Names, N, _is_flag, _enums...>) { return { std::make_pair(LiteralHelper<_names>::name_.string_view(), static_cast>(_enums))...}; } } // namespace rfl::internal::enums #endif