Skip to content

Commit

Permalink
fix(enum): namespaced enum reflection
Browse files Browse the repository at this point in the history
  • Loading branch information
Curve committed Jul 12, 2024
1 parent 184677b commit 43bb219
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 21 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.16)
project(rebind LANGUAGES CXX VERSION 1.0.0)
project(rebind LANGUAGES CXX VERSION 1.1.0)

# --------------------------------------------------------------------------------------------------------
# Library options
Expand Down
11 changes: 7 additions & 4 deletions include/rebind/enum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,19 @@ namespace rebind
requires std::is_enum_v<decltype(T)>
consteval auto enum_name()
{
constexpr auto name = rebind::nttp_name<T>;
constexpr auto delim = name.find(enum_start);
constexpr auto name = rebind::nttp_name<T>;
constexpr auto type = rebind::type_name<decltype(T)>;

if constexpr (delim == std::string_view::npos)
constexpr auto start = name.substr(name.rfind(type) + type.size());
constexpr auto end = start.rfind(enum_start);

if constexpr (end == std::string_view::npos)
{
return std::string_view{};
}
else
{
return name.substr(delim + enum_start.size());
return start.substr(end + enum_start.size());
}
}

Expand Down
72 changes: 56 additions & 16 deletions tests/enum.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <rebind/enum.hpp>

using namespace boost::ut;
using namespace boost::ut::bdd;

enum class some_enum
{
Expand All @@ -10,31 +11,70 @@ enum class some_enum
c,
};

namespace ns
{
enum class another_enum
{
x,
y,
z,
};

}

// NOLINTNEXTLINE
suite<"enum"> enum_test = []()
{
expect(rebind::type_name<some_enum>.rfind("some_enum") != std::string_view::npos);
expect(rebind::nttp_name<some_enum::a> == "some_enum::a");
given("Non namespaced enum") = []()
{
expect(rebind::type_name<some_enum>.rfind("some_enum") != std::string_view::npos);
expect(rebind::nttp_name<some_enum::a> == "some_enum::a");

expect(rebind::enum_name<some_enum::a> == "a");
expect(rebind::enum_name<some_enum::b> == "b");

constexpr auto values = rebind::enum_values<some_enum>;

expect(values.size() == 3);

expect(values.at(0).name == "a");
expect(values.at(0).value == some_enum::a);

expect(values.at(1).name == "b");
expect(values.at(1).value == some_enum::b);

expect(values.at(2).name == "c");
expect(values.at(2).value == some_enum::c);

const auto value = rebind::enum_value(some_enum::c);
expect(value.has_value());

expect(value->name == "c");
expect(value->value == some_enum::c);
};

expect(rebind::enum_name<some_enum::a> == "a");
expect(rebind::enum_name<some_enum::b> == "b");
given("Namespaced enum") = []()
{
expect(rebind::enum_name<ns::another_enum::x> == "x");
expect(rebind::enum_name<ns::another_enum::y> == "y");

constexpr auto values = rebind::enum_values<some_enum>;
constexpr auto values = rebind::enum_values<ns::another_enum>;

expect(values.size() == 3);
expect(values.size() == 3);

expect(values.at(0).name == "a");
expect(values.at(0).value == some_enum::a);
expect(values.at(0).name == "x");
expect(values.at(0).value == ns::another_enum::x);

expect(values.at(1).name == "b");
expect(values.at(1).value == some_enum::b);
expect(values.at(1).name == "y");
expect(values.at(1).value == ns::another_enum::y);

expect(values.at(2).name == "c");
expect(values.at(2).value == some_enum::c);
expect(values.at(2).name == "z");
expect(values.at(2).value == ns::another_enum::z);

const auto value = rebind::enum_value(some_enum::c);
expect(value.has_value());
const auto value = rebind::enum_value(ns::another_enum::z);
expect(value.has_value());

expect(value->name == "c");
expect(value->value == some_enum::c);
expect(value->name == "z");
expect(value->value == ns::another_enum::z);
};
};

0 comments on commit 43bb219

Please sign in to comment.