From: Mehdi Amini Date: Fri, 25 Mar 2016 23:25:06 +0000 (+0000) Subject: StringMap/DenseMap unittests: use piecewise_construct and ensure no copy occurs. X-Git-Tag: llvmorg-3.9.0-rc1~10851 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=412989750ddebeb7022ae82df6b8fcb51c47d85a;p=platform%2Fupstream%2Fllvm.git StringMap/DenseMap unittests: use piecewise_construct and ensure no copy occurs. This makes us no longer relying on move-construction elision by the compiler. Suggested by D. Blaikie. From: Mehdi Amini llvm-svn: 264475 --- diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp index d940677..caeba45 100644 --- a/llvm/unittests/ADT/DenseMapTest.cpp +++ b/llvm/unittests/ADT/DenseMapTest.cpp @@ -377,18 +377,21 @@ TEST(DenseMapCustomTest, DefaultMinReservedSizeTest) { CountCopyAndMove::Copy = 0; CountCopyAndMove::Move = 0; for (int i = 0; i < ExpectedMaxInitialEntries; ++i) - Map.insert(std::make_pair(i, CountCopyAndMove())); + Map.insert(std::pair(std::piecewise_construct, + std::forward_as_tuple(i), + std::forward_as_tuple())); // Check that we didn't grow EXPECT_EQ(MemorySize, Map.getMemorySize()); // Check that move was called the expected number of times - EXPECT_EQ(ExpectedMaxInitialEntries * 2, CountCopyAndMove::Move); + EXPECT_EQ(ExpectedMaxInitialEntries, CountCopyAndMove::Move); // Check that no copy occured EXPECT_EQ(0, CountCopyAndMove::Copy); // Adding one extra element should grow the map - CountCopyAndMove::Copy = 0; - CountCopyAndMove::Move = 0; - Map.insert(std::make_pair(ExpectedMaxInitialEntries, CountCopyAndMove())); + Map.insert(std::pair( + std::piecewise_construct, + std::forward_as_tuple(ExpectedMaxInitialEntries), + std::forward_as_tuple())); // Check that we grew EXPECT_NE(MemorySize, Map.getMemorySize()); // Check that move was called the expected number of times @@ -412,12 +415,13 @@ TEST(DenseMapCustomTest, InitialSizeTest) { CountCopyAndMove::Copy = 0; CountCopyAndMove::Move = 0; for (int i = 0; i < Size; ++i) - Map.insert(std::make_pair(i, CountCopyAndMove())); + Map.insert(std::pair(std::piecewise_construct, + std::forward_as_tuple(i), + std::forward_as_tuple())); // Check that we didn't grow EXPECT_EQ(MemorySize, Map.getMemorySize()); // Check that move was called the expected number of times - // This relies on move-construction elision, and cannot be reliably tested. - // EXPECT_EQ(Size * 2, CountCopyAndMove::Move); + EXPECT_EQ(Size, CountCopyAndMove::Move); // Check that no copy occured EXPECT_EQ(0, CountCopyAndMove::Copy); } @@ -455,12 +459,13 @@ TEST(DenseMapCustomTest, ReserveTest) { CountCopyAndMove::Copy = 0; CountCopyAndMove::Move = 0; for (int i = 0; i < Size; ++i) - Map.insert(std::make_pair(i, CountCopyAndMove())); + Map.insert(std::pair(std::piecewise_construct, + std::forward_as_tuple(i), + std::forward_as_tuple())); // Check that we didn't grow EXPECT_EQ(MemorySize, Map.getMemorySize()); // Check that move was called the expected number of times - // This relies on move-construction elision, and cannot be reliably tested. - // EXPECT_EQ(Size * 2, CountCopyAndMove::Move); + EXPECT_EQ(Size, CountCopyAndMove::Move); // Check that no copy occured EXPECT_EQ(0, CountCopyAndMove::Copy); } diff --git a/llvm/unittests/ADT/StringMapTest.cpp b/llvm/unittests/ADT/StringMapTest.cpp index 4deb48c..562126e 100644 --- a/llvm/unittests/ADT/StringMapTest.cpp +++ b/llvm/unittests/ADT/StringMapTest.cpp @@ -391,21 +391,16 @@ TEST(StringMapCustomTest, InitialSizeTest) { for (auto Size : {1, 32, 67}) { StringMap Map(Size); auto NumBuckets = Map.getNumBuckets(); - - // Prepare the elts in a vector. We do this as a pre-step to shield us - // against the internals of std::pair which can introduce spurious move/copy - std::vector> Elts; - for (int i = 0; i < Size; ++i) - Elts.emplace_back(Twine(i).str(), CountCtorCopyAndMove()); - CountCtorCopyAndMove::Move = 0; CountCtorCopyAndMove::Copy = 0; for (int i = 0; i < Size; ++i) - Map.insert(Elts[i]); - // After the inital copy, the map will move the Elts in the Entry. - EXPECT_EQ((unsigned)Size, CountCtorCopyAndMove::Move); + Map.insert(std::pair( + std::piecewise_construct, std::forward_as_tuple(Twine(i).str()), + std::forward_as_tuple(i))); + // After the inital move, the map will move the Elts in the Entry. + EXPECT_EQ((unsigned)Size * 2, CountCtorCopyAndMove::Move); // We copy once the pair from the Elts vector - EXPECT_EQ((unsigned)Size, CountCtorCopyAndMove::Copy); + EXPECT_EQ(0u, CountCtorCopyAndMove::Copy); // Check that the map didn't grow EXPECT_EQ(Map.getNumBuckets(), NumBuckets); }