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<ShuffleIterator Iter> 13 // Iter 14 // rotate(Iter first, Iter middle, Iter last); 15 16 #include <algorithm> 17 #include <cassert> 18 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 19 #include <memory> 20 #endif 21 22 #include "test_iterators.h" 23 24 template <class Iter> 25 void 26 test() 27 { 28 int ia[] = {0}; 29 const unsigned sa = sizeof(ia)/sizeof(ia[0]); 30 Iter r = std::rotate(Iter(ia), Iter(ia), Iter(ia)); 31 assert(base(r) == ia); 32 assert(ia[0] == 0); 33 r = std::rotate(Iter(ia), Iter(ia), Iter(ia+sa)); 34 assert(base(r) == ia+sa); 35 assert(ia[0] == 0); 36 r = std::rotate(Iter(ia), Iter(ia+sa), Iter(ia+sa)); 37 assert(base(r) == ia); 38 assert(ia[0] == 0); 39 40 int ib[] = {0, 1}; 41 const unsigned sb = sizeof(ib)/sizeof(ib[0]); 42 r = std::rotate(Iter(ib), Iter(ib), Iter(ib+sb)); 43 assert(base(r) == ib+sb); 44 assert(ib[0] == 0); 45 assert(ib[1] == 1); 46 r = std::rotate(Iter(ib), Iter(ib+1), Iter(ib+sb)); 47 assert(base(r) == ib+1); 48 assert(ib[0] == 1); 49 assert(ib[1] == 0); 50 r = std::rotate(Iter(ib), Iter(ib+sb), Iter(ib+sb)); 51 assert(base(r) == ib); 52 assert(ib[0] == 1); 53 assert(ib[1] == 0); 54 55 int ic[] = {0, 1, 2}; 56 const unsigned sc = sizeof(ic)/sizeof(ic[0]); 57 r = std::rotate(Iter(ic), Iter(ic), Iter(ic+sc)); 58 assert(base(r) == ic+sc); 59 assert(ic[0] == 0); 60 assert(ic[1] == 1); 61 assert(ic[2] == 2); 62 r = std::rotate(Iter(ic), Iter(ic+1), Iter(ic+sc)); 63 assert(base(r) == ic+2); 64 assert(ic[0] == 1); 65 assert(ic[1] == 2); 66 assert(ic[2] == 0); 67 r = std::rotate(Iter(ic), Iter(ic+2), Iter(ic+sc)); 68 assert(base(r) == ic+1); 69 assert(ic[0] == 0); 70 assert(ic[1] == 1); 71 assert(ic[2] == 2); 72 r = std::rotate(Iter(ic), Iter(ic+sc), Iter(ic+sc)); 73 assert(base(r) == ic); 74 assert(ic[0] == 0); 75 assert(ic[1] == 1); 76 assert(ic[2] == 2); 77 78 int id[] = {0, 1, 2, 3}; 79 const unsigned sd = sizeof(id)/sizeof(id[0]); 80 r = std::rotate(Iter(id), Iter(id), Iter(id+sd)); 81 assert(base(r) == id+sd); 82 assert(id[0] == 0); 83 assert(id[1] == 1); 84 assert(id[2] == 2); 85 assert(id[3] == 3); 86 r = std::rotate(Iter(id), Iter(id+1), Iter(id+sd)); 87 assert(base(r) == id+3); 88 assert(id[0] == 1); 89 assert(id[1] == 2); 90 assert(id[2] == 3); 91 assert(id[3] == 0); 92 r = std::rotate(Iter(id), Iter(id+2), Iter(id+sd)); 93 assert(base(r) == id+2); 94 assert(id[0] == 3); 95 assert(id[1] == 0); 96 assert(id[2] == 1); 97 assert(id[3] == 2); 98 r = std::rotate(Iter(id), Iter(id+3), Iter(id+sd)); 99 assert(base(r) == id+1); 100 assert(id[0] == 2); 101 assert(id[1] == 3); 102 assert(id[2] == 0); 103 assert(id[3] == 1); 104 r = std::rotate(Iter(id), Iter(id+sd), Iter(id+sd)); 105 assert(base(r) == id); 106 assert(id[0] == 2); 107 assert(id[1] == 3); 108 assert(id[2] == 0); 109 assert(id[3] == 1); 110 111 int ie[] = {0, 1, 2, 3, 4}; 112 const unsigned se = sizeof(ie)/sizeof(ie[0]); 113 r = std::rotate(Iter(ie), Iter(ie), Iter(ie+se)); 114 assert(base(r) == ie+se); 115 assert(ie[0] == 0); 116 assert(ie[1] == 1); 117 assert(ie[2] == 2); 118 assert(ie[3] == 3); 119 assert(ie[4] == 4); 120 r = std::rotate(Iter(ie), Iter(ie+1), Iter(ie+se)); 121 assert(base(r) == ie+4); 122 assert(ie[0] == 1); 123 assert(ie[1] == 2); 124 assert(ie[2] == 3); 125 assert(ie[3] == 4); 126 assert(ie[4] == 0); 127 r = std::rotate(Iter(ie), Iter(ie+2), Iter(ie+se)); 128 assert(base(r) == ie+3); 129 assert(ie[0] == 3); 130 assert(ie[1] == 4); 131 assert(ie[2] == 0); 132 assert(ie[3] == 1); 133 assert(ie[4] == 2); 134 r = std::rotate(Iter(ie), Iter(ie+3), Iter(ie+se)); 135 assert(base(r) == ie+2); 136 assert(ie[0] == 1); 137 assert(ie[1] == 2); 138 assert(ie[2] == 3); 139 assert(ie[3] == 4); 140 assert(ie[4] == 0); 141 r = std::rotate(Iter(ie), Iter(ie+4), Iter(ie+se)); 142 assert(base(r) == ie+1); 143 assert(ie[0] == 0); 144 assert(ie[1] == 1); 145 assert(ie[2] == 2); 146 assert(ie[3] == 3); 147 assert(ie[4] == 4); 148 r = std::rotate(Iter(ie), Iter(ie+se), Iter(ie+se)); 149 assert(base(r) == ie); 150 assert(ie[0] == 0); 151 assert(ie[1] == 1); 152 assert(ie[2] == 2); 153 assert(ie[3] == 3); 154 assert(ie[4] == 4); 155 156 int ig[] = {0, 1, 2, 3, 4, 5}; 157 const unsigned sg = sizeof(ig)/sizeof(ig[0]); 158 r = std::rotate(Iter(ig), Iter(ig), Iter(ig+sg)); 159 assert(base(r) == ig+sg); 160 assert(ig[0] == 0); 161 assert(ig[1] == 1); 162 assert(ig[2] == 2); 163 assert(ig[3] == 3); 164 assert(ig[4] == 4); 165 assert(ig[5] == 5); 166 r = std::rotate(Iter(ig), Iter(ig+1), Iter(ig+sg)); 167 assert(base(r) == ig+5); 168 assert(ig[0] == 1); 169 assert(ig[1] == 2); 170 assert(ig[2] == 3); 171 assert(ig[3] == 4); 172 assert(ig[4] == 5); 173 assert(ig[5] == 0); 174 r = std::rotate(Iter(ig), Iter(ig+2), Iter(ig+sg)); 175 assert(base(r) == ig+4); 176 assert(ig[0] == 3); 177 assert(ig[1] == 4); 178 assert(ig[2] == 5); 179 assert(ig[3] == 0); 180 assert(ig[4] == 1); 181 assert(ig[5] == 2); 182 r = std::rotate(Iter(ig), Iter(ig+3), Iter(ig+sg)); 183 assert(base(r) == ig+3); 184 assert(ig[0] == 0); 185 assert(ig[1] == 1); 186 assert(ig[2] == 2); 187 assert(ig[3] == 3); 188 assert(ig[4] == 4); 189 assert(ig[5] == 5); 190 r = std::rotate(Iter(ig), Iter(ig+4), Iter(ig+sg)); 191 assert(base(r) == ig+2); 192 assert(ig[0] == 4); 193 assert(ig[1] == 5); 194 assert(ig[2] == 0); 195 assert(ig[3] == 1); 196 assert(ig[4] == 2); 197 assert(ig[5] == 3); 198 r = std::rotate(Iter(ig), Iter(ig+5), Iter(ig+sg)); 199 assert(base(r) == ig+1); 200 assert(ig[0] == 3); 201 assert(ig[1] == 4); 202 assert(ig[2] == 5); 203 assert(ig[3] == 0); 204 assert(ig[4] == 1); 205 assert(ig[5] == 2); 206 r = std::rotate(Iter(ig), Iter(ig+sg), Iter(ig+sg)); 207 assert(base(r) == ig); 208 assert(ig[0] == 3); 209 assert(ig[1] == 4); 210 assert(ig[2] == 5); 211 assert(ig[3] == 0); 212 assert(ig[4] == 1); 213 assert(ig[5] == 2); 214 } 215 216 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 217 218 template <class Iter> 219 void 220 test1() 221 { 222 std::unique_ptr<int> ia[1]; 223 const unsigned sa = 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 unsigned sb = 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 unsigned sc = 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 unsigned sd = 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 unsigned se = 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 unsigned sg = 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 // _LIBCPP_HAS_NO_RVALUE_REFERENCES 423 424 int main() 425 { 426 test<forward_iterator<int*> >(); 427 test<bidirectional_iterator<int*> >(); 428 test<random_access_iterator<int*> >(); 429 test<int*>(); 430 431 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 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 // _LIBCPP_HAS_NO_RVALUE_REFERENCES 439 } 440