#pragma once #include "details/string_view.hpp" #if defined(__clang__) #include "details/enchantum_clang.hpp" #elif defined(__GNUC__) || defined(__GNUG__) #include "details/enchantum_gcc.hpp" #elif defined(_MSC_VER) #include "details/enchantum_msvc.hpp" #endif #include "common.hpp" #include #include namespace enchantum { #ifdef __cpp_lib_to_underlying using ::std::to_underlying; #else template [[nodiscard]] constexpr auto to_underlying(const E e) noexcept { return static_cast>(e); } #endif template, bool ShouldNullTerminate = true> inline constexpr auto entries = details::reflect, Pair, ShouldNullTerminate>(); template inline constexpr auto values = []() { constexpr auto& enums = entries; std::array ret; for (std::size_t i = 0; i < ret.size(); ++i) ret[i] = enums[i].first; return ret; }(); template inline constexpr auto names = []() { constexpr auto& enums = entries, NullTerminated>; std::array ret; for (std::size_t i = 0; i < ret.size(); ++i) ret[i] = enums[i].second; return ret; }(); template inline constexpr auto min = entries.front().first; template inline constexpr auto max = entries.back().first; template inline constexpr std::size_t count = entries.size(); } // namespace enchantum