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 void 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 214 #if TEST_STD_VER >= 11 215 216 template <class Iter> 217 void 218 test1() 219 { 220 std::unique_ptr<int> ia[1]; 221 const int sa = static_cast<int>(sizeof(ia)/sizeof(ia[0])); 222 for (int i = 0; i < sa; ++i) 223 ia[i].reset(new int(i)); 224 Iter r = std::rotate(Iter(ia), Iter(ia), Iter(ia)); 225 assert(base(r) == ia); 226 assert(*ia[0] == 0); 227 r = std::rotate(Iter(ia), Iter(ia), Iter(ia+sa)); 228 assert(base(r) == ia+sa); 229 assert(*ia[0] == 0); 230 r = std::rotate(Iter(ia), Iter(ia+sa), Iter(ia+sa)); 231 assert(base(r) == ia); 232 assert(*ia[0] == 0); 233 234 std::unique_ptr<int> ib[2]; 235 const int sb = static_cast<int>(sizeof(ib)/sizeof(ib[0])); 236 for (int i = 0; i < sb; ++i) 237 ib[i].reset(new int(i)); 238 r = std::rotate(Iter(ib), Iter(ib), Iter(ib+sb)); 239 assert(base(r) == ib+sb); 240 assert(*ib[0] == 0); 241 assert(*ib[1] == 1); 242 r = std::rotate(Iter(ib), Iter(ib+1), Iter(ib+sb)); 243 assert(base(r) == ib+1); 244 assert(*ib[0] == 1); 245 assert(*ib[1] == 0); 246 r = std::rotate(Iter(ib), Iter(ib+sb), Iter(ib+sb)); 247 assert(base(r) == ib); 248 assert(*ib[0] == 1); 249 assert(*ib[1] == 0); 250 251 std::unique_ptr<int> ic[3]; 252 const int sc = static_cast<int>(sizeof(ic)/sizeof(ic[0])); 253 for (int i = 0; i < sc; ++i) 254 ic[i].reset(new int(i)); 255 r = std::rotate(Iter(ic), Iter(ic), Iter(ic+sc)); 256 assert(base(r) == ic+sc); 257 assert(*ic[0] == 0); 258 assert(*ic[1] == 1); 259 assert(*ic[2] == 2); 260 r = std::rotate(Iter(ic), Iter(ic+1), Iter(ic+sc)); 261 assert(base(r) == ic+2); 262 assert(*ic[0] == 1); 263 assert(*ic[1] == 2); 264 assert(*ic[2] == 0); 265 r = std::rotate(Iter(ic), Iter(ic+2), Iter(ic+sc)); 266 assert(base(r) == ic+1); 267 assert(*ic[0] == 0); 268 assert(*ic[1] == 1); 269 assert(*ic[2] == 2); 270 r = std::rotate(Iter(ic), Iter(ic+sc), Iter(ic+sc)); 271 assert(base(r) == ic); 272 assert(*ic[0] == 0); 273 assert(*ic[1] == 1); 274 assert(*ic[2] == 2); 275 276 std::unique_ptr<int> id[4]; 277 const int sd = static_cast<int>(sizeof(id)/sizeof(id[0])); 278 for (int i = 0; i < sd; ++i) 279 id[i].reset(new int(i)); 280 r = std::rotate(Iter(id), Iter(id), Iter(id+sd)); 281 assert(base(r) == id+sd); 282 assert(*id[0] == 0); 283 assert(*id[1] == 1); 284 assert(*id[2] == 2); 285 assert(*id[3] == 3); 286 r = std::rotate(Iter(id), Iter(id+1), Iter(id+sd)); 287 assert(base(r) == id+3); 288 assert(*id[0] == 1); 289 assert(*id[1] == 2); 290 assert(*id[2] == 3); 291 assert(*id[3] == 0); 292 r = std::rotate(Iter(id), Iter(id+2), Iter(id+sd)); 293 assert(base(r) == id+2); 294 assert(*id[0] == 3); 295 assert(*id[1] == 0); 296 assert(*id[2] == 1); 297 assert(*id[3] == 2); 298 r = std::rotate(Iter(id), Iter(id+3), Iter(id+sd)); 299 assert(base(r) == id+1); 300 assert(*id[0] == 2); 301 assert(*id[1] == 3); 302 assert(*id[2] == 0); 303 assert(*id[3] == 1); 304 r = std::rotate(Iter(id), Iter(id+sd), Iter(id+sd)); 305 assert(base(r) == id); 306 assert(*id[0] == 2); 307 assert(*id[1] == 3); 308 assert(*id[2] == 0); 309 assert(*id[3] == 1); 310 311 std::unique_ptr<int> ie[5]; 312 const int se = static_cast<int>(sizeof(ie)/sizeof(ie[0])); 313 for (int i = 0; i < se; ++i) 314 ie[i].reset(new int(i)); 315 r = std::rotate(Iter(ie), Iter(ie), Iter(ie+se)); 316 assert(base(r) == ie+se); 317 assert(*ie[0] == 0); 318 assert(*ie[1] == 1); 319 assert(*ie[2] == 2); 320 assert(*ie[3] == 3); 321 assert(*ie[4] == 4); 322 r = std::rotate(Iter(ie), Iter(ie+1), Iter(ie+se)); 323 assert(base(r) == ie+4); 324 assert(*ie[0] == 1); 325 assert(*ie[1] == 2); 326 assert(*ie[2] == 3); 327 assert(*ie[3] == 4); 328 assert(*ie[4] == 0); 329 r = std::rotate(Iter(ie), Iter(ie+2), Iter(ie+se)); 330 assert(base(r) == ie+3); 331 assert(*ie[0] == 3); 332 assert(*ie[1] == 4); 333 assert(*ie[2] == 0); 334 assert(*ie[3] == 1); 335 assert(*ie[4] == 2); 336 r = std::rotate(Iter(ie), Iter(ie+3), Iter(ie+se)); 337 assert(base(r) == ie+2); 338 assert(*ie[0] == 1); 339 assert(*ie[1] == 2); 340 assert(*ie[2] == 3); 341 assert(*ie[3] == 4); 342 assert(*ie[4] == 0); 343 r = std::rotate(Iter(ie), Iter(ie+4), Iter(ie+se)); 344 assert(base(r) == ie+1); 345 assert(*ie[0] == 0); 346 assert(*ie[1] == 1); 347 assert(*ie[2] == 2); 348 assert(*ie[3] == 3); 349 assert(*ie[4] == 4); 350 r = std::rotate(Iter(ie), Iter(ie+se), Iter(ie+se)); 351 assert(base(r) == ie); 352 assert(*ie[0] == 0); 353 assert(*ie[1] == 1); 354 assert(*ie[2] == 2); 355 assert(*ie[3] == 3); 356 assert(*ie[4] == 4); 357 358 std::unique_ptr<int> ig[6]; 359 const int sg = static_cast<int>(sizeof(ig)/sizeof(ig[0])); 360 for (int i = 0; i < sg; ++i) 361 ig[i].reset(new int(i)); 362 r = std::rotate(Iter(ig), Iter(ig), Iter(ig+sg)); 363 assert(base(r) == ig+sg); 364 assert(*ig[0] == 0); 365 assert(*ig[1] == 1); 366 assert(*ig[2] == 2); 367 assert(*ig[3] == 3); 368 assert(*ig[4] == 4); 369 assert(*ig[5] == 5); 370 r = std::rotate(Iter(ig), Iter(ig+1), Iter(ig+sg)); 371 assert(base(r) == ig+5); 372 assert(*ig[0] == 1); 373 assert(*ig[1] == 2); 374 assert(*ig[2] == 3); 375 assert(*ig[3] == 4); 376 assert(*ig[4] == 5); 377 assert(*ig[5] == 0); 378 r = std::rotate(Iter(ig), Iter(ig+2), Iter(ig+sg)); 379 assert(base(r) == ig+4); 380 assert(*ig[0] == 3); 381 assert(*ig[1] == 4); 382 assert(*ig[2] == 5); 383 assert(*ig[3] == 0); 384 assert(*ig[4] == 1); 385 assert(*ig[5] == 2); 386 r = std::rotate(Iter(ig), Iter(ig+3), Iter(ig+sg)); 387 assert(base(r) == ig+3); 388 assert(*ig[0] == 0); 389 assert(*ig[1] == 1); 390 assert(*ig[2] == 2); 391 assert(*ig[3] == 3); 392 assert(*ig[4] == 4); 393 assert(*ig[5] == 5); 394 r = std::rotate(Iter(ig), Iter(ig+4), Iter(ig+sg)); 395 assert(base(r) == ig+2); 396 assert(*ig[0] == 4); 397 assert(*ig[1] == 5); 398 assert(*ig[2] == 0); 399 assert(*ig[3] == 1); 400 assert(*ig[4] == 2); 401 assert(*ig[5] == 3); 402 r = std::rotate(Iter(ig), Iter(ig+5), Iter(ig+sg)); 403 assert(base(r) == ig+1); 404 assert(*ig[0] == 3); 405 assert(*ig[1] == 4); 406 assert(*ig[2] == 5); 407 assert(*ig[3] == 0); 408 assert(*ig[4] == 1); 409 assert(*ig[5] == 2); 410 r = std::rotate(Iter(ig), Iter(ig+sg), Iter(ig+sg)); 411 assert(base(r) == ig); 412 assert(*ig[0] == 3); 413 assert(*ig[1] == 4); 414 assert(*ig[2] == 5); 415 assert(*ig[3] == 0); 416 assert(*ig[4] == 1); 417 assert(*ig[5] == 2); 418 } 419 420 #endif // TEST_STD_VER >= 11 421 422 int main(int, char**) 423 { 424 test<forward_iterator<int*> >(); 425 test<bidirectional_iterator<int*> >(); 426 test<random_access_iterator<int*> >(); 427 test<int*>(); 428 429 #if TEST_STD_VER >= 11 430 431 test1<forward_iterator<std::unique_ptr<int>*> >(); 432 test1<bidirectional_iterator<std::unique_ptr<int>*> >(); 433 test1<random_access_iterator<std::unique_ptr<int>*> >(); 434 test1<std::unique_ptr<int>*>(); 435 436 #endif 437 438 return 0; 439 } 440