From 9775ee45249f725824a9481bd4a30622753e306e Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 18 Dec 2020 16:32:59 +0700 Subject: [PATCH] fix bitflags logic ops --- headers/enum.hpp/enum_bitflags.hpp | 9 +++- untests/enum_bitflags_tests.cpp | 80 ++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/headers/enum.hpp/enum_bitflags.hpp b/headers/enum.hpp/enum_bitflags.hpp index 8012c0b..a84d275 100644 --- a/headers/enum.hpp/enum_bitflags.hpp +++ b/headers/enum.hpp/enum_bitflags.hpp @@ -17,6 +17,11 @@ namespace enum_hpp::bitflags using enum_type = Enum; using underlying_type = std::underlying_type_t; + bitflags() = default; + + bitflags(const bitflags&) = default; + bitflags& operator=(const bitflags&) = default; + constexpr bitflags(enum_type flags) : flags_(static_cast(flags)) {} @@ -44,11 +49,11 @@ namespace enum_hpp::bitflags #define ENUM_HPP_DEFINE_BINARY_OPERATOR(op)\ template < typename Enum >\ constexpr bool operator op(Enum l, bitflags r) noexcept {\ - return l op r.as_raw();\ + return l op r.as_enum();\ }\ template < typename Enum >\ constexpr bool operator op(bitflags l, Enum r) noexcept {\ - return l.as_raw() op r;\ + return l.as_enum() op r;\ }\ template < typename Enum >\ constexpr bool operator op(std::underlying_type_t l, bitflags r) noexcept {\ diff --git a/untests/enum_bitflags_tests.cpp b/untests/enum_bitflags_tests.cpp index af593ac..00b7fbb 100644 --- a/untests/enum_bitflags_tests.cpp +++ b/untests/enum_bitflags_tests.cpp @@ -34,22 +34,92 @@ TEST_CASE("enum_bitflags") { } SUBCASE("logic_operators") { + STATIC_CHECK(0x1 < bf::bitflags{access::write}); + STATIC_CHECK(access::read < bf::bitflags{access::write}); + STATIC_CHECK(bf::bitflags{access::read} < 0x2); + STATIC_CHECK(bf::bitflags{access::read} < access::write); STATIC_CHECK(bf::bitflags{access::read} < bf::bitflags{access::write}); + + STATIC_CHECK_FALSE(0x2 < bf::bitflags{access::read}); + STATIC_CHECK_FALSE(access::write < bf::bitflags{access::read}); + STATIC_CHECK_FALSE(bf::bitflags{access::write} < 0x1); + STATIC_CHECK_FALSE(bf::bitflags{access::write} < access::read); STATIC_CHECK_FALSE(bf::bitflags{access::write} < bf::bitflags{access::read}); + + STATIC_CHECK(0x1 <= bf::bitflags{access::write}); + STATIC_CHECK(access::read <= bf::bitflags{access::write}); + STATIC_CHECK(bf::bitflags{access::read} <= 0x2); + STATIC_CHECK(bf::bitflags{access::read} <= access::write); STATIC_CHECK(bf::bitflags{access::read} <= bf::bitflags{access::write}); + + STATIC_CHECK_FALSE(0x2 <= bf::bitflags{access::read}); + STATIC_CHECK_FALSE(access::write <= bf::bitflags{access::read}); + STATIC_CHECK_FALSE(bf::bitflags{access::write} <= 0x1); + STATIC_CHECK_FALSE(bf::bitflags{access::write} <= access::read); STATIC_CHECK_FALSE(bf::bitflags{access::write} <= bf::bitflags{access::read}); + + STATIC_CHECK(0x2 <= bf::bitflags{access::write}); + STATIC_CHECK(access::write <= bf::bitflags{access::write}); + STATIC_CHECK(bf::bitflags{access::write} <= 0x2); + STATIC_CHECK(bf::bitflags{access::write} <= access::write); STATIC_CHECK(bf::bitflags{access::write} <= bf::bitflags{access::write}); - STATIC_CHECK(bf::bitflags{access::write} > bf::bitflags{access::read}); - STATIC_CHECK_FALSE(bf::bitflags{access::read} > bf::bitflags{access::write}); - STATIC_CHECK(bf::bitflags{access::write} >= bf::bitflags{access::read}); - STATIC_CHECK_FALSE(bf::bitflags{access::read} >= bf::bitflags{access::write}); - STATIC_CHECK(bf::bitflags{access::read} >= bf::bitflags{access::read}); + // + STATIC_CHECK_FALSE(0x1 > bf::bitflags{access::write}); + STATIC_CHECK_FALSE(access::read > bf::bitflags{access::write}); + STATIC_CHECK_FALSE(bf::bitflags{access::read} > 0x2); + STATIC_CHECK_FALSE(bf::bitflags{access::read} > access::write); + STATIC_CHECK_FALSE(bf::bitflags{access::read} > bf::bitflags{access::write}); + + STATIC_CHECK(0x2 > bf::bitflags{access::read}); + STATIC_CHECK(access::write > bf::bitflags{access::read}); + STATIC_CHECK(bf::bitflags{access::write} > 0x1); + STATIC_CHECK(bf::bitflags{access::write} > access::read); + STATIC_CHECK(bf::bitflags{access::write} > bf::bitflags{access::read}); + + STATIC_CHECK_FALSE(0x1 >= bf::bitflags{access::write}); + STATIC_CHECK_FALSE(access::read >= bf::bitflags{access::write}); + STATIC_CHECK_FALSE(bf::bitflags{access::read} >= 0x2); + STATIC_CHECK_FALSE(bf::bitflags{access::read} >= access::write); + STATIC_CHECK_FALSE(bf::bitflags{access::read} >= bf::bitflags{access::write}); + + STATIC_CHECK(0x2 >= bf::bitflags{access::read}); + STATIC_CHECK(access::write >= bf::bitflags{access::read}); + STATIC_CHECK(bf::bitflags{access::write} >= 0x1); + STATIC_CHECK(bf::bitflags{access::write} >= access::read); + STATIC_CHECK(bf::bitflags{access::write} >= bf::bitflags{access::read}); + + STATIC_CHECK(0x2 >= bf::bitflags{access::write}); + STATIC_CHECK(access::write >= bf::bitflags{access::write}); + STATIC_CHECK(bf::bitflags{access::write} >= 0x2); + STATIC_CHECK(bf::bitflags{access::write} >= access::write); + STATIC_CHECK(bf::bitflags{access::write} >= bf::bitflags{access::write}); + + // + + STATIC_CHECK(0x1 == bf::bitflags{access::read}); + STATIC_CHECK(access::read == bf::bitflags{access::read}); + STATIC_CHECK(bf::bitflags{access::read} == 0x1); + STATIC_CHECK(bf::bitflags{access::read} == access::read); STATIC_CHECK(bf::bitflags{access::read} == bf::bitflags{access::read}); + + STATIC_CHECK_FALSE(0x1 == bf::bitflags{access::write}); + STATIC_CHECK_FALSE(access::read == bf::bitflags{access::write}); + STATIC_CHECK_FALSE(bf::bitflags{access::read} == 0x2); + STATIC_CHECK_FALSE(bf::bitflags{access::read} == access::write); STATIC_CHECK_FALSE(bf::bitflags{access::read} == bf::bitflags{access::write}); + STATIC_CHECK(0x1 != bf::bitflags{access::write}); + STATIC_CHECK(access::read != bf::bitflags{access::write}); + STATIC_CHECK(bf::bitflags{access::read} != 0x2); + STATIC_CHECK(bf::bitflags{access::read} != access::write); STATIC_CHECK(bf::bitflags{access::read} != bf::bitflags{access::write}); + + STATIC_CHECK_FALSE(0x1 != bf::bitflags{access::read}); + STATIC_CHECK_FALSE(access::read != bf::bitflags{access::read}); + STATIC_CHECK_FALSE(bf::bitflags{access::read} != 0x1); + STATIC_CHECK_FALSE(bf::bitflags{access::read} != access::read); STATIC_CHECK_FALSE(bf::bitflags{access::read} != bf::bitflags{access::read}); }