aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkshalnev <kshalnev@yandex-team.com>2023-10-27 17:59:37 +0300
committerkshalnev <kshalnev@yandex-team.com>2023-10-27 19:28:00 +0300
commit2be392e52a29b389db2c1f0ae186b0fe180dd4c6 (patch)
tree2b83f6ff8b1fb0d5a855c151034aa984fd1440ba
parent29c7555b133403754dc684390472a6ce6ab044a7 (diff)
downloadydb-2be392e52a29b389db2c1f0ae186b0fe180dd4c6.tar.gz
Added HasFlag/Remove Flag for operations with one value, added HasAnyOfFlags.
-rw-r--r--util/generic/flags.h25
-rw-r--r--util/generic/flags_ut.cpp10
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));
}