1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <algorithm> 10 11 // template<ForwardIterator InIter, OutputIterator<auto, InIter::reference> OutIter> 12 // constexpr OutIter // constexpr after C++17 13 // rotate_copy(InIter first, InIter middle, InIter last, OutIter result); 14 15 #include <algorithm> 16 #include <cassert> 17 18 #include "test_macros.h" 19 #include "test_iterators.h" 20 21 // #if TEST_STD_VER > 17 22 // TEST_CONSTEXPR bool test_constexpr() { 23 // int ia[] = {1, 3, 5, 2, 5, 6}; 24 // int ib[std::size(ia)] = {0}; 25 // 26 // const size_t N = 2; 27 // const auto middle = std::begin(ia) + N; 28 // auto it = std::rotate_copy(std::begin(ia), middle, std::end(ia), std::begin(ib)); 29 // 30 // return std::distance(std::begin(ib), it) == std::size(ia) 31 // && std::equal (std::begin(ia), middle, std::begin(ib) + std::size(ia) - N) 32 // && std::equal (middle, std::end(ia), std::begin(ib)) 33 // ; 34 // } 35 // #endif 36 37 template <class InIter, class OutIter> 38 void 39 test() 40 { 41 int ia[] = {0, 1, 2, 3}; 42 const unsigned sa = sizeof(ia)/sizeof(ia[0]); 43 int ib[sa] = {0}; 44 45 OutIter r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia), OutIter(ib)); 46 assert(base(r) == ib); 47 48 r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+1), OutIter(ib)); 49 assert(base(r) == ib+1); 50 assert(ib[0] == 0); 51 52 r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+1), OutIter(ib)); 53 assert(base(r) == ib+1); 54 assert(ib[0] == 0); 55 56 r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+2), OutIter(ib)); 57 assert(base(r) == ib+2); 58 assert(ib[0] == 0); 59 assert(ib[1] == 1); 60 61 r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+2), OutIter(ib)); 62 assert(base(r) == ib+2); 63 assert(ib[0] == 1); 64 assert(ib[1] == 0); 65 66 r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+2), OutIter(ib)); 67 assert(base(r) == ib+2); 68 assert(ib[0] == 0); 69 assert(ib[1] == 1); 70 71 r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+3), OutIter(ib)); 72 assert(base(r) == ib+3); 73 assert(ib[0] == 0); 74 assert(ib[1] == 1); 75 assert(ib[2] == 2); 76 77 r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+3), OutIter(ib)); 78 assert(base(r) == ib+3); 79 assert(ib[0] == 1); 80 assert(ib[1] == 2); 81 assert(ib[2] == 0); 82 83 r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+3), OutIter(ib)); 84 assert(base(r) == ib+3); 85 assert(ib[0] == 2); 86 assert(ib[1] == 0); 87 assert(ib[2] == 1); 88 89 r = std::rotate_copy(InIter(ia), InIter(ia+3), InIter(ia+3), OutIter(ib)); 90 assert(base(r) == ib+3); 91 assert(ib[0] == 0); 92 assert(ib[1] == 1); 93 assert(ib[2] == 2); 94 95 r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+4), OutIter(ib)); 96 assert(base(r) == ib+4); 97 assert(ib[0] == 0); 98 assert(ib[1] == 1); 99 assert(ib[2] == 2); 100 assert(ib[3] == 3); 101 102 r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+4), OutIter(ib)); 103 assert(base(r) == ib+4); 104 assert(ib[0] == 1); 105 assert(ib[1] == 2); 106 assert(ib[2] == 3); 107 assert(ib[3] == 0); 108 109 r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+4), OutIter(ib)); 110 assert(base(r) == ib+4); 111 assert(ib[0] == 2); 112 assert(ib[1] == 3); 113 assert(ib[2] == 0); 114 assert(ib[3] == 1); 115 116 r = std::rotate_copy(InIter(ia), InIter(ia+3), InIter(ia+4), OutIter(ib)); 117 assert(base(r) == ib+4); 118 assert(ib[0] == 3); 119 assert(ib[1] == 0); 120 assert(ib[2] == 1); 121 assert(ib[3] == 2); 122 123 r = std::rotate_copy(InIter(ia), InIter(ia+4), InIter(ia+4), OutIter(ib)); 124 assert(base(r) == ib+4); 125 assert(ib[0] == 0); 126 assert(ib[1] == 1); 127 assert(ib[2] == 2); 128 assert(ib[3] == 3); 129 } 130 131 int main() 132 { 133 test<bidirectional_iterator<const int*>, output_iterator<int*> >(); 134 test<bidirectional_iterator<const int*>, forward_iterator<int*> >(); 135 test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); 136 test<bidirectional_iterator<const int*>, random_access_iterator<int*> >(); 137 test<bidirectional_iterator<const int*>, int*>(); 138 139 test<random_access_iterator<const int*>, output_iterator<int*> >(); 140 test<random_access_iterator<const int*>, forward_iterator<int*> >(); 141 test<random_access_iterator<const int*>, bidirectional_iterator<int*> >(); 142 test<random_access_iterator<const int*>, random_access_iterator<int*> >(); 143 test<random_access_iterator<const int*>, int*>(); 144 145 test<const int*, output_iterator<int*> >(); 146 test<const int*, forward_iterator<int*> >(); 147 test<const int*, bidirectional_iterator<int*> >(); 148 test<const int*, random_access_iterator<int*> >(); 149 test<const int*, int*>(); 150 151 // #if TEST_STD_VER > 17 152 // static_assert(test_constexpr()); 153 // #endif 154 } 155