[libcxx-commits] [libcxx] [libc++] Optimize ranges::copy{, _n} for vector<bool>::iterator (PR #121013)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jan 29 09:13:52 PST 2025
================
@@ -70,53 +69,78 @@ test_copy_n()
}
}
-TEST_CONSTEXPR_CXX20 bool
-test()
-{
- test_copy_n<cpp17_input_iterator<const int*>, cpp17_output_iterator<int*> >();
- test_copy_n<cpp17_input_iterator<const int*>, cpp17_input_iterator<int*> >();
- test_copy_n<cpp17_input_iterator<const int*>, forward_iterator<int*> >();
- test_copy_n<cpp17_input_iterator<const int*>, bidirectional_iterator<int*> >();
- test_copy_n<cpp17_input_iterator<const int*>, random_access_iterator<int*> >();
- test_copy_n<cpp17_input_iterator<const int*>, int*>();
-
- test_copy_n<forward_iterator<const int*>, cpp17_output_iterator<int*> >();
- test_copy_n<forward_iterator<const int*>, cpp17_input_iterator<int*> >();
- test_copy_n<forward_iterator<const int*>, forward_iterator<int*> >();
- test_copy_n<forward_iterator<const int*>, bidirectional_iterator<int*> >();
- test_copy_n<forward_iterator<const int*>, random_access_iterator<int*> >();
- test_copy_n<forward_iterator<const int*>, int*>();
-
- test_copy_n<bidirectional_iterator<const int*>, cpp17_output_iterator<int*> >();
- test_copy_n<bidirectional_iterator<const int*>, cpp17_input_iterator<int*> >();
- test_copy_n<bidirectional_iterator<const int*>, forward_iterator<int*> >();
- test_copy_n<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
- test_copy_n<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
- test_copy_n<bidirectional_iterator<const int*>, int*>();
-
- test_copy_n<random_access_iterator<const int*>, cpp17_output_iterator<int*> >();
- test_copy_n<random_access_iterator<const int*>, cpp17_input_iterator<int*> >();
- test_copy_n<random_access_iterator<const int*>, forward_iterator<int*> >();
- test_copy_n<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
- test_copy_n<random_access_iterator<const int*>, random_access_iterator<int*> >();
- test_copy_n<random_access_iterator<const int*>, int*>();
-
- test_copy_n<const int*, cpp17_output_iterator<int*> >();
- test_copy_n<const int*, cpp17_input_iterator<int*> >();
- test_copy_n<const int*, forward_iterator<int*> >();
- test_copy_n<const int*, bidirectional_iterator<int*> >();
- test_copy_n<const int*, random_access_iterator<int*> >();
- test_copy_n<const int*, int*>();
+TEST_CONSTEXPR_CXX20 bool test_vector_bool(std::size_t N) {
+ std::vector<bool> in(N, false);
+ for (std::size_t i = 0; i < N; i += 2)
+ in[i] = true;
+
+ { // Test copy with aligned bytes
+ std::vector<bool> out(N);
+ std::copy_n(in.begin(), N, out.begin());
+ assert(in == out);
+ }
+ { // Test copy with unaligned bytes
+ std::vector<bool> out(N + 8);
+ std::copy_n(in.begin(), N, out.begin() + 4);
+ for (std::size_t i = 0; i < N; ++i)
+ assert(out[i + 4] == in[i]);
+ }
+
+ return true;
+}
+
+TEST_CONSTEXPR_CXX20 bool test() {
+ test_copy_n<cpp17_input_iterator<const int*>, cpp17_output_iterator<int*> >();
+ test_copy_n<cpp17_input_iterator<const int*>, cpp17_input_iterator<int*> >();
+ test_copy_n<cpp17_input_iterator<const int*>, forward_iterator<int*> >();
+ test_copy_n<cpp17_input_iterator<const int*>, bidirectional_iterator<int*> >();
+ test_copy_n<cpp17_input_iterator<const int*>, random_access_iterator<int*> >();
+ test_copy_n<cpp17_input_iterator<const int*>, int*>();
+
+ test_copy_n<forward_iterator<const int*>, cpp17_output_iterator<int*> >();
+ test_copy_n<forward_iterator<const int*>, cpp17_input_iterator<int*> >();
+ test_copy_n<forward_iterator<const int*>, forward_iterator<int*> >();
+ test_copy_n<forward_iterator<const int*>, bidirectional_iterator<int*> >();
+ test_copy_n<forward_iterator<const int*>, random_access_iterator<int*> >();
+ test_copy_n<forward_iterator<const int*>, int*>();
+
+ test_copy_n<bidirectional_iterator<const int*>, cpp17_output_iterator<int*> >();
+ test_copy_n<bidirectional_iterator<const int*>, cpp17_input_iterator<int*> >();
+ test_copy_n<bidirectional_iterator<const int*>, forward_iterator<int*> >();
+ test_copy_n<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
+ test_copy_n<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
+ test_copy_n<bidirectional_iterator<const int*>, int*>();
+
+ test_copy_n<random_access_iterator<const int*>, cpp17_output_iterator<int*> >();
+ test_copy_n<random_access_iterator<const int*>, cpp17_input_iterator<int*> >();
+ test_copy_n<random_access_iterator<const int*>, forward_iterator<int*> >();
+ test_copy_n<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
+ test_copy_n<random_access_iterator<const int*>, random_access_iterator<int*> >();
+ test_copy_n<random_access_iterator<const int*>, int*>();
+
+ test_copy_n<const int*, cpp17_output_iterator<int*> >();
+ test_copy_n<const int*, cpp17_input_iterator<int*> >();
+ test_copy_n<const int*, forward_iterator<int*> >();
+ test_copy_n<const int*, bidirectional_iterator<int*> >();
+ test_copy_n<const int*, random_access_iterator<int*> >();
+ test_copy_n<const int*, int*>();
+
+ { // Test vector<bool>::iterator optimization
+ assert(test_vector_bool(8));
----------------
ldionne wrote:
Same comment here for odd-sizes.
https://github.com/llvm/llvm-project/pull/121013
More information about the libcxx-commits
mailing list