fix bitflags logic ops

This commit is contained in:
BlackMATov
2020-12-18 16:32:59 +07:00
parent 7cdc2885b0
commit 9775ee4524
2 changed files with 82 additions and 7 deletions

View File

@@ -17,6 +17,11 @@ namespace enum_hpp::bitflags
using enum_type = Enum;
using underlying_type = std::underlying_type_t<Enum>;
bitflags() = default;
bitflags(const bitflags&) = default;
bitflags& operator=(const bitflags&) = default;
constexpr bitflags(enum_type flags)
: flags_(static_cast<underlying_type>(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<Enum> r) noexcept {\
return l op r.as_raw();\
return l op r.as_enum();\
}\
template < typename Enum >\
constexpr bool operator op(bitflags<Enum> 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<Enum> l, bitflags<Enum> r) noexcept {\

View File

@@ -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});
}