//===----------------------------------------------------------------------===// // // 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 #include #include #include #include #include #include #include #include "test_iterators.h" #include "type_algorithms.h" template constexpr void test_containers() { using InIter = typename InContainer::iterator; using OutIter = typename OutContainer::iterator; { InContainer in{1, 2, 3, 4}; OutContainer out(4); std::same_as> auto ret = std::ranges::copy_n(in.begin(), in.size(), out.begin()); assert(std::ranges::equal(in, out)); assert(ret.in == in.end()); assert(ret.out == out.end()); } } template constexpr void test_join_view() { auto to_subranges = std::views::transform([](auto& vec) { return std::ranges::subrange(Iter(vec.data()), Sent(Iter(vec.data() + vec.size()))); }); { // segmented -> contiguous std::vector> vectors = {}; auto range = vectors | to_subranges; std::vector> subrange_vector(range.begin(), range.end()); std::array arr; std::ranges::copy_n((subrange_vector | std::views::join).begin(), std::ranges::distance(subrange_vector | std::views::join), arr.begin()); assert(std::ranges::equal(arr, std::array{})); } { // segmented -> contiguous std::vector> vectors = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10}, {}}; auto range = vectors | to_subranges; std::vector> subrange_vector(range.begin(), range.end()); std::array arr; std::ranges::copy_n((subrange_vector | std::views::join).begin(), std::ranges::distance(subrange_vector | std::views::join), arr.begin()); assert(std::ranges::equal(arr, std::array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})); } { // contiguous -> segmented std::vector> vectors = {{0, 0, 0, 0}, {0, 0}, {0, 0, 0, 0}, {}}; auto range = vectors | to_subranges; std::vector> subrange_vector(range.begin(), range.end()); std::array arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::ranges::copy_n(arr.begin(), arr.size(), (subrange_vector | std::views::join).begin()); assert(std::ranges::equal(subrange_vector | std::views::join, std::array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})); } { // segmented -> segmented std::vector> vectors = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10}, {}}; auto range1 = vectors | to_subranges; std::vector> subrange_vector(range1.begin(), range1.end()); std::vector> to_vectors = {{0, 0, 0, 0}, {0, 0, 0, 0}, {}, {0, 0}}; auto range2 = to_vectors | to_subranges; std::vector> to_subrange_vector(range2.begin(), range2.end()); std::ranges::copy_n((subrange_vector | std::views::join).begin(), std::ranges::distance(subrange_vector | std::views::join), (to_subrange_vector | std::views::join).begin()); assert(std::ranges::equal(to_subrange_vector | std::views::join, std::array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})); } } constexpr bool test_constexpr() { test_containers, std::vector>(); // TODO: this should be cpp20_input_iterator_list, not forward_iterator_list types::for_each(types::forward_iterator_list{}, [] { test_join_view(); test_join_view>(); test_join_view>(); }); return true; } int main(int, char**) { test_containers, std::deque>(); test_containers, std::vector>(); test_containers, std::deque>(); test_constexpr(); static_assert(test_constexpr()); return 0; }