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