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, BidirectionalIterator OutIter>
125a83710eSEric Fiselier //   requires OutputIterator<OutIter, RvalueOf<InIter::reference>::type>
135a83710eSEric Fiselier //   OutIter
145a83710eSEric Fiselier //   move_backward(InIter first, InIter last, OutIter result);
155a83710eSEric Fiselier 
165a83710eSEric Fiselier #include <algorithm>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier #include <memory>
195a83710eSEric Fiselier 
20ddda456aSEric Fiselier #include "test_macros.h"
215a83710eSEric Fiselier #include "test_iterators.h"
225a83710eSEric Fiselier 
235a83710eSEric Fiselier template <class InIter, class OutIter>
2424ab5787SCasey Carter TEST_CONSTEXPR_CXX17 bool
test()255a83710eSEric Fiselier test()
265a83710eSEric Fiselier {
275a83710eSEric Fiselier     const unsigned N = 1000;
283ed89b51Szoecarver     int ia[N] = {};
295a83710eSEric Fiselier     for (unsigned i = 0; i < N; ++i)
305a83710eSEric Fiselier         ia[i] = i;
315a83710eSEric Fiselier     int ib[N] = {0};
325a83710eSEric Fiselier 
335a83710eSEric Fiselier     OutIter r = std::move_backward(InIter(ia), InIter(ia+N), OutIter(ib+N));
345a83710eSEric Fiselier     assert(base(r) == ib);
355a83710eSEric Fiselier     for (unsigned i = 0; i < N; ++i)
365a83710eSEric Fiselier         assert(ia[i] == ib[i]);
373ed89b51Szoecarver 
383ed89b51Szoecarver     return true;
395a83710eSEric Fiselier }
405a83710eSEric Fiselier 
41ddda456aSEric Fiselier #if TEST_STD_VER >= 11
425a83710eSEric Fiselier template <class InIter, class OutIter>
435a83710eSEric Fiselier void
test1()445a83710eSEric Fiselier test1()
455a83710eSEric Fiselier {
465a83710eSEric Fiselier     const unsigned N = 100;
475a83710eSEric Fiselier     std::unique_ptr<int> ia[N];
485a83710eSEric Fiselier     for (unsigned i = 0; i < N; ++i)
495a83710eSEric Fiselier         ia[i].reset(new int(i));
505a83710eSEric Fiselier     std::unique_ptr<int> ib[N];
515a83710eSEric Fiselier 
525a83710eSEric Fiselier     OutIter r = std::move_backward(InIter(ia), InIter(ia+N), OutIter(ib+N));
535a83710eSEric Fiselier     assert(base(r) == ib);
545a83710eSEric Fiselier     for (unsigned i = 0; i < N; ++i)
55e17a155cSStephan T. Lavavej         assert(*ib[i] == static_cast<int>(i));
565a83710eSEric Fiselier }
57ddda456aSEric Fiselier #endif
585a83710eSEric Fiselier 
main(int,char **)592df59c50SJF Bastien int main(int, char**)
605a83710eSEric Fiselier {
615a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
625a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
635a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, int*>();
645a83710eSEric Fiselier 
655a83710eSEric Fiselier     test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
665a83710eSEric Fiselier     test<random_access_iterator<const int*>, random_access_iterator<int*> >();
675a83710eSEric Fiselier     test<random_access_iterator<const int*>, int*>();
685a83710eSEric Fiselier 
695a83710eSEric Fiselier     test<const int*, bidirectional_iterator<int*> >();
705a83710eSEric Fiselier     test<const int*, random_access_iterator<int*> >();
715a83710eSEric Fiselier     test<const int*, int*>();
725a83710eSEric Fiselier 
73ddda456aSEric Fiselier #if TEST_STD_VER >= 11
745a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
755a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
765a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
775a83710eSEric Fiselier 
785a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
795a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
805a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
815a83710eSEric Fiselier 
825a83710eSEric Fiselier     test1<std::unique_ptr<int>*, bidirectional_iterator<std::unique_ptr<int>*> >();
835a83710eSEric Fiselier     test1<std::unique_ptr<int>*, random_access_iterator<std::unique_ptr<int>*> >();
845a83710eSEric Fiselier     test1<std::unique_ptr<int>*, std::unique_ptr<int>*>();
85ddda456aSEric Fiselier #endif // TEST_STD_VER >= 11
862df59c50SJF Bastien 
873ed89b51Szoecarver #if TEST_STD_VER > 17
88*85167fb7SArthur O'Dwyer     test<bidirectional_iterator<const int*>, contiguous_iterator<int*>>();
89*85167fb7SArthur O'Dwyer     test<random_access_iterator<const int*>, contiguous_iterator<int*>>();
90*85167fb7SArthur O'Dwyer     test<const int*, contiguous_iterator<int*>>();
91*85167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, bidirectional_iterator<int*>>();
92*85167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, random_access_iterator<int*>>();
93*85167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, int*>();
94*85167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, contiguous_iterator<int*>>();
95*85167fb7SArthur O'Dwyer 
96*85167fb7SArthur O'Dwyer     test1<bidirectional_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
97*85167fb7SArthur O'Dwyer     test1<random_access_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
98*85167fb7SArthur O'Dwyer     test1<std::unique_ptr<int>*, contiguous_iterator<std::unique_ptr<int>*>>();
99*85167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*>>();
100*85167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*>>();
101*85167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
102*85167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
103*85167fb7SArthur O'Dwyer 
1043ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >());
1053ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, random_access_iterator<int*> >());
106*85167fb7SArthur O'Dwyer     static_assert(test<bidirectional_iterator<const int*>, contiguous_iterator<int*> >());
1073ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, int*>());
1083ed89b51Szoecarver 
1093ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, bidirectional_iterator<int*> >());
1103ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, random_access_iterator<int*> >());
111*85167fb7SArthur O'Dwyer     static_assert(test<random_access_iterator<const int*>, contiguous_iterator<int*> >());
1123ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, int*>());
1133ed89b51Szoecarver 
114*85167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, bidirectional_iterator<int*> >());
115*85167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, random_access_iterator<int*> >());
116*85167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, contiguous_iterator<int*> >());
117*85167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, int*>());
118*85167fb7SArthur O'Dwyer 
1193ed89b51Szoecarver     static_assert(test<const int*, bidirectional_iterator<int*> >());
1203ed89b51Szoecarver     static_assert(test<const int*, random_access_iterator<int*> >());
121*85167fb7SArthur O'Dwyer     static_assert(test<const int*, contiguous_iterator<int*> >());
1223ed89b51Szoecarver     static_assert(test<const int*, int*>());
1233ed89b51Szoecarver #endif // TEST_STD_VER > 17
1243ed89b51Szoecarver 
1252df59c50SJF Bastien   return 0;
1265a83710eSEric Fiselier }
127