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<ShuffleIterator Iter> 12 // Iter 13 // rotate(Iter first, Iter middle, Iter last); 14 15 #include <algorithm> 16 #include <cassert> 17 #include <memory> 18 19 #include "test_macros.h" 20 #include "test_iterators.h" 21 22 template <class Iter> 23 _LIBCPP_CONSTEXPR_AFTER_CXX17 bool 24 test() 25 { 26 int ia[] = {0}; 27 const int sa = static_cast<int>(sizeof(ia)/sizeof(ia[0])); 28 Iter r = std::rotate(Iter(ia), Iter(ia), Iter(ia)); 29 assert(base(r) == ia); 30 assert(ia[0] == 0); 31 r = std::rotate(Iter(ia), Iter(ia), Iter(ia+sa)); 32 assert(base(r) == ia+sa); 33 assert(ia[0] == 0); 34 r = std::rotate(Iter(ia), Iter(ia+sa), Iter(ia+sa)); 35 assert(base(r) == ia); 36 assert(ia[0] == 0); 37 38 int ib[] = {0, 1}; 39 const int sb = static_cast<int>(sizeof(ib)/sizeof(ib[0])); 40 r = std::rotate(Iter(ib), Iter(ib), Iter(ib+sb)); 41 assert(base(r) == ib+sb); 42 assert(ib[0] == 0); 43 assert(ib[1] == 1); 44 r = std::rotate(Iter(ib), Iter(ib+1), Iter(ib+sb)); 45 assert(base(r) == ib+1); 46 assert(ib[0] == 1); 47 assert(ib[1] == 0); 48 r = std::rotate(Iter(ib), Iter(ib+sb), Iter(ib+sb)); 49 assert(base(r) == ib); 50 assert(ib[0] == 1); 51 assert(ib[1] == 0); 52 53 int ic[] = {0, 1, 2}; 54 const int sc = static_cast<int>(sizeof(ic)/sizeof(ic[0])); 55 r = std::rotate(Iter(ic), Iter(ic), Iter(ic+sc)); 56 assert(base(r) == ic+sc); 57 assert(ic[0] == 0); 58 assert(ic[1] == 1); 59 assert(ic[2] == 2); 60 r = std::rotate(Iter(ic), Iter(ic+1), Iter(ic+sc)); 61 assert(base(r) == ic+2); 62 assert(ic[0] == 1); 63 assert(ic[1] == 2); 64 assert(ic[2] == 0); 65 r = std::rotate(Iter(ic), Iter(ic+2), Iter(ic+sc)); 66 assert(base(r) == ic+1); 67 assert(ic[0] == 0); 68 assert(ic[1] == 1); 69 assert(ic[2] == 2); 70 r = std::rotate(Iter(ic), Iter(ic+sc), Iter(ic+sc)); 71 assert(base(r) == ic); 72 assert(ic[0] == 0); 73 assert(ic[1] == 1); 74 assert(ic[2] == 2); 75 76 int id[] = {0, 1, 2, 3}; 77 const int sd = static_cast<int>(sizeof(id)/sizeof(id[0])); 78 r = std::rotate(Iter(id), Iter(id), Iter(id+sd)); 79 assert(base(r) == id+sd); 80 assert(id[0] == 0); 81 assert(id[1] == 1); 82 assert(id[2] == 2); 83 assert(id[3] == 3); 84 r = std::rotate(Iter(id), Iter(id+1), Iter(id+sd)); 85 assert(base(r) == id+3); 86 assert(id[0] == 1); 87 assert(id[1] == 2); 88 assert(id[2] == 3); 89 assert(id[3] == 0); 90 r = std::rotate(Iter(id), Iter(id+2), Iter(id+sd)); 91 assert(base(r) == id+2); 92 assert(id[0] == 3); 93 assert(id[1] == 0); 94 assert(id[2] == 1); 95 assert(id[3] == 2); 96 r = std::rotate(Iter(id), Iter(id+3), Iter(id+sd)); 97 assert(base(r) == id+1); 98 assert(id[0] == 2); 99 assert(id[1] == 3); 100 assert(id[2] == 0); 101 assert(id[3] == 1); 102 r = std::rotate(Iter(id), Iter(id+sd), Iter(id+sd)); 103 assert(base(r) == id); 104 assert(id[0] == 2); 105 assert(id[1] == 3); 106 assert(id[2] == 0); 107 assert(id[3] == 1); 108 109 int ie[] = {0, 1, 2, 3, 4}; 110 const int se = static_cast<int>(sizeof(ie)/sizeof(ie[0])); 111 r = std::rotate(Iter(ie), Iter(ie), Iter(ie+se)); 112 assert(base(r) == ie+se); 113 assert(ie[0] == 0); 114 assert(ie[1] == 1); 115 assert(ie[2] == 2); 116 assert(ie[3] == 3); 117 assert(ie[4] == 4); 118 r = std::rotate(Iter(ie), Iter(ie+1), Iter(ie+se)); 119 assert(base(r) == ie+4); 120 assert(ie[0] == 1); 121 assert(ie[1] == 2); 122 assert(ie[2] == 3); 123 assert(ie[3] == 4); 124 assert(ie[4] == 0); 125 r = std::rotate(Iter(ie), Iter(ie+2), Iter(ie+se)); 126 assert(base(r) == ie+3); 127 assert(ie[0] == 3); 128 assert(ie[1] == 4); 129 assert(ie[2] == 0); 130 assert(ie[3] == 1); 131 assert(ie[4] == 2); 132 r = std::rotate(Iter(ie), Iter(ie+3), Iter(ie+se)); 133 assert(base(r) == ie+2); 134 assert(ie[0] == 1); 135 assert(ie[1] == 2); 136 assert(ie[2] == 3); 137 assert(ie[3] == 4); 138 assert(ie[4] == 0); 139 r = std::rotate(Iter(ie), Iter(ie+4), Iter(ie+se)); 140 assert(base(r) == ie+1); 141 assert(ie[0] == 0); 142 assert(ie[1] == 1); 143 assert(ie[2] == 2); 144 assert(ie[3] == 3); 145 assert(ie[4] == 4); 146 r = std::rotate(Iter(ie), Iter(ie+se), Iter(ie+se)); 147 assert(base(r) == ie); 148 assert(ie[0] == 0); 149 assert(ie[1] == 1); 150 assert(ie[2] == 2); 151 assert(ie[3] == 3); 152 assert(ie[4] == 4); 153 154 int ig[] = {0, 1, 2, 3, 4, 5}; 155 const int sg = static_cast<int>(sizeof(ig)/sizeof(ig[0])); 156 r = std::rotate(Iter(ig), Iter(ig), Iter(ig+sg)); 157 assert(base(r) == ig+sg); 158 assert(ig[0] == 0); 159 assert(ig[1] == 1); 160 assert(ig[2] == 2); 161 assert(ig[3] == 3); 162 assert(ig[4] == 4); 163 assert(ig[5] == 5); 164 r = std::rotate(Iter(ig), Iter(ig+1), Iter(ig+sg)); 165 assert(base(r) == ig+5); 166 assert(ig[0] == 1); 167 assert(ig[1] == 2); 168 assert(ig[2] == 3); 169 assert(ig[3] == 4); 170 assert(ig[4] == 5); 171 assert(ig[5] == 0); 172 r = std::rotate(Iter(ig), Iter(ig+2), Iter(ig+sg)); 173 assert(base(r) == ig+4); 174 assert(ig[0] == 3); 175 assert(ig[1] == 4); 176 assert(ig[2] == 5); 177 assert(ig[3] == 0); 178 assert(ig[4] == 1); 179 assert(ig[5] == 2); 180 r = std::rotate(Iter(ig), Iter(ig+3), Iter(ig+sg)); 181 assert(base(r) == ig+3); 182 assert(ig[0] == 0); 183 assert(ig[1] == 1); 184 assert(ig[2] == 2); 185 assert(ig[3] == 3); 186 assert(ig[4] == 4); 187 assert(ig[5] == 5); 188 r = std::rotate(Iter(ig), Iter(ig+4), Iter(ig+sg)); 189 assert(base(r) == ig+2); 190 assert(ig[0] == 4); 191 assert(ig[1] == 5); 192 assert(ig[2] == 0); 193 assert(ig[3] == 1); 194 assert(ig[4] == 2); 195 assert(ig[5] == 3); 196 r = std::rotate(Iter(ig), Iter(ig+5), Iter(ig+sg)); 197 assert(base(r) == ig+1); 198 assert(ig[0] == 3); 199 assert(ig[1] == 4); 200 assert(ig[2] == 5); 201 assert(ig[3] == 0); 202 assert(ig[4] == 1); 203 assert(ig[5] == 2); 204 r = std::rotate(Iter(ig), Iter(ig+sg), Iter(ig+sg)); 205 assert(base(r) == ig); 206 assert(ig[0] == 3); 207 assert(ig[1] == 4); 208 assert(ig[2] == 5); 209 assert(ig[3] == 0); 210 assert(ig[4] == 1); 211 assert(ig[5] == 2); 212 213 return true; 214 } 215 216 #if TEST_STD_VER >= 11 217 218 template <class Iter> 219 void 220 test1() 221 { 222 std::unique_ptr<int> ia[1]; 223 const int sa = static_cast<int>(sizeof(ia)/sizeof(ia[0])); 224 for (int i = 0; i < sa; ++i) 225 ia[i].reset(new int(i)); 226 Iter r = std::rotate(Iter(ia), Iter(ia), Iter(ia)); 227 assert(base(r) == ia); 228 assert(*ia[0] == 0); 229 r = std::rotate(Iter(ia), Iter(ia), Iter(ia+sa)); 230 assert(base(r) == ia+sa); 231 assert(*ia[0] == 0); 232 r = std::rotate(Iter(ia), Iter(ia+sa), Iter(ia+sa)); 233 assert(base(r) == ia); 234 assert(*ia[0] == 0); 235 236 std::unique_ptr<int> ib[2]; 237 const int sb = static_cast<int>(sizeof(ib)/sizeof(ib[0])); 238 for (int i = 0; i < sb; ++i) 239 ib[i].reset(new int(i)); 240 r = std::rotate(Iter(ib), Iter(ib), Iter(ib+sb)); 241 assert(base(r) == ib+sb); 242 assert(*ib[0] == 0); 243 assert(*ib[1] == 1); 244 r = std::rotate(Iter(ib), Iter(ib+1), Iter(ib+sb)); 245 assert(base(r) == ib+1); 246 assert(*ib[0] == 1); 247 assert(*ib[1] == 0); 248 r = std::rotate(Iter(ib), Iter(ib+sb), Iter(ib+sb)); 249 assert(base(r) == ib); 250 assert(*ib[0] == 1); 251 assert(*ib[1] == 0); 252 253 std::unique_ptr<int> ic[3]; 254 const int sc = static_cast<int>(sizeof(ic)/sizeof(ic[0])); 255 for (int i = 0; i < sc; ++i) 256 ic[i].reset(new int(i)); 257 r = std::rotate(Iter(ic), Iter(ic), Iter(ic+sc)); 258 assert(base(r) == ic+sc); 259 assert(*ic[0] == 0); 260 assert(*ic[1] == 1); 261 assert(*ic[2] == 2); 262 r = std::rotate(Iter(ic), Iter(ic+1), Iter(ic+sc)); 263 assert(base(r) == ic+2); 264 assert(*ic[0] == 1); 265 assert(*ic[1] == 2); 266 assert(*ic[2] == 0); 267 r = std::rotate(Iter(ic), Iter(ic+2), Iter(ic+sc)); 268 assert(base(r) == ic+1); 269 assert(*ic[0] == 0); 270 assert(*ic[1] == 1); 271 assert(*ic[2] == 2); 272 r = std::rotate(Iter(ic), Iter(ic+sc), Iter(ic+sc)); 273 assert(base(r) == ic); 274 assert(*ic[0] == 0); 275 assert(*ic[1] == 1); 276 assert(*ic[2] == 2); 277 278 std::unique_ptr<int> id[4]; 279 const int sd = static_cast<int>(sizeof(id)/sizeof(id[0])); 280 for (int i = 0; i < sd; ++i) 281 id[i].reset(new int(i)); 282 r = std::rotate(Iter(id), Iter(id), Iter(id+sd)); 283 assert(base(r) == id+sd); 284 assert(*id[0] == 0); 285 assert(*id[1] == 1); 286 assert(*id[2] == 2); 287 assert(*id[3] == 3); 288 r = std::rotate(Iter(id), Iter(id+1), Iter(id+sd)); 289 assert(base(r) == id+3); 290 assert(*id[0] == 1); 291 assert(*id[1] == 2); 292 assert(*id[2] == 3); 293 assert(*id[3] == 0); 294 r = std::rotate(Iter(id), Iter(id+2), Iter(id+sd)); 295 assert(base(r) == id+2); 296 assert(*id[0] == 3); 297 assert(*id[1] == 0); 298 assert(*id[2] == 1); 299 assert(*id[3] == 2); 300 r = std::rotate(Iter(id), Iter(id+3), Iter(id+sd)); 301 assert(base(r) == id+1); 302 assert(*id[0] == 2); 303 assert(*id[1] == 3); 304 assert(*id[2] == 0); 305 assert(*id[3] == 1); 306 r = std::rotate(Iter(id), Iter(id+sd), Iter(id+sd)); 307 assert(base(r) == id); 308 assert(*id[0] == 2); 309 assert(*id[1] == 3); 310 assert(*id[2] == 0); 311 assert(*id[3] == 1); 312 313 std::unique_ptr<int> ie[5]; 314 const int se = static_cast<int>(sizeof(ie)/sizeof(ie[0])); 315 for (int i = 0; i < se; ++i) 316 ie[i].reset(new int(i)); 317 r = std::rotate(Iter(ie), Iter(ie), Iter(ie+se)); 318 assert(base(r) == ie+se); 319 assert(*ie[0] == 0); 320 assert(*ie[1] == 1); 321 assert(*ie[2] == 2); 322 assert(*ie[3] == 3); 323 assert(*ie[4] == 4); 324 r = std::rotate(Iter(ie), Iter(ie+1), Iter(ie+se)); 325 assert(base(r) == ie+4); 326 assert(*ie[0] == 1); 327 assert(*ie[1] == 2); 328 assert(*ie[2] == 3); 329 assert(*ie[3] == 4); 330 assert(*ie[4] == 0); 331 r = std::rotate(Iter(ie), Iter(ie+2), Iter(ie+se)); 332 assert(base(r) == ie+3); 333 assert(*ie[0] == 3); 334 assert(*ie[1] == 4); 335 assert(*ie[2] == 0); 336 assert(*ie[3] == 1); 337 assert(*ie[4] == 2); 338 r = std::rotate(Iter(ie), Iter(ie+3), Iter(ie+se)); 339 assert(base(r) == ie+2); 340 assert(*ie[0] == 1); 341 assert(*ie[1] == 2); 342 assert(*ie[2] == 3); 343 assert(*ie[3] == 4); 344 assert(*ie[4] == 0); 345 r = std::rotate(Iter(ie), Iter(ie+4), Iter(ie+se)); 346 assert(base(r) == ie+1); 347 assert(*ie[0] == 0); 348 assert(*ie[1] == 1); 349 assert(*ie[2] == 2); 350 assert(*ie[3] == 3); 351 assert(*ie[4] == 4); 352 r = std::rotate(Iter(ie), Iter(ie+se), Iter(ie+se)); 353 assert(base(r) == ie); 354 assert(*ie[0] == 0); 355 assert(*ie[1] == 1); 356 assert(*ie[2] == 2); 357 assert(*ie[3] == 3); 358 assert(*ie[4] == 4); 359 360 std::unique_ptr<int> ig[6]; 361 const int sg = static_cast<int>(sizeof(ig)/sizeof(ig[0])); 362 for (int i = 0; i < sg; ++i) 363 ig[i].reset(new int(i)); 364 r = std::rotate(Iter(ig), Iter(ig), Iter(ig+sg)); 365 assert(base(r) == ig+sg); 366 assert(*ig[0] == 0); 367 assert(*ig[1] == 1); 368 assert(*ig[2] == 2); 369 assert(*ig[3] == 3); 370 assert(*ig[4] == 4); 371 assert(*ig[5] == 5); 372 r = std::rotate(Iter(ig), Iter(ig+1), Iter(ig+sg)); 373 assert(base(r) == ig+5); 374 assert(*ig[0] == 1); 375 assert(*ig[1] == 2); 376 assert(*ig[2] == 3); 377 assert(*ig[3] == 4); 378 assert(*ig[4] == 5); 379 assert(*ig[5] == 0); 380 r = std::rotate(Iter(ig), Iter(ig+2), Iter(ig+sg)); 381 assert(base(r) == ig+4); 382 assert(*ig[0] == 3); 383 assert(*ig[1] == 4); 384 assert(*ig[2] == 5); 385 assert(*ig[3] == 0); 386 assert(*ig[4] == 1); 387 assert(*ig[5] == 2); 388 r = std::rotate(Iter(ig), Iter(ig+3), Iter(ig+sg)); 389 assert(base(r) == ig+3); 390 assert(*ig[0] == 0); 391 assert(*ig[1] == 1); 392 assert(*ig[2] == 2); 393 assert(*ig[3] == 3); 394 assert(*ig[4] == 4); 395 assert(*ig[5] == 5); 396 r = std::rotate(Iter(ig), Iter(ig+4), Iter(ig+sg)); 397 assert(base(r) == ig+2); 398 assert(*ig[0] == 4); 399 assert(*ig[1] == 5); 400 assert(*ig[2] == 0); 401 assert(*ig[3] == 1); 402 assert(*ig[4] == 2); 403 assert(*ig[5] == 3); 404 r = std::rotate(Iter(ig), Iter(ig+5), Iter(ig+sg)); 405 assert(base(r) == ig+1); 406 assert(*ig[0] == 3); 407 assert(*ig[1] == 4); 408 assert(*ig[2] == 5); 409 assert(*ig[3] == 0); 410 assert(*ig[4] == 1); 411 assert(*ig[5] == 2); 412 r = std::rotate(Iter(ig), Iter(ig+sg), Iter(ig+sg)); 413 assert(base(r) == ig); 414 assert(*ig[0] == 3); 415 assert(*ig[1] == 4); 416 assert(*ig[2] == 5); 417 assert(*ig[3] == 0); 418 assert(*ig[4] == 1); 419 assert(*ig[5] == 2); 420 } 421 422 #endif // TEST_STD_VER >= 11 423 424 int main(int, char**) 425 { 426 test<forward_iterator<int*> >(); 427 test<bidirectional_iterator<int*> >(); 428 test<random_access_iterator<int*> >(); 429 test<int*>(); 430 431 #if TEST_STD_VER >= 11 432 433 test1<forward_iterator<std::unique_ptr<int>*> >(); 434 test1<bidirectional_iterator<std::unique_ptr<int>*> >(); 435 test1<random_access_iterator<std::unique_ptr<int>*> >(); 436 test1<std::unique_ptr<int>*>(); 437 438 #endif 439 440 #if TEST_STD_VER > 17 441 static_assert(test<forward_iterator<int*> >()); 442 static_assert(test<bidirectional_iterator<int*> >()); 443 static_assert(test<random_access_iterator<int*> >()); 444 static_assert(test<int*>()); 445 #endif // TEST_STD_VER > 17 446 447 return 0; 448 } 449