[libcxx-commits] [libcxx] [libc++] Simplify vector<bool>::flip() and add new tests (PR #119607)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Thu Dec 12 07:43:29 PST 2024


================
@@ -1049,18 +1049,14 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::resize(size_type __
 
 template <class _Allocator>
 _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::flip() _NOEXCEPT {
-  // do middle whole words
+  // Process the whole words in the front
   size_type __n         = __size_;
   __storage_pointer __p = __begin_;
   for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
     *__p = ~*__p;
-  // do last partial word
-  if (__n > 0) {
-    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
-    __storage_type __b = *__p & __m;
-    *__p &= ~__m;
-    *__p |= ~__b & __m;
-  }
+  // Process the last partial word, if it exists
----------------
philnik777 wrote:

Yeah, but why? Is it an invariant that bits past the end are zeroed? If not, we can just flip them as well unconditionally and not care about flipping only relevant bits. It's not like we gain anything by not flipping irrelevant bits.

https://github.com/llvm/llvm-project/pull/119607


More information about the libcxx-commits mailing list