diff options
author | kshalnev <kshalnev@yandex-team.com> | 2023-10-27 17:59:37 +0300 |
---|---|---|
committer | kshalnev <kshalnev@yandex-team.com> | 2023-10-27 19:28:00 +0300 |
commit | 2be392e52a29b389db2c1f0ae186b0fe180dd4c6 (patch) | |
tree | 2b83f6ff8b1fb0d5a855c151034aa984fd1440ba | |
parent | 29c7555b133403754dc684390472a6ce6ab044a7 (diff) | |
download | ydb-2be392e52a29b389db2c1f0ae186b0fe180dd4c6.tar.gz |
Added HasFlag/Remove Flag for operations with one value, added HasAnyOfFlags.
-rw-r--r-- | util/generic/flags.h | 25 | ||||
-rw-r--r-- | util/generic/flags_ut.cpp | 10 |
2 files changed, 29 insertions, 6 deletions
diff --git a/util/generic/flags.h b/util/generic/flags.h index 2e8d6b93d0..80e2f17b7f 100644 --- a/util/generic/flags.h +++ b/util/generic/flags.h @@ -126,13 +126,13 @@ public: return l.Value_ != static_cast<TInt>(r); } - TFlags& operator&=(TFlags mask) { - *this = *this & mask; + TFlags& operator&=(TFlags flags) { + *this = *this & flags; return *this; } - TFlags& operator&=(Enum mask) { - *this = *this & mask; + TFlags& operator&=(Enum value) { + *this = *this & value; return *this; } @@ -141,8 +141,8 @@ public: return *this; } - TFlags& operator|=(Enum flags) { - *this = *this | flags; + TFlags& operator|=(Enum value) { + *this = *this | value; return *this; } @@ -168,10 +168,23 @@ public: return Value_; } + constexpr bool HasFlag(Enum value) const { + return (Value_ & static_cast<TInt>(value)) == static_cast<TInt>(value); + } + constexpr bool HasFlags(TFlags flags) const { return (Value_ & flags.Value_) == flags.Value_; } + constexpr bool HasAnyOfFlags(TFlags flags) const { + return (Value_ & flags.Value_) != 0; + } + + TFlags RemoveFlag(Enum value) { + Value_ &= ~static_cast<TInt>(value); + return *this; + } + TFlags RemoveFlags(TFlags flags) { Value_ &= ~flags.Value_; return *this; diff --git a/util/generic/flags_ut.cpp b/util/generic/flags_ut.cpp index 5ea5771591..fa2d4464c9 100644 --- a/util/generic/flags_ut.cpp +++ b/util/generic/flags_ut.cpp @@ -42,9 +42,14 @@ Y_UNIT_TEST_SUITE(TFlagsTest) { UNIT_ASSERT(!(std::is_same<decltype(i), int>::value)); UNIT_ASSERT_VALUES_EQUAL(sizeof(Enum), sizeof(TFlags<Enum>)); + UNIT_ASSERT(i.HasFlag(Enum::Test1)); + UNIT_ASSERT(i.HasFlag(Enum::Test4) == false); UNIT_ASSERT(i.HasFlags(Enum::Test1)); UNIT_ASSERT(i.HasFlags(Enum::Test4) == false); UNIT_ASSERT(i.HasFlags(Enum::Test1 | Enum::Test4) == false); + UNIT_ASSERT(i.HasAnyOfFlags(Enum::Test1)); + UNIT_ASSERT(i.HasAnyOfFlags(Enum::Test4) == false); + UNIT_ASSERT(i.HasAnyOfFlags(Enum::Test1 | Enum::Test4)); i |= Enum::Test4; i ^= Enum::Test2; @@ -56,6 +61,11 @@ Y_UNIT_TEST_SUITE(TFlagsTest) { } { auto i = Enum::Test1 | Enum::Test2; + i.RemoveFlag(Enum::Test1); + UNIT_ASSERT_EQUAL(i, TFlags<Enum>(Enum::Test2)); + } + { + auto i = Enum::Test1 | Enum::Test2; i.RemoveFlags(Enum::Test1); UNIT_ASSERT_EQUAL(i, TFlags<Enum>(Enum::Test2)); } |