diff --git a/enum_set.hh b/enum_set.hh index 9532f1342e..5f869de510 100644 --- a/enum_set.hh +++ b/enum_set.hh @@ -172,6 +172,14 @@ public: return enum_set(mask); } + static constexpr mask_type full_mask() { + return ~(std::numeric_limits::max() << (Enum::max_sequence + 1)); + } + + static constexpr enum_set full() { + return enum_set(full_mask()); + } + static inline mask_type mask_for(enum_type e) { return mask_type(1) << Enum::sequence_for(e); } diff --git a/tests/enum_set_test.cc b/tests/enum_set_test.cc index c7bdd982c0..ca5535dc1c 100644 --- a/tests/enum_set_test.cc +++ b/tests/enum_set_test.cc @@ -79,6 +79,13 @@ BOOST_AUTO_TEST_CASE(set_contains) { BOOST_REQUIRE(!fs.contains(fruit::pear)); } +BOOST_AUTO_TEST_CASE(full_set) { + const auto fs = fruit_set::full(); + BOOST_REQUIRE(fs.contains(fruit::apple)); + BOOST_REQUIRE(fs.contains(fruit::pear)); + BOOST_REQUIRE(fs.contains(fruit::banana)); +} + BOOST_AUTO_TEST_CASE(set_from_mask) { const auto fs = fruit_set::of(); BOOST_REQUIRE_EQUAL(fs.mask(), fruit_set::from_mask(fs.mask()).mask());