diff --git a/README.md b/README.md index b4bd9c5..6dee0d1 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,8 @@ namespace some_namespace ENUM_HPP_REGISTER_TRAITS(color) int main() { + using color = some_namespace::color; + // to string static_assert(enum_hpp::to_string(color::red) == "red"); @@ -158,6 +160,34 @@ int main() { } ``` +### Adapting external enums + +```cpp +namespace external_ns +{ + enum class external_enum : unsigned short { + a = 10, + b, + c = a + b + }; + + // should be in the same namespace + ENUM_HPP_TRAITS_DECL(external_enum, + (a) + (b) + (c)) +} + +ENUM_HPP_REGISTER_TRAITS(external_ns::external_enum) + +int main() { + using ee = external_ns::external_enum; + static_assert(enum_hpp::to_string(ee::a) == "a"); + static_assert(enum_hpp::from_string("c") == ee::c); + return 0; +} +``` + ## API ### Enum traits @@ -170,11 +200,16 @@ ENUM_HPP_DECL( /*fields*/) // declare enum class -ENUM_HPP_DECL( +ENUM_HPP_CLASS_DECL( /*enum_name*/, /*underlying_type*/, /*fields*/) +// declare only traits +ENUM_HPP_TRAITS_DECL( + /*enum_name*/, + /*fields*/) + struct /*enum_name*/_traits { using underlying_type = /*underlying_type*/; static constexpr std::size_t size = /*field_count*/; diff --git a/untests/enum_tests.cpp b/untests/enum_tests.cpp index b54edd5..bd67a75 100644 --- a/untests/enum_tests.cpp +++ b/untests/enum_tests.cpp @@ -53,10 +53,25 @@ namespace some_namespace (_181)(_182)(_183)(_184)(_185)(_186)(_187)(_188)(_189)(_190)(_191)(_192)(_193)(_194)(_195)(_196)(_197)(_198)(_199)(_200) (_201)(_202)(_203)(_204)(_205)(_206)(_207)(_208)(_209)(_210)(_211)(_212)(_213)(_214)(_215)(_216)(_217)(_218)(_219)(_220) (_221)(_222)(_223)(_224)(_225)(_226)(_227)(_228)(_229)(_230)(_231)(_232)(_233)(_234)(_235)(_236)(_237)(_238)(_239)(_240)) + + namespace exns + { + enum class external_enum : unsigned short { + a = 10, + b, + c = a + b + }; + + ENUM_HPP_TRAITS_DECL(external_enum, + (a) + (b) + (c)) + } } ENUM_HPP_REGISTER_TRAITS(some_namespace::color) ENUM_HPP_REGISTER_TRAITS(some_namespace::numbers) +ENUM_HPP_REGISTER_TRAITS(some_namespace::exns::external_enum) TEST_CASE("enum") { namespace sn = some_namespace; @@ -375,3 +390,18 @@ TEST_CASE("enum") { } } } + +TEST_CASE("external_enum") { + using ee = some_namespace::exns::external_enum; + STATIC_REQUIRE(std::is_same_v, unsigned short>); + STATIC_REQUIRE(enum_hpp::size() == 3); + + STATIC_REQUIRE(enum_hpp::names()[0] == "a"); + STATIC_REQUIRE(enum_hpp::names()[2] == "c"); + + STATIC_REQUIRE(enum_hpp::values()[0] == ee::a); + STATIC_REQUIRE(enum_hpp::values()[2] == ee::c); + + STATIC_REQUIRE(enum_hpp::to_string(ee::c) == "c"); + STATIC_REQUIRE(enum_hpp::from_string("b") == ee::b); +}