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<InputIterator InIter, typename OutIter>
125a83710eSEric Fiselier //   requires OutputIterator<OutIter, RvalueOf<InIter::reference>::type>
135a83710eSEric Fiselier //   OutIter
145a83710eSEric Fiselier //   move(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(InIter(ia), InIter(ia+N), OutIter(ib));
345a83710eSEric Fiselier     assert(base(r) == ib+N);
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(InIter(ia), InIter(ia+N), OutIter(ib));
535a83710eSEric Fiselier     assert(base(r) == ib+N);
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 {
61*5e97d37bSMark de Wever     test<cpp17_input_iterator<const int*>, cpp17_output_iterator<int*> >();
62773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, forward_iterator<int*> >();
63773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, bidirectional_iterator<int*> >();
64773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, random_access_iterator<int*> >();
65773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, int*>();
665a83710eSEric Fiselier 
67*5e97d37bSMark de Wever     test<forward_iterator<const int*>, cpp17_output_iterator<int*> >();
685a83710eSEric Fiselier     test<forward_iterator<const int*>, forward_iterator<int*> >();
695a83710eSEric Fiselier     test<forward_iterator<const int*>, bidirectional_iterator<int*> >();
705a83710eSEric Fiselier     test<forward_iterator<const int*>, random_access_iterator<int*> >();
715a83710eSEric Fiselier     test<forward_iterator<const int*>, int*>();
725a83710eSEric Fiselier 
73*5e97d37bSMark de Wever     test<bidirectional_iterator<const int*>, cpp17_output_iterator<int*> >();
745a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
755a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
765a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
775a83710eSEric Fiselier     test<bidirectional_iterator<const int*>, int*>();
785a83710eSEric Fiselier 
79*5e97d37bSMark de Wever     test<random_access_iterator<const int*>, cpp17_output_iterator<int*> >();
805a83710eSEric Fiselier     test<random_access_iterator<const int*>, forward_iterator<int*> >();
815a83710eSEric Fiselier     test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
825a83710eSEric Fiselier     test<random_access_iterator<const int*>, random_access_iterator<int*> >();
835a83710eSEric Fiselier     test<random_access_iterator<const int*>, int*>();
845a83710eSEric Fiselier 
85*5e97d37bSMark de Wever     test<const int*, cpp17_output_iterator<int*> >();
865a83710eSEric Fiselier     test<const int*, forward_iterator<int*> >();
875a83710eSEric Fiselier     test<const int*, bidirectional_iterator<int*> >();
885a83710eSEric Fiselier     test<const int*, random_access_iterator<int*> >();
895a83710eSEric Fiselier     test<const int*, int*>();
905a83710eSEric Fiselier 
91ddda456aSEric Fiselier #if TEST_STD_VER >= 11
92*5e97d37bSMark de Wever     test1<cpp17_input_iterator<std::unique_ptr<int>*>, cpp17_output_iterator<std::unique_ptr<int>*> >();
93773ae441SChristopher Di Bella     test1<cpp17_input_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
94773ae441SChristopher Di Bella     test1<cpp17_input_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
95773ae441SChristopher Di Bella     test1<cpp17_input_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
96773ae441SChristopher Di Bella     test1<cpp17_input_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
975a83710eSEric Fiselier 
98*5e97d37bSMark de Wever     test1<forward_iterator<std::unique_ptr<int>*>, cpp17_output_iterator<std::unique_ptr<int>*> >();
995a83710eSEric Fiselier     test1<forward_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
1005a83710eSEric Fiselier     test1<forward_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
1015a83710eSEric Fiselier     test1<forward_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
1025a83710eSEric Fiselier     test1<forward_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
1035a83710eSEric Fiselier 
104*5e97d37bSMark de Wever     test1<bidirectional_iterator<std::unique_ptr<int>*>, cpp17_output_iterator<std::unique_ptr<int>*> >();
1055a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
1065a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
1075a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
1085a83710eSEric Fiselier     test1<bidirectional_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
1095a83710eSEric Fiselier 
110*5e97d37bSMark de Wever     test1<random_access_iterator<std::unique_ptr<int>*>, cpp17_output_iterator<std::unique_ptr<int>*> >();
1115a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
1125a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
1135a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
1145a83710eSEric Fiselier     test1<random_access_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
1155a83710eSEric Fiselier 
116*5e97d37bSMark de Wever     test1<std::unique_ptr<int>*, cpp17_output_iterator<std::unique_ptr<int>*> >();
1175a83710eSEric Fiselier     test1<std::unique_ptr<int>*, forward_iterator<std::unique_ptr<int>*> >();
1185a83710eSEric Fiselier     test1<std::unique_ptr<int>*, bidirectional_iterator<std::unique_ptr<int>*> >();
1195a83710eSEric Fiselier     test1<std::unique_ptr<int>*, random_access_iterator<std::unique_ptr<int>*> >();
1205a83710eSEric Fiselier     test1<std::unique_ptr<int>*, std::unique_ptr<int>*>();
121ddda456aSEric Fiselier #endif // TEST_STD_VER >= 11
1222df59c50SJF Bastien 
1233ed89b51Szoecarver #if TEST_STD_VER > 17
124773ae441SChristopher Di Bella     test<cpp17_input_iterator<const int*>, contiguous_iterator<int*>>();
12585167fb7SArthur O'Dwyer     test<forward_iterator<const int*>, contiguous_iterator<int*>>();
12685167fb7SArthur O'Dwyer     test<bidirectional_iterator<const int*>, contiguous_iterator<int*>>();
12785167fb7SArthur O'Dwyer     test<random_access_iterator<const int*>, contiguous_iterator<int*>>();
12885167fb7SArthur O'Dwyer     test<const int*, contiguous_iterator<int*>>();
129*5e97d37bSMark de Wever     test<contiguous_iterator<const int*>, cpp17_output_iterator<int*>>();
13085167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, forward_iterator<int*>>();
13185167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, bidirectional_iterator<int*>>();
13285167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, random_access_iterator<int*>>();
13385167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, int*>();
13485167fb7SArthur O'Dwyer     test<contiguous_iterator<const int*>, contiguous_iterator<int*>>();
13585167fb7SArthur O'Dwyer 
136773ae441SChristopher Di Bella     test1<cpp17_input_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
13785167fb7SArthur O'Dwyer     test1<forward_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
13885167fb7SArthur O'Dwyer     test1<bidirectional_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
13985167fb7SArthur O'Dwyer     test1<random_access_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
14085167fb7SArthur O'Dwyer     test1<std::unique_ptr<int>*, contiguous_iterator<std::unique_ptr<int>*>>();
141*5e97d37bSMark de Wever     test1<contiguous_iterator<std::unique_ptr<int>*>, cpp17_output_iterator<std::unique_ptr<int>*>>();
14285167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*>>();
14385167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*>>();
14485167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*>>();
14585167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
14685167fb7SArthur O'Dwyer     test1<contiguous_iterator<std::unique_ptr<int>*>, contiguous_iterator<std::unique_ptr<int>*>>();
14785167fb7SArthur O'Dwyer 
148773ae441SChristopher Di Bella     static_assert(test<cpp17_input_iterator<const int*>, cpp17_input_iterator<int*> >());
149773ae441SChristopher Di Bella     static_assert(test<cpp17_input_iterator<const int*>, forward_iterator<int*> >());
150773ae441SChristopher Di Bella     static_assert(test<cpp17_input_iterator<const int*>, bidirectional_iterator<int*> >());
151773ae441SChristopher Di Bella     static_assert(test<cpp17_input_iterator<const int*>, random_access_iterator<int*> >());
152773ae441SChristopher Di Bella     static_assert(test<cpp17_input_iterator<const int*>, contiguous_iterator<int*> >());
153773ae441SChristopher Di Bella     static_assert(test<cpp17_input_iterator<const int*>, int*>());
1543ed89b51Szoecarver 
155773ae441SChristopher Di Bella     static_assert(test<forward_iterator<const int*>, cpp17_input_iterator<int*> >());
1563ed89b51Szoecarver     static_assert(test<forward_iterator<const int*>, forward_iterator<int*> >());
1573ed89b51Szoecarver     static_assert(test<forward_iterator<const int*>, bidirectional_iterator<int*> >());
1583ed89b51Szoecarver     static_assert(test<forward_iterator<const int*>, random_access_iterator<int*> >());
15985167fb7SArthur O'Dwyer     static_assert(test<forward_iterator<const int*>, contiguous_iterator<int*> >());
1603ed89b51Szoecarver     static_assert(test<forward_iterator<const int*>, int*>());
1613ed89b51Szoecarver 
162773ae441SChristopher Di Bella     static_assert(test<bidirectional_iterator<const int*>, cpp17_input_iterator<int*> >());
1633ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, forward_iterator<int*> >());
1643ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >());
1653ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, random_access_iterator<int*> >());
16685167fb7SArthur O'Dwyer     static_assert(test<bidirectional_iterator<const int*>, contiguous_iterator<int*> >());
1673ed89b51Szoecarver     static_assert(test<bidirectional_iterator<const int*>, int*>());
1683ed89b51Szoecarver 
169773ae441SChristopher Di Bella     static_assert(test<random_access_iterator<const int*>, cpp17_input_iterator<int*> >());
1703ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, forward_iterator<int*> >());
1713ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, bidirectional_iterator<int*> >());
1723ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, random_access_iterator<int*> >());
17385167fb7SArthur O'Dwyer     static_assert(test<random_access_iterator<const int*>, contiguous_iterator<int*> >());
1743ed89b51Szoecarver     static_assert(test<random_access_iterator<const int*>, int*>());
1753ed89b51Szoecarver 
176773ae441SChristopher Di Bella     static_assert(test<contiguous_iterator<const int*>, cpp17_input_iterator<int*> >());
17785167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, forward_iterator<int*> >());
17885167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, bidirectional_iterator<int*> >());
17985167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, random_access_iterator<int*> >());
18085167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, contiguous_iterator<int*> >());
18185167fb7SArthur O'Dwyer     static_assert(test<contiguous_iterator<const int*>, int*>());
18285167fb7SArthur O'Dwyer 
183773ae441SChristopher Di Bella     static_assert(test<const int*, cpp17_input_iterator<int*> >());
1843ed89b51Szoecarver     static_assert(test<const int*, forward_iterator<int*> >());
1853ed89b51Szoecarver     static_assert(test<const int*, bidirectional_iterator<int*> >());
1863ed89b51Szoecarver     static_assert(test<const int*, random_access_iterator<int*> >());
18785167fb7SArthur O'Dwyer     static_assert(test<const int*, contiguous_iterator<int*> >());
1883ed89b51Szoecarver     static_assert(test<const int*, int*>());
1893ed89b51Szoecarver #endif // TEST_STD_VER > 17
1903ed89b51Szoecarver 
1912df59c50SJF Bastien   return 0;
1925a83710eSEric Fiselier }
193