15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <algorithm>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // template<BidirectionalIterator InIter, OutputIterator<auto, InIter::reference> OutIter>
12e8ea8296SMarshall Clow // constexpr OutIter // constexpr after C++17
135a83710eSEric Fiselier // reverse_copy(InIter first, InIter last, OutIter result);
145a83710eSEric Fiselier
155a83710eSEric Fiselier #include <algorithm>
165a83710eSEric Fiselier #include <cassert>
175a83710eSEric Fiselier
18e8ea8296SMarshall Clow #include "test_macros.h"
195a83710eSEric Fiselier #include "test_iterators.h"
205a83710eSEric Fiselier
21e8ea8296SMarshall Clow #if TEST_STD_VER > 17
test_constexpr()22e8ea8296SMarshall Clow TEST_CONSTEXPR bool test_constexpr() {
23e8ea8296SMarshall Clow int ia[] = {1, 3, 5, 2, 5, 6};
24e8ea8296SMarshall Clow int ib[std::size(ia)] = {0};
25e8ea8296SMarshall Clow
26e8ea8296SMarshall Clow auto it = std::reverse_copy(std::begin(ia), std::end(ia), std::begin(ib));
27e8ea8296SMarshall Clow
286d8abe42SBilly Robert O'Neal III return std::distance(std::begin(ib), it) == static_cast<int>(std::size(ia))
29e8ea8296SMarshall Clow && std::equal (std::begin(ia), std::end(ia), std::rbegin(ib))
30e8ea8296SMarshall Clow ;
31e8ea8296SMarshall Clow }
32e8ea8296SMarshall Clow #endif
33e8ea8296SMarshall Clow
345a83710eSEric Fiselier template <class InIter, class OutIter>
355a83710eSEric Fiselier void
test()365a83710eSEric Fiselier test()
375a83710eSEric Fiselier {
385a83710eSEric Fiselier const int ia[] = {0};
395a83710eSEric Fiselier const unsigned sa = sizeof(ia)/sizeof(ia[0]);
405a83710eSEric Fiselier int ja[sa] = {-1};
415a83710eSEric Fiselier OutIter r = std::reverse_copy(InIter(ia), InIter(ia), OutIter(ja));
425a83710eSEric Fiselier assert(base(r) == ja);
435a83710eSEric Fiselier assert(ja[0] == -1);
445a83710eSEric Fiselier r = std::reverse_copy(InIter(ia), InIter(ia+sa), OutIter(ja));
455a83710eSEric Fiselier assert(ja[0] == 0);
465a83710eSEric Fiselier
475a83710eSEric Fiselier const int ib[] = {0, 1};
485a83710eSEric Fiselier const unsigned sb = sizeof(ib)/sizeof(ib[0]);
495a83710eSEric Fiselier int jb[sb] = {-1};
505a83710eSEric Fiselier r = std::reverse_copy(InIter(ib), InIter(ib+sb), OutIter(jb));
515a83710eSEric Fiselier assert(base(r) == jb+sb);
525a83710eSEric Fiselier assert(jb[0] == 1);
535a83710eSEric Fiselier assert(jb[1] == 0);
545a83710eSEric Fiselier
555a83710eSEric Fiselier const int ic[] = {0, 1, 2};
565a83710eSEric Fiselier const unsigned sc = sizeof(ic)/sizeof(ic[0]);
575a83710eSEric Fiselier int jc[sc] = {-1};
585a83710eSEric Fiselier r = std::reverse_copy(InIter(ic), InIter(ic+sc), OutIter(jc));
595a83710eSEric Fiselier assert(base(r) == jc+sc);
605a83710eSEric Fiselier assert(jc[0] == 2);
615a83710eSEric Fiselier assert(jc[1] == 1);
625a83710eSEric Fiselier assert(jc[2] == 0);
635a83710eSEric Fiselier
645a83710eSEric Fiselier int id[] = {0, 1, 2, 3};
655a83710eSEric Fiselier const unsigned sd = sizeof(id)/sizeof(id[0]);
665a83710eSEric Fiselier int jd[sd] = {-1};
675a83710eSEric Fiselier r = std::reverse_copy(InIter(id), InIter(id+sd), OutIter(jd));
685a83710eSEric Fiselier assert(base(r) == jd+sd);
695a83710eSEric Fiselier assert(jd[0] == 3);
705a83710eSEric Fiselier assert(jd[1] == 2);
715a83710eSEric Fiselier assert(jd[2] == 1);
725a83710eSEric Fiselier assert(jd[3] == 0);
735a83710eSEric Fiselier }
745a83710eSEric Fiselier
main(int,char **)752df59c50SJF Bastien int main(int, char**)
765a83710eSEric Fiselier {
77*5e97d37bSMark de Wever test<bidirectional_iterator<const int*>, cpp17_output_iterator<int*> >();
785a83710eSEric Fiselier test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
795a83710eSEric Fiselier test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
805a83710eSEric Fiselier test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
815a83710eSEric Fiselier test<bidirectional_iterator<const int*>, int*>();
825a83710eSEric Fiselier
83*5e97d37bSMark de Wever test<random_access_iterator<const int*>, cpp17_output_iterator<int*> >();
845a83710eSEric Fiselier test<random_access_iterator<const int*>, forward_iterator<int*> >();
855a83710eSEric Fiselier test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
865a83710eSEric Fiselier test<random_access_iterator<const int*>, random_access_iterator<int*> >();
875a83710eSEric Fiselier test<random_access_iterator<const int*>, int*>();
885a83710eSEric Fiselier
89*5e97d37bSMark de Wever test<const int*, cpp17_output_iterator<int*> >();
905a83710eSEric Fiselier test<const int*, forward_iterator<int*> >();
915a83710eSEric Fiselier test<const int*, bidirectional_iterator<int*> >();
925a83710eSEric Fiselier test<const int*, random_access_iterator<int*> >();
935a83710eSEric Fiselier test<const int*, int*>();
94e8ea8296SMarshall Clow
95e8ea8296SMarshall Clow #if TEST_STD_VER > 17
96e8ea8296SMarshall Clow static_assert(test_constexpr());
97e8ea8296SMarshall Clow #endif
982df59c50SJF Bastien
992df59c50SJF Bastien return 0;
1005a83710eSEric Fiselier }
101