From 9d80365d22b0923f255ced1f8433d7851094565b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 20 Apr 2020 11:49:21 +0700 Subject: [PATCH] register traits in enum namespace --- README.md | 12 ++++++------ headers/enum.hpp/enum.hpp | 11 +++-------- untests/enum_examples.cpp | 4 ++-- untests/enum_tests.cpp | 11 ++++++----- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 7a546f4..6eb2572 100644 --- a/README.md +++ b/README.md @@ -142,10 +142,10 @@ namespace some_namespace (green = 0x00FF00) (blue = 0x0000FF) (white = red | green | blue)) -} -// register traits in global namespace to generic access -ENUM_HPP_REGISTER_TRAITS(some_namespace::color) + // register traits in enum namespace to generic access + ENUM_HPP_REGISTER_TRAITS(color) +} int main() { using color = some_namespace::color; @@ -176,9 +176,9 @@ namespace external_ns (a) (b) (c)) -} -ENUM_HPP_REGISTER_TRAITS(external_ns::external_enum) + ENUM_HPP_REGISTER_TRAITS(external_enum) +} int main() { using ee = external_ns::external_enum; @@ -245,7 +245,7 @@ struct /*enum_name*/_traits { ### Generic functions ```cpp -// should be in global namespace +// should be in enum namespace ENUM_HPP_REGISTER_TRAITS(/*declared_enum_name*/) namespace enum_hpp diff --git a/headers/enum.hpp/enum.hpp b/headers/enum.hpp/enum.hpp index 455ef67..b66f5d8 100644 --- a/headers/enum.hpp/enum.hpp +++ b/headers/enum.hpp/enum.hpp @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -27,10 +28,7 @@ namespace enum_hpp namespace enum_hpp { template < typename Enum > - struct traits; - - template < typename Enum > - using traits_t = typename traits::type; + using traits_t = decltype(enum_hpp_adl_find_registered_traits(std::declval())); template < typename Enum > using underlying_type = typename traits_t::underlying_type; @@ -335,10 +333,7 @@ namespace enum_hpp::detail // #define ENUM_HPP_REGISTER_TRAITS(Enum)\ - template <>\ - struct enum_hpp::traits {\ - using type = Enum##_traits;\ - }; + [[maybe_unused]] Enum##_traits enum_hpp_adl_find_registered_traits(Enum) noexcept; // ----------------------------------------------------------------------------- // diff --git a/untests/enum_examples.cpp b/untests/enum_examples.cpp index 602d5e0..b328613 100644 --- a/untests/enum_examples.cpp +++ b/untests/enum_examples.cpp @@ -19,9 +19,9 @@ namespace (green = 0x00FF00) (blue = 0x0000FF) (white = red | green | blue)) -} -ENUM_HPP_REGISTER_TRAITS(color) + ENUM_HPP_REGISTER_TRAITS(color) +} TEST_CASE("examples") { SECTION("traits_using") { diff --git a/untests/enum_tests.cpp b/untests/enum_tests.cpp index 26f63d2..a842df1 100644 --- a/untests/enum_tests.cpp +++ b/untests/enum_tests.cpp @@ -55,6 +55,10 @@ namespace some_namespace (_221)(_222)(_223)(_224)(_225)(_226)(_227)(_228)(_229)(_230)(_231)(_232)(_233)(_234)(_235)(_236)(_237)(_238)(_239)(_240) (_241)(_242)(_243)(_244)(_245)(_246)(_247)(_248)(_249)(_250)(_251)(_252)(_253)(_254)(_255)) + ENUM_HPP_REGISTER_TRAITS(some_namespace::color) + ENUM_HPP_REGISTER_TRAITS(some_namespace::numbers) + ENUM_HPP_REGISTER_TRAITS(some_namespace::render::mask) + namespace exns { enum class external_enum : unsigned short { @@ -67,14 +71,11 @@ namespace some_namespace (a) (b) (c)) + + ENUM_HPP_REGISTER_TRAITS(external_enum) } } -ENUM_HPP_REGISTER_TRAITS(some_namespace::color) -ENUM_HPP_REGISTER_TRAITS(some_namespace::numbers) -ENUM_HPP_REGISTER_TRAITS(some_namespace::render::mask) -ENUM_HPP_REGISTER_TRAITS(some_namespace::exns::external_enum) - TEST_CASE("enum") { namespace sn = some_namespace;