[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