[libcxx-commits] [libcxx] [libc++] Speed up vector<bool> copy/move-ctors [1/3] (PR #120132)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Wed Jan 29 09:02:41 PST 2025


================
@@ -11,64 +11,76 @@
 
 // vector(const vector& v);
 
-#include <vector>
 #include <cassert>
+#include <memory>
+#include <vector>
 
-#include "test_macros.h"
-#include "test_allocator.h"
 #include "min_allocator.h"
+#include "test_allocator.h"
+#include "test_macros.h"
 
-template <class C>
-TEST_CONSTEXPR_CXX20 void test(const C& x)
-{
-    typename C::size_type s = x.size();
-    C c(x);
-    LIBCPP_ASSERT(c.__invariants());
-    assert(c.size() == s);
-    assert(c == x);
-}
-
-TEST_CONSTEXPR_CXX20 bool tests()
-{
-    {
-        bool a[] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};
-        bool* an = a + sizeof(a)/sizeof(a[0]);
-        test(std::vector<bool>(a, an));
-    }
-    {
-        std::vector<bool, test_allocator<bool> > v(3, true, test_allocator<bool>(5));
-        std::vector<bool, test_allocator<bool> > v2 = v;
-        assert(v2 == v);
-        assert(v2.get_allocator() == v.get_allocator());
-    }
+template <class A>
+TEST_CONSTEXPR_CXX20 void test(const std::vector<bool, A>& x) {
+  std::vector<bool, A> c(x);
+  LIBCPP_ASSERT(c.__invariants());
+  assert(c.size() == x.size());
+  assert(c == x);
 #if TEST_STD_VER >= 11
-    {
-        std::vector<bool, other_allocator<bool> > v(3, true, other_allocator<bool>(5));
-        std::vector<bool, other_allocator<bool> > v2 = v;
-        assert(v2 == v);
-        assert(v2.get_allocator() == other_allocator<bool>(-2));
-    }
-    {
-        bool a[] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};
-        bool* an = a + sizeof(a)/sizeof(a[0]);
-        test(std::vector<bool, min_allocator<bool>>(a, an));
-    }
-    {
-        std::vector<bool, min_allocator<bool> > v(3, true, min_allocator<bool>());
-        std::vector<bool, min_allocator<bool> > v2 = v;
-        assert(v2 == v);
-        assert(v2.get_allocator() == v.get_allocator());
-    }
+  assert(c.get_allocator() == std::allocator_traits<A>::select_on_container_copy_construction(x.get_allocator()));
 #endif
+}
+
+TEST_CONSTEXPR_CXX20 bool tests() {
+  bool a05[5]  = {1, 0, 1, 0, 1};
+  bool a17[17] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1};
+  bool a33[33] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1};
+  bool a65[65] = {0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0};
+
+  { // Test the copy constructor with the default allocator
+    test(std::vector<bool>(a05, a05 + sizeof(a05) / sizeof(a05[0])));
+    test(std::vector<bool>(a17, a17 + sizeof(a17) / sizeof(a17[0])));
+    test(std::vector<bool>(a33, a33 + sizeof(a33) / sizeof(a33[0])));
+    test(std::vector<bool>(a65, a65 + sizeof(a65) / sizeof(a65[0])));
+    test(std::vector<bool>(257, true));
+  }
+
+  { // Test the copy constructor with test_allocator
+    using A = test_allocator<bool>;
----------------
ldionne wrote:

This test coverage seems to have dropped the check for e.g. `assert(v2.get_allocator() == other_allocator<bool>(-2));` that existed previously. Was that intentional?

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


More information about the libcxx-commits mailing list