// Copyright (C) 2020-2023 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-options "-std=gnu++2a" } // { dg-do run { target c++2a } } #include #include #include using __gnu_test::test_range; using __gnu_test::input_iterator_wrapper; using __gnu_test::output_iterator_wrapper; using __gnu_test::forward_iterator_wrapper; namespace ranges = std::ranges; template typename source_wrapper, template typename dest_wrapper> void test01() { int x[6] = {0, 0, 0, 1, 1, 1}; int y[2]; const int z[2] = {0, 1}; test_range rx(x); test_range ry(y); auto [in,out] = ranges::unique_copy(rx, ry.begin()); VERIFY( in == ranges::end(rx) && out == ranges::end(ry) ); VERIFY( ranges::equal(y, z) ); } template typename source_wrapper, template typename dest_wrapper> void test02() { int x[6] = {0, 0, 0, 1, 1, 1}; int y[2] = {0, 0}; const int z[2] = {0, 0}; test_range rx(x, x); test_range ry(y, y); auto [in, out] = ranges::unique_copy(rx.begin(), rx.end(), ry.begin()); VERIFY( in.ptr == x && out.ptr == y ); VERIFY( ranges::equal(y, z) ); } template typename source_wrapper, template typename dest_wrapper> void test03() { struct X { int i; }; X x[6] = { {1}, {2}, {2}, {4}, {4}, {6} }; X y[4] = { {1}, {2}, {4}, {6} }; const X z[4] = { {1}, {2}, {4}, {6} }; test_range rx(x); test_range ry(y); auto [in, out] = ranges::unique_copy(rx, ry.begin(), ranges::equal_to{}, &X::i); VERIFY( in == ranges::end(rx) && out == ranges::end(ry) ); VERIFY( ranges::equal(y, z, {}, &X::i, &X::i) ); } constexpr bool test04() { struct X { int i; }; X x[7] = { {1}, {2}, {2}, {2}, {4}, {4}, {6} }; X y[4] = { {1}, {2}, {4}, {6} }; const X z[4] = { {1}, {2}, {4}, {6} }; auto [in, out] = ranges::unique_copy(x, x+7, y, ranges::equal_to{}, &X::i); return (in == ranges::end(x) && out == ranges::end(y) && ranges::equal(y, z, {}, &X::i, &X::i)); } int main() { test01(); test01(); test01(); test02(); test02(); test02(); test03(); test03(); test03(); static_assert(test04()); }