//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // UNSUPPORTED: c++03, c++11, c++14, c++17 // template S1, input_iterator I2, sentinel_for S2> // requires indirectly_swappable // constexpr ranges::swap_ranges_result // ranges::swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2); // template // requires indirectly_swappable, iterator_t> // constexpr ranges::swap_ranges_result, borrowed_iterator_t> // ranges::swap_ranges(R1&& r1, R2&& r2); #include #include #include #include #include "test_iterators.h" constexpr void test_different_lengths() { using Expected = std::ranges::swap_ranges_result; int i[3] = {1, 2, 3}; int j[1] = {4}; std::same_as auto r = std::ranges::swap_ranges(i, i + 3, j, j + 1); assert(r.in1 == i + 1); assert(r.in2 == j + 1); assert(i[0] == 4); assert(i[1] == 2); assert(i[2] == 3); assert(j[0] == 1); std::same_as auto r2 = std::ranges::swap_ranges(i, j); assert(r2.in1 == i + 1); assert(r2.in2 == j + 1); assert(i[0] == 1); assert(i[1] == 2); assert(i[2] == 3); assert(j[0] == 4); std::same_as auto r3 = std::ranges::swap_ranges(j, j + 1, i, i + 3); assert(r3.in1 == j + 1); assert(r3.in2 == i + 1); assert(i[0] == 4); assert(i[1] == 2); assert(i[2] == 3); assert(j[0] == 1); std::same_as auto r4 = std::ranges::swap_ranges(j, i); assert(r4.in1 == j + 1); assert(r4.in2 == i + 1); assert(i[0] == 1); assert(i[1] == 2); assert(i[2] == 3); assert(j[0] == 4); } constexpr void test_range() { std::array r1 = {1, 2, 3}; std::array r2 = {4, 5, 6}; std::same_as::iterator, std::array::iterator>> auto r = std::ranges::swap_ranges(r1, r2); assert(r.in1 == r1.end()); assert(r.in2 == r2.end()); assert((r1 == std::array{4, 5, 6})); assert((r2 == std::array{1, 2, 3})); } constexpr void test_borrowed_input_range() { { int r1[] = {1, 2, 3}; int r2[] = {4, 5, 6}; std::ranges::swap_ranges(std::views::all(r1), r2); assert(r1[0] == 4); assert(r1[1] == 5); assert(r1[2] == 6); assert(r2[0] == 1); assert(r2[1] == 2); assert(r2[2] == 3); } { int r1[] = {1, 2, 3}; int r2[] = {4, 5, 6}; std::ranges::swap_ranges(r1, std::views::all(r2)); assert(r1[0] == 4); assert(r1[1] == 5); assert(r1[2] == 6); assert(r2[0] == 1); assert(r2[1] == 2); assert(r2[2] == 3); } { int r1[] = {1, 2, 3}; int r2[] = {4, 5, 6}; std::ranges::swap_ranges(std::views::all(r1), std::views::all(r2)); assert(r1[0] == 4); assert(r1[1] == 5); assert(r1[2] == 6); assert(r2[0] == 1); assert(r2[1] == 2); assert(r2[2] == 3); } } constexpr void test_sentinel() { int i[3] = {1, 2, 3}; int j[3] = {4, 5, 6}; using It = cpp17_input_iterator; using Sent = sentinel_wrapper; using Expected = std::ranges::swap_ranges_result; std::same_as auto r = std::ranges::swap_ranges(It(i), Sent(It(i + 3)), It(j), Sent(It(j + 3))); assert(base(r.in1) == i + 3); assert(base(r.in2) == j + 3); assert(i[0] == 4); assert(i[1] == 5); assert(i[2] == 6); assert(j[0] == 1); assert(j[1] == 2); assert(j[2] == 3); } template constexpr void test_iterators() { using Expected = std::ranges::swap_ranges_result; int i[3] = {1, 2, 3}; int j[3] = {4, 5, 6}; std::same_as auto r = std::ranges::swap_ranges(Iter1(i), sentinel_wrapper(Iter1(i + 3)), Iter2(j), sentinel_wrapper(Iter2(j + 3))); assert(base(r.in1) == i + 3); assert(base(r.in2) == j + 3); assert(i[0] == 4); assert(i[1] == 5); assert(i[2] == 6); assert(j[0] == 1); assert(j[1] == 2); assert(j[2] == 3); } constexpr void test_rval_range() { { using Expected = std::ranges::swap_ranges_result::iterator, std::ranges::dangling>; std::array r = {1, 2, 3}; std::same_as auto a = std::ranges::swap_ranges(r, std::array{4, 5, 6}); assert((r == std::array{4, 5, 6})); assert(a.in1 == r.begin() + 3); } { std::array r = {1, 2, 3}; using Expected = std::ranges::swap_ranges_result::iterator>; std::same_as auto b = std::ranges::swap_ranges(std::array{4, 5, 6}, r); assert((r == std::array{4, 5, 6})); assert(b.in2 == r.begin() + 3); } } template constexpr void test_proxy_in_iterators() { test_iterators>, Out>(); test_iterators>, Out>(); test_iterators>, Out>(); test_iterators>, Out>(); test_iterators>, Out>(); } constexpr bool test() { test_range(); test_iterators, cpp20_input_iterator>(); test_iterators, forward_iterator>(); test_iterators, bidirectional_iterator>(); test_iterators, random_access_iterator>(); test_iterators, int*>(); test_iterators, cpp20_input_iterator>(); test_iterators, forward_iterator>(); test_iterators, bidirectional_iterator>(); test_iterators, random_access_iterator>(); test_iterators, int*>(); test_iterators, cpp20_input_iterator>(); test_iterators, forward_iterator>(); test_iterators, bidirectional_iterator>(); test_iterators, random_access_iterator>(); test_iterators, int*>(); test_iterators, cpp20_input_iterator>(); test_iterators, forward_iterator>(); test_iterators, bidirectional_iterator>(); test_iterators, random_access_iterator>(); test_iterators, int*>(); test_iterators>(); test_iterators>(); test_iterators>(); test_iterators>(); test_iterators(); test_proxy_in_iterators>>(); test_proxy_in_iterators>>(); test_proxy_in_iterators>>(); test_proxy_in_iterators>>(); test_proxy_in_iterators>>(); test_sentinel(); test_different_lengths(); test_borrowed_input_range(); test_rval_range(); return true; } static_assert(std::same_as, std::ranges::in_in_result>); int main(int, char**) { test(); static_assert(test()); return 0; }