1 //===- STLExtrasTest.cpp - Unit tests for STL extras ----------------------===// 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 #include "llvm/ADT/STLExtras.h" 10 #include "llvm/ADT/StringRef.h" 11 #include "gmock/gmock.h" 12 #include "gtest/gtest.h" 13 14 #include <array> 15 #include <climits> 16 #include <cstddef> 17 #include <initializer_list> 18 #include <iterator> 19 #include <list> 20 #include <tuple> 21 #include <type_traits> 22 #include <unordered_set> 23 #include <utility> 24 #include <vector> 25 26 using namespace llvm; 27 28 using testing::ElementsAre; 29 using testing::UnorderedElementsAre; 30 31 namespace { 32 33 int f(rank<0>) { return 0; } 34 int f(rank<1>) { return 1; } 35 int f(rank<2>) { return 2; } 36 int f(rank<4>) { return 4; } 37 38 TEST(STLExtrasTest, Rank) { 39 // We shouldn't get ambiguities and should select the overload of the same 40 // rank as the argument. 41 EXPECT_EQ(0, f(rank<0>())); 42 EXPECT_EQ(1, f(rank<1>())); 43 EXPECT_EQ(2, f(rank<2>())); 44 45 // This overload is missing so we end up back at 2. 46 EXPECT_EQ(2, f(rank<3>())); 47 48 // But going past 3 should work fine. 49 EXPECT_EQ(4, f(rank<4>())); 50 51 // And we can even go higher and just fall back to the last overload. 52 EXPECT_EQ(4, f(rank<5>())); 53 EXPECT_EQ(4, f(rank<6>())); 54 } 55 56 TEST(STLExtrasTest, EnumerateLValue) { 57 // Test that a simple LValue can be enumerated and gives correct results with 58 // multiple types, including the empty container. 59 std::vector<char> foo = {'a', 'b', 'c'}; 60 typedef std::pair<std::size_t, char> CharPairType; 61 std::vector<CharPairType> CharResults; 62 63 for (auto [index, value] : llvm::enumerate(foo)) { 64 CharResults.emplace_back(index, value); 65 } 66 67 EXPECT_THAT(CharResults, 68 ElementsAre(CharPairType(0u, 'a'), CharPairType(1u, 'b'), 69 CharPairType(2u, 'c'))); 70 71 // Test a const range of a different type. 72 typedef std::pair<std::size_t, int> IntPairType; 73 std::vector<IntPairType> IntResults; 74 const std::vector<int> bar = {1, 2, 3}; 75 for (auto [index, value] : llvm::enumerate(bar)) { 76 IntResults.emplace_back(index, value); 77 } 78 EXPECT_THAT(IntResults, ElementsAre(IntPairType(0u, 1), IntPairType(1u, 2), 79 IntPairType(2u, 3))); 80 81 // Test an empty range. 82 IntResults.clear(); 83 const std::vector<int> baz{}; 84 for (auto [index, value] : llvm::enumerate(baz)) { 85 IntResults.emplace_back(index, value); 86 } 87 EXPECT_TRUE(IntResults.empty()); 88 } 89 90 TEST(STLExtrasTest, EnumerateModifyLValue) { 91 // Test that you can modify the underlying entries of an lvalue range through 92 // the enumeration iterator. 93 std::vector<char> foo = {'a', 'b', 'c'}; 94 95 for (auto X : llvm::enumerate(foo)) { 96 ++X.value(); 97 } 98 EXPECT_THAT(foo, ElementsAre('b', 'c', 'd')); 99 100 // Also test if this works with structured bindings. 101 foo = {'a', 'b', 'c'}; 102 103 for (auto [index, value] : llvm::enumerate(foo)) { 104 ++value; 105 } 106 EXPECT_THAT(foo, ElementsAre('b', 'c', 'd')); 107 } 108 109 TEST(STLExtrasTest, EnumerateRValueRef) { 110 // Test that an rvalue can be enumerated. 111 typedef std::pair<std::size_t, int> PairType; 112 std::vector<PairType> Results; 113 114 auto Enumerator = llvm::enumerate(std::vector<int>{1, 2, 3}); 115 116 for (auto X : llvm::enumerate(std::vector<int>{1, 2, 3})) { 117 Results.emplace_back(X.index(), X.value()); 118 } 119 120 EXPECT_THAT(Results, 121 ElementsAre(PairType(0u, 1), PairType(1u, 2), PairType(2u, 3))); 122 123 // Also test if this works with structured bindings. 124 Results.clear(); 125 126 for (auto [index, value] : llvm::enumerate(std::vector<int>{1, 2, 3})) { 127 Results.emplace_back(index, value); 128 } 129 130 EXPECT_THAT(Results, 131 ElementsAre(PairType(0u, 1), PairType(1u, 2), PairType(2u, 3))); 132 } 133 134 TEST(STLExtrasTest, EnumerateModifyRValue) { 135 // Test that when enumerating an rvalue, modification still works (even if 136 // this isn't terribly useful, it at least shows that we haven't snuck an 137 // extra const in there somewhere. 138 typedef std::pair<std::size_t, char> PairType; 139 std::vector<PairType> Results; 140 141 for (auto X : llvm::enumerate(std::vector<char>{'1', '2', '3'})) { 142 ++X.value(); 143 Results.emplace_back(X.index(), X.value()); 144 } 145 146 EXPECT_THAT(Results, ElementsAre(PairType(0u, '2'), PairType(1u, '3'), 147 PairType(2u, '4'))); 148 149 // Also test if this works with structured bindings. 150 Results.clear(); 151 152 for (auto [index, value] : 153 llvm::enumerate(std::vector<char>{'1', '2', '3'})) { 154 ++value; 155 Results.emplace_back(index, value); 156 } 157 158 EXPECT_THAT(Results, ElementsAre(PairType(0u, '2'), PairType(1u, '3'), 159 PairType(2u, '4'))); 160 } 161 162 TEST(STLExtrasTest, EnumerateTwoRanges) { 163 using Tuple = std::tuple<size_t, int, bool>; 164 165 std::vector<int> Ints = {1, 2}; 166 std::vector<bool> Bools = {true, false}; 167 EXPECT_THAT(llvm::enumerate(Ints, Bools), 168 ElementsAre(Tuple(0, 1, true), Tuple(1, 2, false))); 169 170 // Check that we can modify the values when the temporary is a const 171 // reference. 172 for (const auto &[Idx, Int, Bool] : llvm::enumerate(Ints, Bools)) { 173 (void)Idx; 174 Bool = false; 175 Int = -1; 176 } 177 178 EXPECT_THAT(Ints, ElementsAre(-1, -1)); 179 EXPECT_THAT(Bools, ElementsAre(false, false)); 180 181 // Check that we can modify the values when the result gets copied. 182 for (auto [Idx, Bool, Int] : llvm::enumerate(Bools, Ints)) { 183 (void)Idx; 184 Int = 3; 185 Bool = true; 186 } 187 188 EXPECT_THAT(Ints, ElementsAre(3, 3)); 189 EXPECT_THAT(Bools, ElementsAre(true, true)); 190 191 // Check that we can modify the values through `.value()`. 192 size_t Iters = 0; 193 for (auto It : llvm::enumerate(Bools, Ints)) { 194 EXPECT_EQ(It.index(), Iters); 195 ++Iters; 196 197 std::get<0>(It.value()) = false; 198 std::get<1>(It.value()) = 4; 199 } 200 201 EXPECT_THAT(Ints, ElementsAre(4, 4)); 202 EXPECT_THAT(Bools, ElementsAre(false, false)); 203 } 204 205 TEST(STLExtrasTest, EnumerateThreeRanges) { 206 using Tuple = std::tuple<size_t, int, bool, char>; 207 208 std::vector<int> Ints = {1, 2}; 209 std::vector<bool> Bools = {true, false}; 210 char Chars[] = {'X', 'D'}; 211 EXPECT_THAT(llvm::enumerate(Ints, Bools, Chars), 212 ElementsAre(Tuple(0, 1, true, 'X'), Tuple(1, 2, false, 'D'))); 213 214 for (auto [Idx, Int, Bool, Char] : llvm::enumerate(Ints, Bools, Chars)) { 215 (void)Idx; 216 Int = 0; 217 Bool = true; 218 Char = '!'; 219 } 220 221 EXPECT_THAT(Ints, ElementsAre(0, 0)); 222 EXPECT_THAT(Bools, ElementsAre(true, true)); 223 EXPECT_THAT(Chars, ElementsAre('!', '!')); 224 225 // Check that we can modify the values through `.values()`. 226 size_t Iters = 0; 227 for (auto It : llvm::enumerate(Ints, Bools, Chars)) { 228 EXPECT_EQ(It.index(), Iters); 229 ++Iters; 230 auto [Int, Bool, Char] = It.value(); 231 Int = 42; 232 Bool = false; 233 Char = '$'; 234 } 235 236 EXPECT_THAT(Ints, ElementsAre(42, 42)); 237 EXPECT_THAT(Bools, ElementsAre(false, false)); 238 EXPECT_THAT(Chars, ElementsAre('$', '$')); 239 } 240 241 TEST(STLExtrasTest, EnumerateTemporaries) { 242 using Tuple = std::tuple<size_t, int, bool>; 243 244 EXPECT_THAT( 245 llvm::enumerate(llvm::SmallVector<int>({1, 2, 3}), 246 std::vector<bool>({true, false, true})), 247 ElementsAre(Tuple(0, 1, true), Tuple(1, 2, false), Tuple(2, 3, true))); 248 249 size_t Iters = 0; 250 // This is fine from the point of view of range lifetimes because `zippy` will 251 // move all temporaries into its storage. No lifetime extension is necessary. 252 for (auto [Idx, Int, Bool] : 253 llvm::enumerate(llvm::SmallVector<int>({1, 2, 3}), 254 std::vector<bool>({true, false, true}))) { 255 EXPECT_EQ(Idx, Iters); 256 ++Iters; 257 Int = 0; 258 Bool = true; 259 } 260 261 Iters = 0; 262 // The same thing but with the result as a const reference. 263 for (const auto &[Idx, Int, Bool] : 264 llvm::enumerate(llvm::SmallVector<int>({1, 2, 3}), 265 std::vector<bool>({true, false, true}))) { 266 EXPECT_EQ(Idx, Iters); 267 ++Iters; 268 Int = 0; 269 Bool = true; 270 } 271 } 272 273 #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG) 274 TEST(STLExtrasTest, EnumerateDifferentLengths) { 275 std::vector<int> Ints = {0, 1}; 276 bool Bools[] = {true, false, true}; 277 std::string Chars = "abc"; 278 EXPECT_DEATH(llvm::enumerate(Ints, Bools, Chars), 279 "Ranges have different length"); 280 EXPECT_DEATH(llvm::enumerate(Bools, Ints, Chars), 281 "Ranges have different length"); 282 EXPECT_DEATH(llvm::enumerate(Bools, Chars, Ints), 283 "Ranges have different length"); 284 } 285 #endif 286 287 template <bool B> struct CanMove {}; 288 template <> struct CanMove<false> { 289 CanMove(CanMove &&) = delete; 290 291 CanMove() = default; 292 CanMove(const CanMove &) = default; 293 }; 294 295 template <bool B> struct CanCopy {}; 296 template <> struct CanCopy<false> { 297 CanCopy(const CanCopy &) = delete; 298 299 CanCopy() = default; 300 CanCopy(CanCopy &&) = default; 301 }; 302 303 template <bool Moveable, bool Copyable> 304 class Counted : CanMove<Moveable>, CanCopy<Copyable> { 305 int &C; 306 int &M; 307 int &D; 308 309 public: 310 explicit Counted(int &C, int &M, int &D) : C(C), M(M), D(D) {} 311 Counted(const Counted &O) : CanCopy<Copyable>(O), C(O.C), M(O.M), D(O.D) { 312 ++C; 313 } 314 Counted(Counted &&O) 315 : CanMove<Moveable>(std::move(O)), C(O.C), M(O.M), D(O.D) { 316 ++M; 317 } 318 ~Counted() { ++D; } 319 }; 320 321 template <bool Moveable, bool Copyable> 322 struct Range : Counted<Moveable, Copyable> { 323 using Counted<Moveable, Copyable>::Counted; 324 int *begin() const { return nullptr; } 325 int *end() const { return nullptr; } 326 }; 327 328 TEST(STLExtrasTest, EnumerateLifetimeSemanticsPRValue) { 329 int Copies = 0; 330 int Moves = 0; 331 int Destructors = 0; 332 { 333 auto E = enumerate(Range<true, false>(Copies, Moves, Destructors)); 334 (void)E; 335 // Doesn't compile. rvalue ranges must be moveable. 336 // auto E2 = enumerate(Range<false, true>(Copies, Moves, Destructors)); 337 EXPECT_EQ(0, Copies); 338 EXPECT_EQ(1, Moves); 339 EXPECT_EQ(1, Destructors); 340 } 341 EXPECT_EQ(0, Copies); 342 EXPECT_EQ(1, Moves); 343 EXPECT_EQ(2, Destructors); 344 } 345 346 TEST(STLExtrasTest, EnumerateLifetimeSemanticsRValue) { 347 // With an rvalue, it should not be destroyed until the end of the scope. 348 int Copies = 0; 349 int Moves = 0; 350 int Destructors = 0; 351 { 352 Range<true, false> R(Copies, Moves, Destructors); 353 { 354 auto E = enumerate(std::move(R)); 355 (void)E; 356 // Doesn't compile. rvalue ranges must be moveable. 357 // auto E2 = enumerate(Range<false, true>(Copies, Moves, Destructors)); 358 EXPECT_EQ(0, Copies); 359 EXPECT_EQ(1, Moves); 360 EXPECT_EQ(0, Destructors); 361 } 362 EXPECT_EQ(0, Copies); 363 EXPECT_EQ(1, Moves); 364 EXPECT_EQ(1, Destructors); 365 } 366 EXPECT_EQ(0, Copies); 367 EXPECT_EQ(1, Moves); 368 EXPECT_EQ(2, Destructors); 369 } 370 371 TEST(STLExtrasTest, EnumerateLifetimeSemanticsLValue) { 372 // With an lvalue, it should not be destroyed even after the end of the scope. 373 // lvalue ranges need be neither copyable nor moveable. 374 int Copies = 0; 375 int Moves = 0; 376 int Destructors = 0; 377 { 378 Range<false, false> R(Copies, Moves, Destructors); 379 { 380 auto E = enumerate(R); 381 (void)E; 382 EXPECT_EQ(0, Copies); 383 EXPECT_EQ(0, Moves); 384 EXPECT_EQ(0, Destructors); 385 } 386 EXPECT_EQ(0, Copies); 387 EXPECT_EQ(0, Moves); 388 EXPECT_EQ(0, Destructors); 389 } 390 EXPECT_EQ(0, Copies); 391 EXPECT_EQ(0, Moves); 392 EXPECT_EQ(1, Destructors); 393 } 394 395 namespace some_namespace { 396 struct some_struct { 397 std::vector<int> data; 398 std::string swap_val; 399 }; 400 401 std::vector<int>::const_iterator begin(const some_struct &s) { 402 return s.data.begin(); 403 } 404 405 std::vector<int>::const_iterator end(const some_struct &s) { 406 return s.data.end(); 407 } 408 409 std::vector<int>::const_reverse_iterator rbegin(const some_struct &s) { 410 return s.data.rbegin(); 411 } 412 413 std::vector<int>::const_reverse_iterator rend(const some_struct &s) { 414 return s.data.rend(); 415 } 416 417 void swap(some_struct &lhs, some_struct &rhs) { 418 // make swap visible as non-adl swap would even seem to 419 // work with std::swap which defaults to moving 420 lhs.swap_val = "lhs"; 421 rhs.swap_val = "rhs"; 422 } 423 424 struct requires_move {}; 425 int *begin(requires_move &&) { return nullptr; } 426 int *end(requires_move &&) { return nullptr; } 427 } // namespace some_namespace 428 429 TEST(STLExtrasTest, EnumerateCustomBeginEnd) { 430 // Check that `enumerate` uses ADL to find `begin`/`end` iterators 431 // of the enumerated type. 432 some_namespace::some_struct X{}; 433 X.data = {1, 2, 3}; 434 435 unsigned Iters = 0; 436 for (auto [Idx, Val] : enumerate(X)) { 437 EXPECT_EQ(Val, X.data[Idx]); 438 ++Iters; 439 } 440 EXPECT_EQ(Iters, 3u); 441 } 442 443 TEST(STLExtrasTest, CountAdaptor) { 444 std::vector<int> v; 445 446 v.push_back(1); 447 v.push_back(2); 448 v.push_back(1); 449 v.push_back(4); 450 v.push_back(3); 451 v.push_back(2); 452 v.push_back(1); 453 454 EXPECT_EQ(3, count(v, 1)); 455 EXPECT_EQ(2, count(v, 2)); 456 EXPECT_EQ(1, count(v, 3)); 457 EXPECT_EQ(1, count(v, 4)); 458 } 459 460 TEST(STLExtrasTest, for_each) { 461 std::vector<int> v{0, 1, 2, 3, 4}; 462 int count = 0; 463 464 llvm::for_each(v, [&count](int) { ++count; }); 465 EXPECT_EQ(5, count); 466 } 467 468 TEST(STLExtrasTest, ToVector) { 469 std::vector<char> v = {'a', 'b', 'c'}; 470 auto Enumerated = to_vector<4>(enumerate(v)); 471 ASSERT_EQ(3u, Enumerated.size()); 472 for (size_t I = 0; I < v.size(); ++I) { 473 EXPECT_EQ(I, Enumerated[I].index()); 474 EXPECT_EQ(v[I], Enumerated[I].value()); 475 } 476 477 auto EnumeratedImplicitSize = to_vector(enumerate(v)); 478 ASSERT_EQ(3u, EnumeratedImplicitSize.size()); 479 for (size_t I = 0; I < v.size(); ++I) { 480 EXPECT_EQ(I, EnumeratedImplicitSize[I].index()); 481 EXPECT_EQ(v[I], EnumeratedImplicitSize[I].value()); 482 } 483 } 484 485 TEST(STLExtrasTest, ConcatRange) { 486 std::vector<int> Expected = {1, 2, 3, 4, 5, 6, 7, 8}; 487 std::vector<int> Test; 488 489 std::vector<int> V1234 = {1, 2, 3, 4}; 490 std::list<int> L56 = {5, 6}; 491 SmallVector<int, 2> SV78 = {7, 8}; 492 493 // Use concat across different sized ranges of different types with different 494 // iterators. 495 for (int &i : concat<int>(V1234, L56, SV78)) 496 Test.push_back(i); 497 EXPECT_EQ(Expected, Test); 498 499 // Use concat between a temporary, an L-value, and an R-value to make sure 500 // complex lifetimes work well. 501 Test.clear(); 502 for (int &i : concat<int>(std::vector<int>(V1234), L56, std::move(SV78))) 503 Test.push_back(i); 504 EXPECT_EQ(Expected, Test); 505 } 506 507 template <typename T> struct Iterator { 508 int i = 0; 509 T operator*() const { return i; } 510 Iterator &operator++() { 511 ++i; 512 return *this; 513 } 514 bool operator==(Iterator RHS) const { return i == RHS.i; } 515 }; 516 517 template <typename T> struct RangeWithValueType { 518 int i; 519 RangeWithValueType(int i) : i(i) {} 520 Iterator<T> begin() { return Iterator<T>{0}; } 521 Iterator<T> end() { return Iterator<T>{i}; } 522 }; 523 524 TEST(STLExtrasTest, ValueReturn) { 525 RangeWithValueType<int> R(1); 526 auto C = concat<int>(R, R); 527 auto I = C.begin(); 528 ASSERT_NE(I, C.end()); 529 static_assert(std::is_same_v<decltype((*I)), int>); 530 auto V = *I; 531 ASSERT_EQ(V, 0); 532 } 533 534 TEST(STLExtrasTest, ReferenceReturn) { 535 RangeWithValueType<const int&> R(1); 536 auto C = concat<const int>(R, R); 537 auto I = C.begin(); 538 ASSERT_NE(I, C.end()); 539 static_assert(std::is_same_v<decltype((*I)), const int &>); 540 auto V = *I; 541 ASSERT_EQ(V, 0); 542 } 543 544 TEST(STLExtrasTest, PartitionAdaptor) { 545 std::vector<int> V = {1, 2, 3, 4, 5, 6, 7, 8}; 546 547 auto I = partition(V, [](int i) { return i % 2 == 0; }); 548 ASSERT_EQ(V.begin() + 4, I); 549 550 // Sort the two halves as partition may have messed with the order. 551 llvm::sort(V.begin(), I); 552 llvm::sort(I, V.end()); 553 554 EXPECT_EQ(2, V[0]); 555 EXPECT_EQ(4, V[1]); 556 EXPECT_EQ(6, V[2]); 557 EXPECT_EQ(8, V[3]); 558 EXPECT_EQ(1, V[4]); 559 EXPECT_EQ(3, V[5]); 560 EXPECT_EQ(5, V[6]); 561 EXPECT_EQ(7, V[7]); 562 } 563 564 TEST(STLExtrasTest, EraseIf) { 565 std::vector<int> V = {1, 2, 3, 4, 5, 6, 7, 8}; 566 567 erase_if(V, [](int i) { return i % 2 == 0; }); 568 EXPECT_EQ(4u, V.size()); 569 EXPECT_EQ(1, V[0]); 570 EXPECT_EQ(3, V[1]); 571 EXPECT_EQ(5, V[2]); 572 EXPECT_EQ(7, V[3]); 573 } 574 575 TEST(STLExtrasTest, AppendRange) { 576 std::vector<int> V = {1, 2}; 577 auto AppendVals1 = {3}; 578 append_range(V, AppendVals1); 579 EXPECT_THAT(V, ElementsAre(1, 2, 3)); 580 581 int AppendVals2[] = {4, 5}; 582 append_range(V, AppendVals2); 583 EXPECT_THAT(V, ElementsAre(1, 2, 3, 4, 5)); 584 585 std::string Str; 586 append_range(Str, "abc"); 587 EXPECT_THAT(Str, ElementsAre('a', 'b', 'c', '\0')); 588 append_range(Str, "def"); 589 EXPECT_THAT(Str, ElementsAre('a', 'b', 'c', '\0', 'd', 'e', 'f', '\0')); 590 } 591 592 TEST(STLExtrasTest, AppendValues) { 593 std::vector<int> Vals = {1, 2}; 594 append_values(Vals, 3); 595 EXPECT_THAT(Vals, ElementsAre(1, 2, 3)); 596 597 append_values(Vals, 4, 5); 598 EXPECT_THAT(Vals, ElementsAre(1, 2, 3, 4, 5)); 599 600 std::vector<StringRef> Strs; 601 std::string A = "A"; 602 std::string B = "B"; 603 std::string C = "C"; 604 append_values(Strs, A, B); 605 EXPECT_THAT(Strs, ElementsAre(A, B)); 606 append_values(Strs, C); 607 EXPECT_THAT(Strs, ElementsAre(A, B, C)); 608 609 std::unordered_set<int> Set; 610 append_values(Set, 1, 2); 611 EXPECT_THAT(Set, UnorderedElementsAre(1, 2)); 612 append_values(Set, 3, 1); 613 EXPECT_THAT(Set, UnorderedElementsAre(1, 2, 3)); 614 } 615 616 TEST(STLExtrasTest, ADLTest) { 617 some_namespace::some_struct s{{1, 2, 3, 4, 5}, ""}; 618 some_namespace::some_struct s2{{2, 4, 6, 8, 10}, ""}; 619 620 EXPECT_EQ(*adl_begin(s), 1); 621 EXPECT_EQ(*(adl_end(s) - 1), 5); 622 EXPECT_EQ(*adl_rbegin(s), 5); 623 EXPECT_EQ(*(adl_rend(s) - 1), 1); 624 625 adl_swap(s, s2); 626 EXPECT_EQ(s.swap_val, "lhs"); 627 EXPECT_EQ(s2.swap_val, "rhs"); 628 629 int count = 0; 630 llvm::for_each(s, [&count](int) { ++count; }); 631 EXPECT_EQ(count, 5); 632 } 633 634 TEST(STLExtrasTest, ADLTestTemporaryRange) { 635 EXPECT_EQ(adl_begin(some_namespace::requires_move{}), nullptr); 636 EXPECT_EQ(adl_end(some_namespace::requires_move{}), nullptr); 637 } 638 639 TEST(STLExtrasTest, ADLTestConstexpr) { 640 // `std::begin`/`std::end` are marked as `constexpr`; check that 641 // `adl_begin`/`adl_end` also work in constant-evaluated contexts. 642 static constexpr int c_arr[] = {7, 8, 9}; 643 static_assert(adl_begin(c_arr) == c_arr); 644 static_assert(adl_end(c_arr) == c_arr + 3); 645 646 static constexpr std::array<int, 2> std_arr = {1, 2}; 647 static_assert(adl_begin(std_arr) == std_arr.begin()); 648 static_assert(adl_end(std_arr) == std_arr.end()); 649 SUCCEED(); 650 } 651 652 struct FooWithMemberSize { 653 size_t size() const { return 42; } 654 auto begin() { return Data.begin(); } 655 auto end() { return Data.end(); } 656 657 std::set<int> Data; 658 }; 659 660 namespace some_namespace { 661 struct FooWithFreeSize { 662 auto begin() { return Data.begin(); } 663 auto end() { return Data.end(); } 664 665 std::set<int> Data; 666 }; 667 668 size_t size(const FooWithFreeSize &) { return 13; } 669 } // namespace some_namespace 670 671 TEST(STLExtrasTest, ADLSizeTest) { 672 FooWithMemberSize foo1; 673 EXPECT_EQ(adl_size(foo1), 42u); 674 675 some_namespace::FooWithFreeSize foo2; 676 EXPECT_EQ(adl_size(foo2), 13u); 677 678 static constexpr int c_arr[] = {1, 2, 3}; 679 static_assert(adl_size(c_arr) == 3u); 680 681 static constexpr std::array<int, 4> cpp_arr = {}; 682 static_assert(adl_size(cpp_arr) == 4u); 683 } 684 685 TEST(STLExtrasTest, DropBeginTest) { 686 SmallVector<int, 5> vec{0, 1, 2, 3, 4}; 687 688 for (int n = 0; n < 5; ++n) { 689 int i = n; 690 for (auto &v : drop_begin(vec, n)) { 691 EXPECT_EQ(v, i); 692 i += 1; 693 } 694 EXPECT_EQ(i, 5); 695 } 696 } 697 698 TEST(STLExtrasTest, DropBeginDefaultTest) { 699 SmallVector<int, 5> vec{0, 1, 2, 3, 4}; 700 701 int i = 1; 702 for (auto &v : drop_begin(vec)) { 703 EXPECT_EQ(v, i); 704 i += 1; 705 } 706 EXPECT_EQ(i, 5); 707 } 708 709 TEST(STLExtrasTest, DropEndTest) { 710 SmallVector<int, 5> vec{0, 1, 2, 3, 4}; 711 712 for (int n = 0; n < 5; ++n) { 713 int i = 0; 714 for (auto &v : drop_end(vec, n)) { 715 EXPECT_EQ(v, i); 716 i += 1; 717 } 718 EXPECT_EQ(i, 5 - n); 719 } 720 } 721 722 TEST(STLExtrasTest, DropEndDefaultTest) { 723 SmallVector<int, 5> vec{0, 1, 2, 3, 4}; 724 725 int i = 0; 726 for (auto &v : drop_end(vec)) { 727 EXPECT_EQ(v, i); 728 i += 1; 729 } 730 EXPECT_EQ(i, 4); 731 } 732 733 TEST(STLExtrasTest, EarlyIncrementTest) { 734 std::list<int> L = {1, 2, 3, 4}; 735 736 auto EIR = make_early_inc_range(L); 737 738 auto I = EIR.begin(); 739 auto EI = EIR.end(); 740 EXPECT_NE(I, EI); 741 742 EXPECT_EQ(1, *I); 743 #if LLVM_ENABLE_ABI_BREAKING_CHECKS 744 #ifndef NDEBUG 745 // Repeated dereferences are not allowed. 746 EXPECT_DEATH(*I, "Cannot dereference"); 747 // Comparison after dereference is not allowed. 748 EXPECT_DEATH((void)(I == EI), "Cannot compare"); 749 EXPECT_DEATH((void)(I != EI), "Cannot compare"); 750 #endif 751 #endif 752 753 ++I; 754 EXPECT_NE(I, EI); 755 #if LLVM_ENABLE_ABI_BREAKING_CHECKS 756 #ifndef NDEBUG 757 // You cannot increment prior to dereference. 758 EXPECT_DEATH(++I, "Cannot increment"); 759 #endif 760 #endif 761 EXPECT_EQ(2, *I); 762 #if LLVM_ENABLE_ABI_BREAKING_CHECKS 763 #ifndef NDEBUG 764 // Repeated dereferences are not allowed. 765 EXPECT_DEATH(*I, "Cannot dereference"); 766 #endif 767 #endif 768 769 // Inserting shouldn't break anything. We should be able to keep dereferencing 770 // the currrent iterator and increment. The increment to go to the "next" 771 // iterator from before we inserted. 772 L.insert(std::next(L.begin(), 2), -1); 773 ++I; 774 EXPECT_EQ(3, *I); 775 776 // Erasing the front including the current doesn't break incrementing. 777 L.erase(L.begin(), std::prev(L.end())); 778 ++I; 779 EXPECT_EQ(4, *I); 780 ++I; 781 EXPECT_EQ(EIR.end(), I); 782 } 783 784 // A custom iterator that returns a pointer when dereferenced. This is used to 785 // test make_early_inc_range with iterators that do not return a reference on 786 // dereferencing. 787 struct CustomPointerIterator 788 : public iterator_adaptor_base<CustomPointerIterator, 789 std::list<int>::iterator, 790 std::forward_iterator_tag> { 791 using base_type = 792 iterator_adaptor_base<CustomPointerIterator, std::list<int>::iterator, 793 std::forward_iterator_tag>; 794 795 explicit CustomPointerIterator(std::list<int>::iterator I) : base_type(I) {} 796 797 // Retrieve a pointer to the current int. 798 int *operator*() const { return &*base_type::wrapped(); } 799 }; 800 801 // Make sure make_early_inc_range works with iterators that do not return a 802 // reference on dereferencing. The test is similar to EarlyIncrementTest, but 803 // uses CustomPointerIterator. 804 TEST(STLExtrasTest, EarlyIncrementTestCustomPointerIterator) { 805 std::list<int> L = {1, 2, 3, 4}; 806 807 auto CustomRange = make_range(CustomPointerIterator(L.begin()), 808 CustomPointerIterator(L.end())); 809 auto EIR = make_early_inc_range(CustomRange); 810 811 auto I = EIR.begin(); 812 auto EI = EIR.end(); 813 EXPECT_NE(I, EI); 814 815 EXPECT_EQ(&*L.begin(), *I); 816 #if LLVM_ENABLE_ABI_BREAKING_CHECKS 817 #ifndef NDEBUG 818 // Repeated dereferences are not allowed. 819 EXPECT_DEATH(*I, "Cannot dereference"); 820 // Comparison after dereference is not allowed. 821 EXPECT_DEATH((void)(I == EI), "Cannot compare"); 822 EXPECT_DEATH((void)(I != EI), "Cannot compare"); 823 #endif 824 #endif 825 826 ++I; 827 EXPECT_NE(I, EI); 828 #if LLVM_ENABLE_ABI_BREAKING_CHECKS 829 #ifndef NDEBUG 830 // You cannot increment prior to dereference. 831 EXPECT_DEATH(++I, "Cannot increment"); 832 #endif 833 #endif 834 EXPECT_EQ(&*std::next(L.begin()), *I); 835 #if LLVM_ENABLE_ABI_BREAKING_CHECKS 836 #ifndef NDEBUG 837 // Repeated dereferences are not allowed. 838 EXPECT_DEATH(*I, "Cannot dereference"); 839 #endif 840 #endif 841 842 // Inserting shouldn't break anything. We should be able to keep dereferencing 843 // the currrent iterator and increment. The increment to go to the "next" 844 // iterator from before we inserted. 845 L.insert(std::next(L.begin(), 2), -1); 846 ++I; 847 EXPECT_EQ(&*std::next(L.begin(), 3), *I); 848 849 // Erasing the front including the current doesn't break incrementing. 850 L.erase(L.begin(), std::prev(L.end())); 851 ++I; 852 EXPECT_EQ(&*L.begin(), *I); 853 ++I; 854 EXPECT_EQ(EIR.end(), I); 855 } 856 857 TEST(STLExtrasTest, AllEqual) { 858 std::vector<int> V; 859 EXPECT_TRUE(all_equal(V)); 860 861 V.push_back(1); 862 EXPECT_TRUE(all_equal(V)); 863 864 V.push_back(1); 865 V.push_back(1); 866 EXPECT_TRUE(all_equal(V)); 867 868 V.push_back(2); 869 EXPECT_FALSE(all_equal(V)); 870 } 871 872 // Test to verify that all_equal works with a container that does not 873 // model the random access iterator concept. 874 TEST(STLExtrasTest, AllEqualNonRandomAccess) { 875 std::list<int> V; 876 static_assert(!std::is_convertible_v< 877 std::iterator_traits<decltype(V)::iterator>::iterator_category, 878 std::random_access_iterator_tag>); 879 EXPECT_TRUE(all_equal(V)); 880 881 V.push_back(1); 882 EXPECT_TRUE(all_equal(V)); 883 884 V.push_back(1); 885 V.push_back(1); 886 EXPECT_TRUE(all_equal(V)); 887 888 V.push_back(2); 889 EXPECT_FALSE(all_equal(V)); 890 } 891 892 TEST(STLExtrasTest, AllEqualInitializerList) { 893 EXPECT_TRUE(all_equal({1})); 894 EXPECT_TRUE(all_equal({1, 1})); 895 EXPECT_FALSE(all_equal({1, 2})); 896 EXPECT_FALSE(all_equal({2, 1})); 897 EXPECT_TRUE(all_equal({1, 1, 1})); 898 } 899 900 TEST(STLExtrasTest, to_address) { 901 int *V1 = new int; 902 EXPECT_EQ(V1, to_address(V1)); 903 904 // Check fancy pointer overload for unique_ptr 905 std::unique_ptr<int> V2 = std::make_unique<int>(0); 906 EXPECT_EQ(V2.get(), llvm::to_address(V2)); 907 908 V2.reset(V1); 909 EXPECT_EQ(V1, llvm::to_address(V2)); 910 V2.release(); 911 912 // Check fancy pointer overload for shared_ptr 913 std::shared_ptr<int> V3 = std::make_shared<int>(0); 914 std::shared_ptr<int> V4 = V3; 915 EXPECT_EQ(V3.get(), V4.get()); 916 EXPECT_EQ(V3.get(), llvm::to_address(V3)); 917 EXPECT_EQ(V4.get(), llvm::to_address(V4)); 918 919 V3.reset(V1); 920 EXPECT_EQ(V1, llvm::to_address(V3)); 921 } 922 923 TEST(STLExtrasTest, partition_point) { 924 std::vector<int> V = {1, 3, 5, 7, 9}; 925 926 // Range version. 927 EXPECT_EQ(V.begin() + 3, 928 partition_point(V, [](unsigned X) { return X < 7; })); 929 EXPECT_EQ(V.begin(), partition_point(V, [](unsigned X) { return X < 1; })); 930 EXPECT_EQ(V.end(), partition_point(V, [](unsigned X) { return X < 50; })); 931 } 932 933 TEST(STLExtrasTest, hasSingleElement) { 934 const std::vector<int> V0 = {}, V1 = {1}, V2 = {1, 2}; 935 const std::vector<int> V10(10); 936 937 EXPECT_EQ(hasSingleElement(V0), false); 938 EXPECT_EQ(hasSingleElement(V1), true); 939 EXPECT_EQ(hasSingleElement(V2), false); 940 EXPECT_EQ(hasSingleElement(V10), false); 941 } 942 943 TEST(STLExtrasTest, hasNItems) { 944 const std::list<int> V0 = {}, V1 = {1}, V2 = {1, 2}; 945 const std::list<int> V3 = {1, 3, 5}; 946 947 EXPECT_TRUE(hasNItems(V0, 0)); 948 EXPECT_FALSE(hasNItems(V0, 2)); 949 EXPECT_TRUE(hasNItems(V1, 1)); 950 EXPECT_FALSE(hasNItems(V1, 2)); 951 952 EXPECT_TRUE(hasNItems(V3.begin(), V3.end(), 3, [](int x) { return x < 10; })); 953 EXPECT_TRUE(hasNItems(V3.begin(), V3.end(), 0, [](int x) { return x > 10; })); 954 EXPECT_TRUE(hasNItems(V3.begin(), V3.end(), 2, [](int x) { return x < 5; })); 955 } 956 957 TEST(STLExtras, hasNItemsOrMore) { 958 const std::list<int> V0 = {}, V1 = {1}, V2 = {1, 2}; 959 const std::list<int> V3 = {1, 3, 5}; 960 961 EXPECT_TRUE(hasNItemsOrMore(V1, 1)); 962 EXPECT_FALSE(hasNItemsOrMore(V1, 2)); 963 964 EXPECT_TRUE(hasNItemsOrMore(V2, 1)); 965 EXPECT_TRUE(hasNItemsOrMore(V2, 2)); 966 EXPECT_FALSE(hasNItemsOrMore(V2, 3)); 967 968 EXPECT_TRUE(hasNItemsOrMore(V3, 3)); 969 EXPECT_FALSE(hasNItemsOrMore(V3, 4)); 970 971 EXPECT_TRUE( 972 hasNItemsOrMore(V3.begin(), V3.end(), 3, [](int x) { return x < 10; })); 973 EXPECT_FALSE( 974 hasNItemsOrMore(V3.begin(), V3.end(), 3, [](int x) { return x > 10; })); 975 EXPECT_TRUE( 976 hasNItemsOrMore(V3.begin(), V3.end(), 2, [](int x) { return x < 5; })); 977 } 978 979 TEST(STLExtras, hasNItemsOrLess) { 980 const std::list<int> V0 = {}, V1 = {1}, V2 = {1, 2}; 981 const std::list<int> V3 = {1, 3, 5}; 982 983 EXPECT_TRUE(hasNItemsOrLess(V0, 0)); 984 EXPECT_TRUE(hasNItemsOrLess(V0, 1)); 985 EXPECT_TRUE(hasNItemsOrLess(V0, 2)); 986 987 EXPECT_FALSE(hasNItemsOrLess(V1, 0)); 988 EXPECT_TRUE(hasNItemsOrLess(V1, 1)); 989 EXPECT_TRUE(hasNItemsOrLess(V1, 2)); 990 991 EXPECT_FALSE(hasNItemsOrLess(V2, 0)); 992 EXPECT_FALSE(hasNItemsOrLess(V2, 1)); 993 EXPECT_TRUE(hasNItemsOrLess(V2, 2)); 994 EXPECT_TRUE(hasNItemsOrLess(V2, 3)); 995 996 EXPECT_FALSE(hasNItemsOrLess(V3, 0)); 997 EXPECT_FALSE(hasNItemsOrLess(V3, 1)); 998 EXPECT_FALSE(hasNItemsOrLess(V3, 2)); 999 EXPECT_TRUE(hasNItemsOrLess(V3, 3)); 1000 EXPECT_TRUE(hasNItemsOrLess(V3, 4)); 1001 1002 EXPECT_TRUE( 1003 hasNItemsOrLess(V3.begin(), V3.end(), 1, [](int x) { return x == 1; })); 1004 EXPECT_TRUE( 1005 hasNItemsOrLess(V3.begin(), V3.end(), 2, [](int x) { return x < 5; })); 1006 EXPECT_TRUE( 1007 hasNItemsOrLess(V3.begin(), V3.end(), 5, [](int x) { return x < 5; })); 1008 EXPECT_FALSE( 1009 hasNItemsOrLess(V3.begin(), V3.end(), 2, [](int x) { return x < 10; })); 1010 } 1011 1012 TEST(STLExtras, MoveRange) { 1013 class Foo { 1014 bool A; 1015 1016 public: 1017 Foo() : A(true) {} 1018 Foo(const Foo &) = delete; 1019 Foo(Foo &&Other) : A(Other.A) { Other.A = false; } 1020 Foo &operator=(const Foo &) = delete; 1021 Foo &operator=(Foo &&Other) { 1022 if (this != &Other) { 1023 A = Other.A; 1024 Other.A = false; 1025 } 1026 return *this; 1027 } 1028 operator bool() const { return A; } 1029 }; 1030 SmallVector<Foo, 4U> V1, V2, V3, V4; 1031 auto HasVal = [](const Foo &Item) { return static_cast<bool>(Item); }; 1032 auto Build = [&] { 1033 SmallVector<Foo, 4U> Foos; 1034 Foos.resize(4U); 1035 return Foos; 1036 }; 1037 1038 V1.resize(4U); 1039 EXPECT_TRUE(llvm::all_of(V1, HasVal)); 1040 1041 llvm::move(V1, std::back_inserter(V2)); 1042 1043 // Ensure input container is same size, but its contents were moved out. 1044 EXPECT_EQ(V1.size(), 4U); 1045 EXPECT_TRUE(llvm::none_of(V1, HasVal)); 1046 1047 // Ensure output container has the contents of the input container. 1048 EXPECT_EQ(V2.size(), 4U); 1049 EXPECT_TRUE(llvm::all_of(V2, HasVal)); 1050 1051 llvm::move(std::move(V2), std::back_inserter(V3)); 1052 1053 EXPECT_TRUE(llvm::none_of(V2, HasVal)); 1054 EXPECT_EQ(V3.size(), 4U); 1055 EXPECT_TRUE(llvm::all_of(V3, HasVal)); 1056 1057 llvm::move(Build(), std::back_inserter(V4)); 1058 EXPECT_EQ(V4.size(), 4U); 1059 EXPECT_TRUE(llvm::all_of(V4, HasVal)); 1060 } 1061 1062 TEST(STLExtras, Unique) { 1063 std::vector<int> V = {1, 5, 5, 4, 3, 3, 3}; 1064 1065 auto I = llvm::unique(V, [](int a, int b) { return a == b; }); 1066 1067 EXPECT_EQ(I, V.begin() + 4); 1068 1069 EXPECT_EQ(1, V[0]); 1070 EXPECT_EQ(5, V[1]); 1071 EXPECT_EQ(4, V[2]); 1072 EXPECT_EQ(3, V[3]); 1073 } 1074 1075 TEST(STLExtras, UniqueNoPred) { 1076 std::vector<int> V = {1, 5, 5, 4, 3, 3, 3}; 1077 1078 auto I = llvm::unique(V); 1079 1080 EXPECT_EQ(I, V.begin() + 4); 1081 1082 EXPECT_EQ(1, V[0]); 1083 EXPECT_EQ(5, V[1]); 1084 EXPECT_EQ(4, V[2]); 1085 EXPECT_EQ(3, V[3]); 1086 } 1087 1088 TEST(STLExtrasTest, MakeVisitorOneCallable) { 1089 auto IdentityLambda = [](auto X) { return X; }; 1090 auto IdentityVisitor = makeVisitor(IdentityLambda); 1091 EXPECT_EQ(IdentityLambda(1), IdentityVisitor(1)); 1092 EXPECT_EQ(IdentityLambda(2.0f), IdentityVisitor(2.0f)); 1093 EXPECT_TRUE((std::is_same<decltype(IdentityLambda(IdentityLambda)), 1094 decltype(IdentityLambda)>::value)); 1095 EXPECT_TRUE((std::is_same<decltype(IdentityVisitor(IdentityVisitor)), 1096 decltype(IdentityVisitor)>::value)); 1097 } 1098 1099 TEST(STLExtrasTest, MakeVisitorTwoCallables) { 1100 auto Visitor = 1101 makeVisitor([](int) { return 0; }, [](std::string) { return 1; }); 1102 EXPECT_EQ(Visitor(42), 0); 1103 EXPECT_EQ(Visitor("foo"), 1); 1104 } 1105 1106 TEST(STLExtrasTest, MakeVisitorCallableMultipleOperands) { 1107 auto Second = makeVisitor([](int I, float F) { return F; }, 1108 [](float F, int I) { return I; }); 1109 EXPECT_EQ(Second(1.f, 1), 1); 1110 EXPECT_EQ(Second(1, 1.f), 1.f); 1111 } 1112 1113 TEST(STLExtrasTest, MakeVisitorDefaultCase) { 1114 { 1115 auto Visitor = makeVisitor([](int I) { return I + 100; }, 1116 [](float F) { return F * 2; }, 1117 [](auto) { return -1; }); 1118 EXPECT_EQ(Visitor(24), 124); 1119 EXPECT_EQ(Visitor(2.f), 4.f); 1120 EXPECT_EQ(Visitor(2.), -1); 1121 EXPECT_EQ(Visitor(Visitor), -1); 1122 } 1123 { 1124 auto Visitor = makeVisitor([](auto) { return -1; }, 1125 [](int I) { return I + 100; }, 1126 [](float F) { return F * 2; }); 1127 EXPECT_EQ(Visitor(24), 124); 1128 EXPECT_EQ(Visitor(2.f), 4.f); 1129 EXPECT_EQ(Visitor(2.), -1); 1130 EXPECT_EQ(Visitor(Visitor), -1); 1131 } 1132 } 1133 1134 template <bool Moveable, bool Copyable> 1135 struct Functor : Counted<Moveable, Copyable> { 1136 using Counted<Moveable, Copyable>::Counted; 1137 void operator()() {} 1138 }; 1139 1140 TEST(STLExtrasTest, MakeVisitorLifetimeSemanticsPRValue) { 1141 int Copies = 0; 1142 int Moves = 0; 1143 int Destructors = 0; 1144 { 1145 auto V = makeVisitor(Functor<true, false>(Copies, Moves, Destructors)); 1146 (void)V; 1147 EXPECT_EQ(0, Copies); 1148 EXPECT_EQ(1, Moves); 1149 EXPECT_EQ(1, Destructors); 1150 } 1151 EXPECT_EQ(0, Copies); 1152 EXPECT_EQ(1, Moves); 1153 EXPECT_EQ(2, Destructors); 1154 } 1155 1156 TEST(STLExtrasTest, MakeVisitorLifetimeSemanticsRValue) { 1157 int Copies = 0; 1158 int Moves = 0; 1159 int Destructors = 0; 1160 { 1161 Functor<true, false> F(Copies, Moves, Destructors); 1162 { 1163 auto V = makeVisitor(std::move(F)); 1164 (void)V; 1165 EXPECT_EQ(0, Copies); 1166 EXPECT_EQ(1, Moves); 1167 EXPECT_EQ(0, Destructors); 1168 } 1169 EXPECT_EQ(0, Copies); 1170 EXPECT_EQ(1, Moves); 1171 EXPECT_EQ(1, Destructors); 1172 } 1173 EXPECT_EQ(0, Copies); 1174 EXPECT_EQ(1, Moves); 1175 EXPECT_EQ(2, Destructors); 1176 } 1177 1178 TEST(STLExtrasTest, MakeVisitorLifetimeSemanticsLValue) { 1179 int Copies = 0; 1180 int Moves = 0; 1181 int Destructors = 0; 1182 { 1183 Functor<true, true> F(Copies, Moves, Destructors); 1184 { 1185 auto V = makeVisitor(F); 1186 (void)V; 1187 EXPECT_EQ(1, Copies); 1188 EXPECT_EQ(0, Moves); 1189 EXPECT_EQ(0, Destructors); 1190 } 1191 EXPECT_EQ(1, Copies); 1192 EXPECT_EQ(0, Moves); 1193 EXPECT_EQ(1, Destructors); 1194 } 1195 EXPECT_EQ(1, Copies); 1196 EXPECT_EQ(0, Moves); 1197 EXPECT_EQ(2, Destructors); 1198 } 1199 1200 TEST(STLExtrasTest, AllOfZip) { 1201 std::vector<int> v1 = {0, 4, 2, 1}; 1202 std::vector<int> v2 = {1, 4, 3, 6}; 1203 EXPECT_TRUE(all_of_zip(v1, v2, [](int v1, int v2) { return v1 <= v2; })); 1204 EXPECT_FALSE(all_of_zip(v1, v2, [](int L, int R) { return L < R; })); 1205 1206 // Triple vectors 1207 std::vector<int> v3 = {1, 6, 5, 7}; 1208 EXPECT_EQ(true, all_of_zip(v1, v2, v3, [](int a, int b, int c) { 1209 return a <= b && b <= c; 1210 })); 1211 EXPECT_EQ(false, all_of_zip(v1, v2, v3, [](int a, int b, int c) { 1212 return a < b && b < c; 1213 })); 1214 1215 // Shorter vector should fail even with an always-true predicate. 1216 std::vector<int> v_short = {1, 4}; 1217 EXPECT_EQ(false, all_of_zip(v1, v_short, [](int, int) { return true; })); 1218 EXPECT_EQ(false, 1219 all_of_zip(v1, v2, v_short, [](int, int, int) { return true; })); 1220 } 1221 1222 TEST(STLExtrasTest, TypesAreDistinct) { 1223 EXPECT_TRUE((llvm::TypesAreDistinct<>::value)); 1224 EXPECT_TRUE((llvm::TypesAreDistinct<int>::value)); 1225 EXPECT_FALSE((llvm::TypesAreDistinct<int, int>::value)); 1226 EXPECT_TRUE((llvm::TypesAreDistinct<int, float>::value)); 1227 EXPECT_FALSE((llvm::TypesAreDistinct<int, float, int>::value)); 1228 EXPECT_TRUE((llvm::TypesAreDistinct<int, float, double>::value)); 1229 EXPECT_FALSE((llvm::TypesAreDistinct<int, float, double, float>::value)); 1230 EXPECT_TRUE((llvm::TypesAreDistinct<int, int *>::value)); 1231 EXPECT_TRUE((llvm::TypesAreDistinct<int, int &>::value)); 1232 EXPECT_TRUE((llvm::TypesAreDistinct<int, int &&>::value)); 1233 EXPECT_TRUE((llvm::TypesAreDistinct<int, const int>::value)); 1234 } 1235 1236 TEST(STLExtrasTest, FirstIndexOfType) { 1237 EXPECT_EQ((llvm::FirstIndexOfType<int, int>::value), 0u); 1238 EXPECT_EQ((llvm::FirstIndexOfType<int, int, int>::value), 0u); 1239 EXPECT_EQ((llvm::FirstIndexOfType<int, float, int>::value), 1u); 1240 EXPECT_EQ((llvm::FirstIndexOfType<int const *, float, int, int const *, 1241 const int>::value), 1242 2u); 1243 } 1244 1245 TEST(STLExtrasTest, TypeAtIndex) { 1246 EXPECT_TRUE((std::is_same<int, llvm::TypeAtIndex<0, int>>::value)); 1247 EXPECT_TRUE((std::is_same<int, llvm::TypeAtIndex<0, int, float>>::value)); 1248 EXPECT_TRUE((std::is_same<float, llvm::TypeAtIndex<1, int, float>>::value)); 1249 EXPECT_TRUE( 1250 (std::is_same<float, llvm::TypeAtIndex<1, int, float, double>>::value)); 1251 EXPECT_TRUE( 1252 (std::is_same<float, llvm::TypeAtIndex<1, int, float, double>>::value)); 1253 EXPECT_TRUE( 1254 (std::is_same<double, llvm::TypeAtIndex<2, int, float, double>>::value)); 1255 } 1256 1257 enum Doggos { 1258 Floofer, 1259 Woofer, 1260 SubWoofer, 1261 Pupper, 1262 Pupperino, 1263 Longboi, 1264 }; 1265 1266 struct WooferCmp { 1267 // Not copyable. 1268 WooferCmp() = default; 1269 WooferCmp(const WooferCmp &) = delete; 1270 WooferCmp &operator=(const WooferCmp &) = delete; 1271 1272 friend bool operator==(const Doggos &Doggo, const WooferCmp &) { 1273 return Doggo == Doggos::Woofer; 1274 } 1275 }; 1276 1277 TEST(STLExtrasTest, IsContainedInitializerList) { 1278 EXPECT_TRUE(is_contained({Woofer, SubWoofer}, Woofer)); 1279 EXPECT_TRUE(is_contained({Woofer, SubWoofer}, SubWoofer)); 1280 EXPECT_FALSE(is_contained({Woofer, SubWoofer}, Pupper)); 1281 1282 // Check that the initializer list type and the element type do not have to 1283 // match exactly. 1284 EXPECT_TRUE(is_contained({Floofer, Woofer, SubWoofer}, WooferCmp{})); 1285 EXPECT_FALSE(is_contained({Floofer, SubWoofer}, WooferCmp{})); 1286 1287 EXPECT_TRUE(is_contained({"a", "bb", "ccc", "dddd"}, llvm::StringRef("ccc"))); 1288 EXPECT_FALSE(is_contained({"a", "bb", "ccc", "dddd"}, llvm::StringRef("x"))); 1289 1290 static_assert(is_contained({Woofer, SubWoofer}, SubWoofer), "SubWoofer!"); 1291 static_assert(!is_contained({Woofer, SubWoofer}, Pupper), "Missing Pupper!"); 1292 1293 EXPECT_TRUE(is_contained({1, 2, 3, 4}, 3)); 1294 EXPECT_FALSE(is_contained({1, 2, 3, 4}, 5)); 1295 1296 static_assert(is_contained({1, 2, 3, 4}, 3), "It's there!"); 1297 static_assert(!is_contained({1, 2, 3, 4}, 5), "It's not there :("); 1298 } 1299 1300 TEST(STLExtrasTest, IsContainedMemberContains) { 1301 // Check that `llvm::is_contained` uses the member `.contains()` when 1302 // available. Check that `.contains()` is preferred over `.find()`. 1303 struct Foo { 1304 bool contains(int) const { 1305 ++NumContainsCalls; 1306 return ContainsResult; 1307 } 1308 int *begin() { return nullptr; } 1309 int *end() { return nullptr; } 1310 int *find(int) { return nullptr; } 1311 1312 bool ContainsResult = false; 1313 mutable unsigned NumContainsCalls = 0; 1314 } Container; 1315 1316 EXPECT_EQ(Container.NumContainsCalls, 0u); 1317 EXPECT_FALSE(is_contained(Container, 1)); 1318 EXPECT_EQ(Container.NumContainsCalls, 1u); 1319 1320 Container.ContainsResult = true; 1321 EXPECT_TRUE(is_contained(Container, 1)); 1322 EXPECT_EQ(Container.NumContainsCalls, 2u); 1323 } 1324 1325 TEST(STLExtrasTest, IsContainedMemberFind) { 1326 // Check that `llvm::is_contained` uses the member `.find(x)` when available. 1327 struct Foo { 1328 auto begin() { return Data.begin(); } 1329 auto end() { return Data.end(); } 1330 auto find(int X) { 1331 ++NumFindCalls; 1332 return std::find(begin(), end(), X); 1333 } 1334 1335 std::vector<int> Data; 1336 mutable unsigned NumFindCalls = 0; 1337 } Container; 1338 1339 Container.Data = {1, 2, 3}; 1340 1341 EXPECT_EQ(Container.NumFindCalls, 0u); 1342 EXPECT_TRUE(is_contained(Container, 1)); 1343 EXPECT_TRUE(is_contained(Container, 3)); 1344 EXPECT_EQ(Container.NumFindCalls, 2u); 1345 1346 EXPECT_FALSE(is_contained(Container, 4)); 1347 EXPECT_EQ(Container.NumFindCalls, 3u); 1348 } 1349 1350 TEST(STLExtrasTest, addEnumValues) { 1351 enum A { Zero = 0, One = 1 }; 1352 enum B { IntMax = INT_MAX, ULongLongMax = ULLONG_MAX }; 1353 enum class C : unsigned { Two = 2 }; 1354 1355 // Non-fixed underlying types, with same underlying types 1356 static_assert(addEnumValues(Zero, One) == 1, 1357 "addEnumValues(Zero, One) failed."); 1358 static_assert(addEnumValues(IntMax, ULongLongMax) == 1359 INT_MAX + static_cast<unsigned long long>(ULLONG_MAX), 1360 "addEnumValues(IntMax, ULongLongMax) failed."); 1361 // Non-fixed underlying types, with different underlying types 1362 static_assert(addEnumValues(Zero, IntMax) == INT_MAX, 1363 "addEnumValues(Zero, IntMax) failed."); 1364 static_assert(addEnumValues(One, ULongLongMax) == 1365 1 + static_cast<unsigned long long>(ULLONG_MAX), 1366 "addEnumValues(One, ULongLongMax) failed."); 1367 // Non-fixed underlying type enum and fixed underlying type enum, with same 1368 // underlying types 1369 static_assert(addEnumValues(One, C::Two) == 3, 1370 "addEnumValues(One, C::Two) failed."); 1371 // Non-fixed underlying type enum and fixed underlying type enum, with 1372 // different underlying types 1373 static_assert(addEnumValues(ULongLongMax, C::Two) == 1374 static_cast<unsigned long long>(ULLONG_MAX) + 2, 1375 "addEnumValues(ULongLongMax, C::Two) failed."); 1376 } 1377 1378 TEST(STLExtrasTest, LessFirst) { 1379 { 1380 std::pair<int, int> A(0, 1); 1381 std::pair<int, int> B(1, 0); 1382 EXPECT_TRUE(less_first()(A, B)); 1383 EXPECT_FALSE(less_first()(B, A)); 1384 } 1385 1386 { 1387 std::tuple<int, int> A(0, 1); 1388 std::tuple<int, int> B(1, 0); 1389 EXPECT_TRUE(less_first()(A, B)); 1390 EXPECT_FALSE(less_first()(B, A)); 1391 } 1392 } 1393 1394 TEST(STLExtrasTest, LessSecond) { 1395 { 1396 std::pair<int, int> A(0, 1); 1397 std::pair<int, int> B(1, 0); 1398 EXPECT_FALSE(less_second()(A, B)); 1399 EXPECT_TRUE(less_second()(B, A)); 1400 } 1401 1402 { 1403 std::tuple<int, int> A(0, 1); 1404 std::tuple<int, int> B(1, 0); 1405 EXPECT_FALSE(less_second()(A, B)); 1406 EXPECT_TRUE(less_second()(B, A)); 1407 } 1408 } 1409 1410 TEST(STLExtrasTest, Mismatch) { 1411 { 1412 const int MMIndex = 5; 1413 StringRef First = "FooBar"; 1414 StringRef Second = "FooBaz"; 1415 auto [MMFirst, MMSecond] = mismatch(First, Second); 1416 EXPECT_EQ(MMFirst, First.begin() + MMIndex); 1417 EXPECT_EQ(MMSecond, Second.begin() + MMIndex); 1418 } 1419 1420 { 1421 SmallVector<int> First = {0, 1, 2}; 1422 SmallVector<int> Second = {0, 1, 2, 3}; 1423 auto [MMFirst, MMSecond] = mismatch(First, Second); 1424 EXPECT_EQ(MMFirst, First.end()); 1425 EXPECT_EQ(MMSecond, Second.begin() + 3); 1426 } 1427 1428 { 1429 SmallVector<int> First = {0, 1}; 1430 SmallVector<int> Empty; 1431 auto [MMFirst, MMEmpty] = mismatch(First, Empty); 1432 EXPECT_EQ(MMFirst, First.begin()); 1433 EXPECT_EQ(MMEmpty, Empty.begin()); 1434 } 1435 } 1436 1437 struct Foo; 1438 struct Bar {}; 1439 1440 static_assert(is_incomplete_v<Foo>, "Foo is incomplete"); 1441 static_assert(!is_incomplete_v<Bar>, "Bar is defined"); 1442 1443 } // namespace 1444