Skip to content

Commit 67a745e

Browse files
committed
Simplify flip() for std::bit_set
1 parent 93c2577 commit 67a745e

File tree

3 files changed

+152
-139
lines changed

3 files changed

+152
-139
lines changed

libcxx/include/bitset

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -320,18 +320,8 @@ __bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT {
320320

321321
template <size_t _N_words, size_t _Size>
322322
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __bitset<_N_words, _Size>::flip() _NOEXCEPT {
323-
// do middle whole words
324-
size_type __n = _Size;
325-
__storage_pointer __p = __first_;
326-
for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
327-
*__p = ~*__p;
328-
// do last partial word
329-
if (__n > 0) {
330-
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
331-
__storage_type __b = *__p & __m;
332-
*__p &= ~__m;
333-
*__p |= ~__b & __m;
334-
}
323+
for (size_type __i = 0; __i < _N_words; ++__i)
324+
__first_[__i] = ~__first_[__i];
335325
}
336326

337327
template <size_t _N_words, size_t _Size>
@@ -513,9 +503,7 @@ __bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT {
513503

514504
template <size_t _Size>
515505
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __bitset<1, _Size>::flip() _NOEXCEPT {
516-
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
517-
__first_ = ~__first_;
518-
__first_ &= __m;
506+
__first_ = ~__first_;
519507
}
520508

521509
template <size_t _Size>

libcxx/test/std/utilities/template.bitset/bitset.members/flip_all.pass.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,21 @@
1818

1919
template <std::size_t N>
2020
TEST_CONSTEXPR_CXX23 void test_flip_all() {
21-
std::vector<std::bitset<N> > const cases = get_test_cases<N>();
22-
for (std::size_t c = 0; c != cases.size(); ++c) {
23-
std::bitset<N> v1 = cases[c];
24-
std::bitset<N> v2 = v1;
25-
v2.flip();
26-
for (std::size_t i = 0; i < v1.size(); ++i)
27-
assert(v2[i] == ~v1[i]);
28-
}
21+
std::vector<std::bitset<N> > const cases = get_test_cases<N>();
22+
for (std::size_t c = 0; c != cases.size(); ++c) {
23+
std::bitset<N> v1 = cases[c];
24+
std::bitset<N> v2 = v1;
25+
v2.flip();
26+
for (std::size_t i = 0; i < v1.size(); ++i)
27+
assert(v2[i] == ~v1[i]);
28+
}
2929
}
3030

3131
TEST_CONSTEXPR_CXX23 bool test() {
3232
test_flip_all<0>();
3333
test_flip_all<1>();
34+
test_flip_all<2>();
35+
test_flip_all<5>();
3436
test_flip_all<31>();
3537
test_flip_all<32>();
3638
test_flip_all<33>();

0 commit comments

Comments
 (0)