diff --git a/.travis.yml b/.travis.yml index 37e0eac..d26d34a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -147,7 +147,7 @@ matrix: osx_image: xcode10 stage: coverage name: coverage, xcode10 - addons: { homebrew: { packages: ["lcov"] } } + addons: { homebrew: { packages: ["lcov"], update: true } } script: ./scripts/upload_coverage.sh before_install: diff --git a/README.md b/README.md index 6dee0d1..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(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 d9cd08e..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; @@ -119,7 +117,7 @@ namespace enum_hpp namespace enum_hpp::detail { template < typename Enum > - struct ignore_assign { + struct ignore_assign final { Enum value; constexpr explicit ignore_assign(Enum value) noexcept @@ -229,7 +227,7 @@ namespace enum_hpp::detail // #define ENUM_HPP_TRAITS_DECL(Enum, Fields)\ - struct Enum##_traits {\ + struct Enum##_traits final {\ private:\ enum enum_names_for_this_score_ {\ ENUM_HPP_GENERATE_FIELDS(Fields)\ @@ -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; // ----------------------------------------------------------------------------- // @@ -902,6 +897,7 @@ namespace enum_hpp::detail #define ENUM_HPP_PP_SEQ_SIZE_252(_) ENUM_HPP_PP_SEQ_SIZE_253 #define ENUM_HPP_PP_SEQ_SIZE_253(_) ENUM_HPP_PP_SEQ_SIZE_254 #define ENUM_HPP_PP_SEQ_SIZE_254(_) ENUM_HPP_PP_SEQ_SIZE_255 +#define ENUM_HPP_PP_SEQ_SIZE_255(_) ENUM_HPP_PP_SEQ_SIZE_256 # define ENUM_HPP_PP_SEQ_SIZE_ENUM_HPP_PP_SEQ_SIZE_0 0 # define ENUM_HPP_PP_SEQ_SIZE_ENUM_HPP_PP_SEQ_SIZE_1 1 @@ -1159,6 +1155,7 @@ namespace enum_hpp::detail # define ENUM_HPP_PP_SEQ_SIZE_ENUM_HPP_PP_SEQ_SIZE_253 253 # define ENUM_HPP_PP_SEQ_SIZE_ENUM_HPP_PP_SEQ_SIZE_254 254 # define ENUM_HPP_PP_SEQ_SIZE_ENUM_HPP_PP_SEQ_SIZE_255 255 +# define ENUM_HPP_PP_SEQ_SIZE_ENUM_HPP_PP_SEQ_SIZE_256 256 // // ENUM_HPP_PP_SEQ_FOR_EACH @@ -1422,3 +1419,4 @@ namespace enum_hpp::detail #define ENUM_HPP_PP_SEQ_FOR_EACH_253(m, d, i, s) m(d, i, ENUM_HPP_PP_SEQ_HEAD(s)) ENUM_HPP_PP_SEQ_FOR_EACH_252(m, d, ENUM_HPP_PP_INC(i), ENUM_HPP_PP_SEQ_TAIL(s)) #define ENUM_HPP_PP_SEQ_FOR_EACH_254(m, d, i, s) m(d, i, ENUM_HPP_PP_SEQ_HEAD(s)) ENUM_HPP_PP_SEQ_FOR_EACH_253(m, d, ENUM_HPP_PP_INC(i), ENUM_HPP_PP_SEQ_TAIL(s)) #define ENUM_HPP_PP_SEQ_FOR_EACH_255(m, d, i, s) m(d, i, ENUM_HPP_PP_SEQ_HEAD(s)) ENUM_HPP_PP_SEQ_FOR_EACH_254(m, d, ENUM_HPP_PP_INC(i), ENUM_HPP_PP_SEQ_TAIL(s)) +#define ENUM_HPP_PP_SEQ_FOR_EACH_256(m, d, i, s) m(d, i, ENUM_HPP_PP_SEQ_HEAD(s)) ENUM_HPP_PP_SEQ_FOR_EACH_255(m, d, ENUM_HPP_PP_INC(i), ENUM_HPP_PP_SEQ_TAIL(s)) 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 e739a97..6bc8b03 100644 --- a/untests/enum_tests.cpp +++ b/untests/enum_tests.cpp @@ -54,6 +54,10 @@ namespace some_namespace (_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)) + 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 { @@ -66,13 +70,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::exns::external_enum) - TEST_CASE("enum") { namespace sn = some_namespace; @@ -148,6 +150,11 @@ TEST_CASE("enum") { STATIC_REQUIRE(enum_hpp::traits_t::size == 241u); STATIC_REQUIRE(std::size(enum_hpp::names()) == 241u); STATIC_REQUIRE(std::size(enum_hpp::values()) == 241u); + + STATIC_REQUIRE(enum_hpp::size() == 4u); + STATIC_REQUIRE(enum_hpp::traits_t::size == 4u); + STATIC_REQUIRE(std::size(enum_hpp::names()) == 4u); + STATIC_REQUIRE(std::size(enum_hpp::values()) == 4u); } }