Skip to content

Commit 3ff7c9b

Browse files
NikolausDemmelgrisumbras
authored andcommitted
Fix erase for enum argument. (#27)
* Add failing unit tests for erase() * Fixes for erase - For enum argument, previous implementation was not correct for already unset flag. - For iterator range, return value was incorrect. Fixes #23
1 parent c778578 commit 3ff7c9b

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

include/flags/flags.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,14 +253,14 @@ template <class E> class flags {
253253

254254
size_type erase(enum_type e) noexcept {
255255
auto e_count = count(e);
256-
val_ ^= static_cast<impl_type>(e);
256+
val_ &= ~static_cast<impl_type>(e);
257257
return e_count;
258258
}
259259

260260
iterator erase(iterator i1, iterator i2) noexcept {
261261
val_ ^= flags(i1, i2).val_;
262262
update_uvalue(i2);
263-
return ++i2;
263+
return i2;
264264
}
265265

266266

test/main-test.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,41 @@ void test_bitset() {
334334
BOOST_TEST_EQ((1 | 4 | 8), a_bitset.to_ulong());
335335
}
336336

337+
void test_erase() {
338+
Enums flags(Enum::Two, Enum::Four, Enum::Eight);
339+
BOOST_TEST_EQ((2 | 4 | 8), flags.underlying_value());
340+
341+
// erase unsets flag if set:
342+
flags.erase(Enum::Four);
343+
BOOST_TEST_EQ((2 | 8), flags.underlying_value());
344+
// erase is noop if not set:
345+
flags.erase(Enum::Four);
346+
BOOST_TEST_EQ((2 | 8), flags.underlying_value());
347+
348+
// erase unsets flag if set:
349+
flags.erase(Enum::Two);
350+
flags.erase(Enum::Eight);
351+
BOOST_TEST_EQ(0, flags.underlying_value());
352+
// erase is noop if not set:
353+
flags.erase(Enum::Two);
354+
flags.erase(Enum::Eight);
355+
BOOST_TEST_EQ(0, flags.underlying_value());
356+
}
357+
358+
void test_erase_iterator() {
359+
Enums flags(Enum::One, Enum::Two, Enum::Four, Enum::Eight);
360+
BOOST_TEST_EQ((1 | 2 | 4 | 8), flags.underlying_value());
361+
362+
// erase single value via iterator:
363+
auto it1 = flags.erase(flags.find(Enum::Four));
364+
BOOST_TEST_EQ((1 | 2 | 8), flags.underlying_value());
365+
BOOST_TEST_EQ(8, static_cast<int>(*it1));
366+
367+
// erase range via iterator:
368+
auto it2 = flags.erase(flags.begin(), std::next(std::next(flags.begin())));
369+
BOOST_TEST_EQ(8, flags.underlying_value());
370+
BOOST_TEST_EQ(8, static_cast<int>(*it2));
371+
}
337372

338373
int main() {
339374
test_set_underlying_value();
@@ -348,5 +383,7 @@ int main() {
348383
test_bit_or();
349384
test_bit_xor();
350385
test_bitset();
386+
test_erase();
387+
test_erase_iterator();
351388
return boost::report_errors();
352389
}

0 commit comments

Comments
 (0)