diff --git a/example/example.cpp b/example/example.cpp index 93ec1af..d8ec7cc 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -95,5 +95,14 @@ int main() { static_assert(!magic_enum::is_scoped_enum_v); static_assert(magic_enum::is_scoped_enum_v); + // Enum pair (value enum, string enum name) sequence. + constexpr auto color_entries = magic_enum::enum_entries(); + std::cout << "Colors entries:"; + for (auto& e : color_entries) { + std::cout << " " << e.second << " = " << static_cast(e.first); + } + std::cout << std::endl; + // Color entries: RED = -10 BLUE = 0 GREEN = 10 + return 0; } diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index 7d3fc9a..91d6e24 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -170,12 +170,12 @@ template } template -[[nodiscard]] constexpr decltype(auto) pairs_impl(std::integer_sequence) noexcept { - static_assert(std::is_enum_v, "magic_enum::detail::pairs_impl requires enum type."); +[[nodiscard]] constexpr decltype(auto) entries_impl(std::integer_sequence) noexcept { + static_assert(std::is_enum_v, "magic_enum::detail::entries_impl requires enum type."); constexpr auto values = values_impl(range_impl()); - constexpr std::array, sizeof...(I)> pairs{{{values[I], name_impl()}...}}; + constexpr std::array, sizeof...(I)> entries{{{values[I], name_impl()}...}}; - return pairs; + return entries; } template @@ -316,9 +316,9 @@ template > [[nodiscard]] constexpr decltype(auto) enum_entries() noexcept { static_assert(std::is_enum_v, "magic_enum::enum_entries requires enum type."); constexpr auto count = detail::values_impl(detail::range_impl()).size(); - constexpr auto pairs = detail::pairs_impl(std::make_index_sequence{}); + constexpr auto entries = detail::entries_impl(std::make_index_sequence{}); - return pairs; + return entries; } namespace ops { diff --git a/test/test.cpp b/test/test.cpp index fe33d5e..79b916e 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -214,6 +214,20 @@ TEST_CASE("enum_names") { REQUIRE(s4 == std::array{{"one", "two", "three"}}); } +TEST_CASE("enum_entries") { + constexpr auto s1 = magic_enum::enum_entries(); + REQUIRE(s1 == std::array, 3>{{{Color::RED, "RED"}, {Color::GREEN, "GREEN"}, {Color::BLUE, "BLUE"}}}); + + constexpr auto s2 = magic_enum::enum_entries(); + REQUIRE(s2 == std::array, 3>{{{Numbers::one, "one"}, {Numbers::two, "two"}, {Numbers::three, "three"}}}); + + constexpr auto s3 = magic_enum::enum_entries(); + REQUIRE(s3 == std::array, 4>{{{Directions::Left, "Left"}, {Directions::Down, "Down"}, {Directions::Up, "Up"}, {Directions::Right, "Right"}}}); + + constexpr auto s4 = magic_enum::enum_entries(); + REQUIRE(s4 == std::array, 3>{{{number::one, "one"}, {number::two, "two"}, {number::three, "three"}}}); +} + TEST_CASE("operator<<") { auto test_ostream = [](auto e, std::string_view name) { using namespace magic_enum::ops;