From 3e0bb0a12fb06d48582ce696cc411c6bbcdadf0e Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 20 Apr 2020 09:47:23 +0700 Subject: [PATCH 1/4] fix macosx CI build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From fc01416c4586cfa010c6ac0285dcbb22ff864703 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 20 Apr 2020 11:20:21 +0700 Subject: [PATCH 2/4] fix README and more tests --- README.md | 2 +- headers/enum.hpp/enum.hpp | 7 +++++-- untests/enum_tests.cpp | 19 +++++++++++++------ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6dee0d1..7a546f4 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ namespace some_namespace } // register traits in global namespace to generic access -ENUM_HPP_REGISTER_TRAITS(color) +ENUM_HPP_REGISTER_TRAITS(some_namespace::color) int main() { using color = some_namespace::color; diff --git a/headers/enum.hpp/enum.hpp b/headers/enum.hpp/enum.hpp index d9cd08e..455ef67 100644 --- a/headers/enum.hpp/enum.hpp +++ b/headers/enum.hpp/enum.hpp @@ -119,7 +119,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 +229,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)\ @@ -902,6 +902,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 +1160,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 +1424,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_tests.cpp b/untests/enum_tests.cpp index e739a97..26f63d2 100644 --- a/untests/enum_tests.cpp +++ b/untests/enum_tests.cpp @@ -52,7 +52,8 @@ namespace some_namespace (_161)(_162)(_163)(_164)(_165)(_166)(_167)(_168)(_169)(_170)(_171)(_172)(_173)(_174)(_175)(_176)(_177)(_178)(_179)(_180) (_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)) + (_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)) namespace exns { @@ -71,6 +72,7 @@ namespace some_namespace 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") { @@ -140,14 +142,19 @@ TEST_CASE("enum") { STATIC_REQUIRE(sn::render::mask_traits::size == std::size(sn::render::mask_traits::values)); } { - STATIC_REQUIRE(sn::numbers_traits::size == 241u); + STATIC_REQUIRE(sn::numbers_traits::size == 256u); STATIC_REQUIRE(sn::numbers_traits::size == std::size(sn::numbers_traits::names)); STATIC_REQUIRE(sn::numbers_traits::size == std::size(sn::numbers_traits::values)); - STATIC_REQUIRE(enum_hpp::size() == 241u); - 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() == 256u); + STATIC_REQUIRE(enum_hpp::traits_t::size == 256u); + STATIC_REQUIRE(std::size(enum_hpp::names()) == 256u); + STATIC_REQUIRE(std::size(enum_hpp::values()) == 256u); + + 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); } } From 9d80365d22b0923f255ced1f8433d7851094565b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 20 Apr 2020 11:49:21 +0700 Subject: [PATCH 3/4] 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; From bea509d6b08fbe15af3b92d0afcbe89ee3ab5957 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 20 Apr 2020 11:58:42 +0700 Subject: [PATCH 4/4] fix msvc nested macros limit --- untests/enum_tests.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/untests/enum_tests.cpp b/untests/enum_tests.cpp index a842df1..6bc8b03 100644 --- a/untests/enum_tests.cpp +++ b/untests/enum_tests.cpp @@ -52,8 +52,7 @@ namespace some_namespace (_161)(_162)(_163)(_164)(_165)(_166)(_167)(_168)(_169)(_170)(_171)(_172)(_173)(_174)(_175)(_176)(_177)(_178)(_179)(_180) (_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) - (_241)(_242)(_243)(_244)(_245)(_246)(_247)(_248)(_249)(_250)(_251)(_252)(_253)(_254)(_255)) + (_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) @@ -143,14 +142,14 @@ TEST_CASE("enum") { STATIC_REQUIRE(sn::render::mask_traits::size == std::size(sn::render::mask_traits::values)); } { - STATIC_REQUIRE(sn::numbers_traits::size == 256u); + STATIC_REQUIRE(sn::numbers_traits::size == 241u); STATIC_REQUIRE(sn::numbers_traits::size == std::size(sn::numbers_traits::names)); STATIC_REQUIRE(sn::numbers_traits::size == std::size(sn::numbers_traits::values)); - STATIC_REQUIRE(enum_hpp::size() == 256u); - STATIC_REQUIRE(enum_hpp::traits_t::size == 256u); - STATIC_REQUIRE(std::size(enum_hpp::names()) == 256u); - STATIC_REQUIRE(std::size(enum_hpp::values()) == 256u); + STATIC_REQUIRE(enum_hpp::size() == 241u); + 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);