Loading include/ftl/flags.h +10 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include <bitset> #include <cstdint> #include <iterator> #include <initializer_list> #include <string> #include <type_traits> Loading @@ -40,6 +41,7 @@ class Flags { public: constexpr Flags(F f) : mFlags(static_cast<U>(f)) {} constexpr Flags(std::initializer_list<F> fs) : mFlags(combine(fs)) {} constexpr Flags() : mFlags(0) {} constexpr Flags(const Flags<F>& f) : mFlags(f.mFlags) {} Loading Loading @@ -197,6 +199,14 @@ public: private: U mFlags; static constexpr U combine(std::initializer_list<F> fs) { U result = 0; for (const F f : fs) { result |= static_cast<U>(f); } return result; } static void appendFlag(std::string& str, const std::string_view& flag, bool& first) { if (first) { first = false; Loading libs/ftl/flags_test.cpp +13 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ #include <ftl/flags.h> #include <gtest/gtest.h> #include <type_traits> #include <initializer_list> namespace android::test { Loading Loading @@ -59,6 +59,18 @@ TEST(Flags, All) { ASSERT_FALSE(flags.all(TestFlags::ONE | TestFlags::TWO | TestFlags::THREE)); } TEST(Flags, ImplicitConstructionAndAssignmentFromInitializerList) { Flags<TestFlags> flags = {TestFlags::ONE, TestFlags::THREE}; ASSERT_TRUE(flags.test(TestFlags::ONE)); ASSERT_FALSE(flags.test(TestFlags::TWO)); ASSERT_TRUE(flags.test(TestFlags::THREE)); flags = {}; ASSERT_FALSE(flags.test(TestFlags::ONE)); ASSERT_FALSE(flags.test(TestFlags::TWO)); ASSERT_FALSE(flags.test(TestFlags::THREE)); } TEST(Flags, DefaultConstructor_hasNoFlagsSet) { Flags<TestFlags> flags; ASSERT_FALSE(flags.any(TestFlags::ONE | TestFlags::TWO | TestFlags::THREE)); Loading Loading
include/ftl/flags.h +10 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include <bitset> #include <cstdint> #include <iterator> #include <initializer_list> #include <string> #include <type_traits> Loading @@ -40,6 +41,7 @@ class Flags { public: constexpr Flags(F f) : mFlags(static_cast<U>(f)) {} constexpr Flags(std::initializer_list<F> fs) : mFlags(combine(fs)) {} constexpr Flags() : mFlags(0) {} constexpr Flags(const Flags<F>& f) : mFlags(f.mFlags) {} Loading Loading @@ -197,6 +199,14 @@ public: private: U mFlags; static constexpr U combine(std::initializer_list<F> fs) { U result = 0; for (const F f : fs) { result |= static_cast<U>(f); } return result; } static void appendFlag(std::string& str, const std::string_view& flag, bool& first) { if (first) { first = false; Loading
libs/ftl/flags_test.cpp +13 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ #include <ftl/flags.h> #include <gtest/gtest.h> #include <type_traits> #include <initializer_list> namespace android::test { Loading Loading @@ -59,6 +59,18 @@ TEST(Flags, All) { ASSERT_FALSE(flags.all(TestFlags::ONE | TestFlags::TWO | TestFlags::THREE)); } TEST(Flags, ImplicitConstructionAndAssignmentFromInitializerList) { Flags<TestFlags> flags = {TestFlags::ONE, TestFlags::THREE}; ASSERT_TRUE(flags.test(TestFlags::ONE)); ASSERT_FALSE(flags.test(TestFlags::TWO)); ASSERT_TRUE(flags.test(TestFlags::THREE)); flags = {}; ASSERT_FALSE(flags.test(TestFlags::ONE)); ASSERT_FALSE(flags.test(TestFlags::TWO)); ASSERT_FALSE(flags.test(TestFlags::THREE)); } TEST(Flags, DefaultConstructor_hasNoFlagsSet) { Flags<TestFlags> flags; ASSERT_FALSE(flags.any(TestFlags::ONE | TestFlags::TWO | TestFlags::THREE)); Loading