[llvm] [ADT] Add C++17-style insert_or_assign for DenseMap (PR #94151)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 4 19:13:49 PDT 2024
https://github.com/c8ef updated https://github.com/llvm/llvm-project/pull/94151
>From 1724a23fbf4bc4caa526d6b323abbe5c7607c19c Mon Sep 17 00:00:00 2001
From: c8ef <c8ef at outlook.com>
Date: Sun, 2 Jun 2024 08:11:27 +0000
Subject: [PATCH 1/4] implement insert_or_assign
---
llvm/include/llvm/ADT/DenseMap.h | 16 ++++++++++++++++
llvm/unittests/ADT/DenseMapTest.cpp | 28 ++++++++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h
index 3ef6a7cd1b4b5..7ccc9445c0a7b 100644
--- a/llvm/include/llvm/ADT/DenseMap.h
+++ b/llvm/include/llvm/ADT/DenseMap.h
@@ -312,6 +312,22 @@ class DenseMapBase : public DebugEpochBase {
insert(*I);
}
+ template <typename V>
+ std::pair<iterator, bool> insert_or_assign(const KeyT &Key, V &&Val) {
+ auto Ret = try_emplace(Key, std::forward<V>(Val));
+ if (!Ret.second)
+ Ret.first->second = std::forward<V>(Val);
+ return Ret;
+ }
+
+ template <typename V>
+ std::pair<iterator, bool> insert_or_assign(KeyT &&Key, V &&Val) {
+ auto Ret = try_emplace(std::move(Key), std::forward<V>(Val));
+ if (!Ret.second)
+ Ret.first->second = std::forward<V>(Val);
+ return Ret;
+ }
+
/// Returns the value associated to the key in the map if it exists. If it
/// does not exist, emplace a default value for the key and returns a
/// reference to the newly created value.
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index cc3244528f27e..3fa20ef62ccea 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -499,6 +499,34 @@ TEST(DenseMapCustomTest, ReserveTest) {
}
}
+TEST(DenseMapCustomTest, InsertOrAssignTest) {
+ DenseMap<int, CountCopyAndMove> Map;
+ CountCopyAndMove::Copy = 0;
+ CountCopyAndMove::Move = 0;
+
+ CountCopyAndMove val1;
+ auto try0 = Map.insert_or_assign(0, val1);
+ EXPECT_TRUE(try0.second);
+ EXPECT_EQ(0, CountCopyAndMove::Move);
+ EXPECT_EQ(1, CountCopyAndMove::Copy);
+
+ auto try1 = Map.insert_or_assign(0, val1);
+ EXPECT_FALSE(try1.second);
+ EXPECT_EQ(0, CountCopyAndMove::Move);
+ EXPECT_EQ(2, CountCopyAndMove::Copy);
+
+ CountCopyAndMove val2;
+ auto try2 = Map.insert_or_assign(2, val2);
+ EXPECT_TRUE(try2.second);
+ EXPECT_EQ(0, CountCopyAndMove::Move);
+ EXPECT_EQ(3, CountCopyAndMove::Copy);
+
+ auto try3 = Map.insert_or_assign(2, std::move(val2));
+ EXPECT_FALSE(try3.second);
+ EXPECT_EQ(1, CountCopyAndMove::Move);
+ EXPECT_EQ(3, CountCopyAndMove::Copy);
+}
+
// Make sure DenseMap works with StringRef keys.
TEST(DenseMapCustomTest, StringRefTest) {
DenseMap<StringRef, int> M;
>From a13126c56a4323fa61b7bc6ed4df9af56dac90a0 Mon Sep 17 00:00:00 2001
From: c8ef <c8ef at outlook.com>
Date: Mon, 3 Jun 2024 00:42:50 +0000
Subject: [PATCH 2/4] test the const ref api
---
llvm/unittests/ADT/DenseMapTest.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index 3fa20ef62ccea..da473280c8100 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -515,13 +515,14 @@ TEST(DenseMapCustomTest, InsertOrAssignTest) {
EXPECT_EQ(0, CountCopyAndMove::Move);
EXPECT_EQ(2, CountCopyAndMove::Copy);
+ int key2 = 2;
CountCopyAndMove val2;
- auto try2 = Map.insert_or_assign(2, val2);
+ auto try2 = Map.insert_or_assign(key2, val2);
EXPECT_TRUE(try2.second);
EXPECT_EQ(0, CountCopyAndMove::Move);
EXPECT_EQ(3, CountCopyAndMove::Copy);
- auto try3 = Map.insert_or_assign(2, std::move(val2));
+ auto try3 = Map.insert_or_assign(key2, std::move(val2));
EXPECT_FALSE(try3.second);
EXPECT_EQ(1, CountCopyAndMove::Move);
EXPECT_EQ(3, CountCopyAndMove::Copy);
>From 91423247140729cf3bfa38098e1b54be2f273a37 Mon Sep 17 00:00:00 2001
From: c8ef <c8ef at outlook.com>
Date: Mon, 3 Jun 2024 08:08:22 +0000
Subject: [PATCH 3/4] add a subclass to avoid default construct
---
llvm/unittests/ADT/DenseMapTest.cpp | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index da473280c8100..4c8773df55217 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -359,15 +359,15 @@ struct CountCopyAndMove {
return *this;
}
CountCopyAndMove(CountCopyAndMove &&) { Move++; }
- CountCopyAndMove &operator=(const CountCopyAndMove &&) {
+ CountCopyAndMove &operator=(CountCopyAndMove &&) {
Move++;
return *this;
}
};
+
int CountCopyAndMove::Copy = 0;
int CountCopyAndMove::Move = 0;
-
-} // anonymous namespace
+} // namespace
// Test initializer list construction.
TEST(DenseMapCustomTest, InitializerList) {
@@ -500,11 +500,16 @@ TEST(DenseMapCustomTest, ReserveTest) {
}
TEST(DenseMapCustomTest, InsertOrAssignTest) {
- DenseMap<int, CountCopyAndMove> Map;
+ struct C : CountCopyAndMove {
+ C(int v) : v(v) {}
+ int v;
+ };
+
+ DenseMap<int, C> Map;
CountCopyAndMove::Copy = 0;
CountCopyAndMove::Move = 0;
- CountCopyAndMove val1;
+ C val1(1);
auto try0 = Map.insert_or_assign(0, val1);
EXPECT_TRUE(try0.second);
EXPECT_EQ(0, CountCopyAndMove::Move);
@@ -516,7 +521,7 @@ TEST(DenseMapCustomTest, InsertOrAssignTest) {
EXPECT_EQ(2, CountCopyAndMove::Copy);
int key2 = 2;
- CountCopyAndMove val2;
+ C val2(2);
auto try2 = Map.insert_or_assign(key2, val2);
EXPECT_TRUE(try2.second);
EXPECT_EQ(0, CountCopyAndMove::Move);
>From 1271ba92e1a6f74333243190681eb4017dcfa7ad Mon Sep 17 00:00:00 2001
From: 546 <c8ef at outlook.com>
Date: Tue, 4 Jun 2024 05:11:16 +0000
Subject: [PATCH 4/4] refactor MoveOnly
---
llvm/unittests/ADT/CMakeLists.txt | 2 +-
llvm/unittests/ADT/CountCopyAndMove.cpp | 17 ++++
llvm/unittests/ADT/CountCopyAndMove.h | 57 ++++++++++++
llvm/unittests/ADT/DenseMapTest.cpp | 99 ++++++++-------------
llvm/unittests/ADT/MoveOnly.cpp | 15 ----
llvm/unittests/ADT/MoveOnly.h | 42 ---------
llvm/unittests/ADT/STLForwardCompatTest.cpp | 54 +++++------
7 files changed, 140 insertions(+), 146 deletions(-)
create mode 100644 llvm/unittests/ADT/CountCopyAndMove.cpp
create mode 100644 llvm/unittests/ADT/CountCopyAndMove.h
delete mode 100644 llvm/unittests/ADT/MoveOnly.cpp
delete mode 100644 llvm/unittests/ADT/MoveOnly.h
diff --git a/llvm/unittests/ADT/CMakeLists.txt b/llvm/unittests/ADT/CMakeLists.txt
index 17c5c9d1c59ce..85c140e63fecd 100644
--- a/llvm/unittests/ADT/CMakeLists.txt
+++ b/llvm/unittests/ADT/CMakeLists.txt
@@ -18,6 +18,7 @@ add_llvm_unittest(ADTTests
CoalescingBitVectorTest.cpp
CombinationGeneratorTest.cpp
ConcurrentHashtableTest.cpp
+ CountCopyAndMove.cpp
DAGDeltaAlgorithmTest.cpp
DeltaAlgorithmTest.cpp
DenseMapTest.cpp
@@ -52,7 +53,6 @@ add_llvm_unittest(ADTTests
LazyAtomicPointerTest.cpp
MappedIteratorTest.cpp
MapVectorTest.cpp
- MoveOnly.cpp
PackedVectorTest.cpp
PagedVectorTest.cpp
PointerEmbeddedIntTest.cpp
diff --git a/llvm/unittests/ADT/CountCopyAndMove.cpp b/llvm/unittests/ADT/CountCopyAndMove.cpp
new file mode 100644
index 0000000000000..fe1e2f4a5b89f
--- /dev/null
+++ b/llvm/unittests/ADT/CountCopyAndMove.cpp
@@ -0,0 +1,17 @@
+//===- llvm/unittest/ADT/CountCopyAndMove.cpp - Optional unit tests -------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CountCopyAndMove.h"
+
+using namespace llvm;
+
+int CountCopyAndMove::CopyConstructions = 0;
+int CountCopyAndMove::CopyAssignments = 0;
+int CountCopyAndMove::MoveConstructions = 0;
+int CountCopyAndMove::MoveAssignments = 0;
+int CountCopyAndMove::Destructions = 0;
diff --git a/llvm/unittests/ADT/CountCopyAndMove.h b/llvm/unittests/ADT/CountCopyAndMove.h
new file mode 100644
index 0000000000000..126054427b81a
--- /dev/null
+++ b/llvm/unittests/ADT/CountCopyAndMove.h
@@ -0,0 +1,57 @@
+//===- llvm/unittest/ADT/CountCopyAndMove.h - Optional unit tests ---------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_UNITTESTS_ADT_COUNTCOPYANDMOVE_H
+#define LLVM_UNITTESTS_ADT_COUNTCOPYANDMOVE_H
+
+namespace llvm {
+
+struct CountCopyAndMove {
+ static int CopyConstructions;
+ static int CopyAssignments;
+ static int MoveConstructions;
+ static int MoveAssignments;
+ static int Destructions;
+ int val;
+
+ CountCopyAndMove() = default;
+ explicit CountCopyAndMove(int val) : val(val) {}
+ CountCopyAndMove(const CountCopyAndMove &other) : val(other.val) {
+ ++CopyConstructions;
+ }
+ CountCopyAndMove &operator=(const CountCopyAndMove &other) {
+ val = other.val;
+ ++CopyAssignments;
+ return *this;
+ }
+ CountCopyAndMove(CountCopyAndMove &&other) : val(other.val) {
+ ++MoveConstructions;
+ }
+ CountCopyAndMove &operator=(CountCopyAndMove &&other) {
+ val = other.val;
+ ++MoveAssignments;
+ return *this;
+ }
+ ~CountCopyAndMove() { ++Destructions; }
+
+ static void ResetCounts() {
+ CopyConstructions = 0;
+ CopyAssignments = 0;
+ MoveConstructions = 0;
+ MoveAssignments = 0;
+ Destructions = 0;
+ }
+
+ static int TotalCopies() { return CopyConstructions + CopyAssignments; }
+
+ static int TotalMoves() { return MoveConstructions + MoveAssignments; }
+};
+
+} // end namespace llvm
+
+#endif // LLVM_UNITTESTS_ADT_COUNTCOPYANDMOVE_H
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index 4c8773df55217..c3f2f23355d7d 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ADT/DenseMap.h"
+#include "CountCopyAndMove.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/DenseMapInfoVariant.h"
#include "llvm/ADT/StringRef.h"
@@ -346,29 +347,6 @@ TYPED_TEST(DenseMapTest, ConstIteratorTest) {
EXPECT_TRUE(cit == cit2);
}
-namespace {
-// Simple class that counts how many moves and copy happens when growing a map
-struct CountCopyAndMove {
- static int Move;
- static int Copy;
- CountCopyAndMove() {}
-
- CountCopyAndMove(const CountCopyAndMove &) { Copy++; }
- CountCopyAndMove &operator=(const CountCopyAndMove &) {
- Copy++;
- return *this;
- }
- CountCopyAndMove(CountCopyAndMove &&) { Move++; }
- CountCopyAndMove &operator=(CountCopyAndMove &&) {
- Move++;
- return *this;
- }
-};
-
-int CountCopyAndMove::Copy = 0;
-int CountCopyAndMove::Move = 0;
-} // namespace
-
// Test initializer list construction.
TEST(DenseMapCustomTest, InitializerList) {
DenseMap<int, int> M({{0, 0}, {0, 1}, {1, 2}});
@@ -401,8 +379,8 @@ TEST(DenseMapCustomTest, DefaultMinReservedSizeTest) {
// Will allocate 64 buckets
Map.reserve(1);
unsigned MemorySize = Map.getMemorySize();
- CountCopyAndMove::Copy = 0;
- CountCopyAndMove::Move = 0;
+ CountCopyAndMove::ResetCounts();
+
for (int i = 0; i < ExpectedMaxInitialEntries; ++i)
Map.insert(std::pair<int, CountCopyAndMove>(std::piecewise_construct,
std::forward_as_tuple(i),
@@ -410,9 +388,9 @@ TEST(DenseMapCustomTest, DefaultMinReservedSizeTest) {
// Check that we didn't grow
EXPECT_EQ(MemorySize, Map.getMemorySize());
// Check that move was called the expected number of times
- EXPECT_EQ(ExpectedMaxInitialEntries, CountCopyAndMove::Move);
+ EXPECT_EQ(ExpectedMaxInitialEntries, CountCopyAndMove::TotalMoves());
// Check that no copy occurred
- EXPECT_EQ(0, CountCopyAndMove::Copy);
+ EXPECT_EQ(0, CountCopyAndMove::TotalCopies());
// Adding one extra element should grow the map
Map.insert(std::pair<int, CountCopyAndMove>(
@@ -425,7 +403,7 @@ TEST(DenseMapCustomTest, DefaultMinReservedSizeTest) {
// This relies on move-construction elision, and cannot be reliably tested.
// EXPECT_EQ(ExpectedMaxInitialEntries + 2, CountCopyAndMove::Move);
// Check that no copy occurred
- EXPECT_EQ(0, CountCopyAndMove::Copy);
+ EXPECT_EQ(0, CountCopyAndMove::TotalCopies());
}
// Make sure creating the map with an initial size of N actually gives us enough
@@ -439,8 +417,8 @@ TEST(DenseMapCustomTest, InitialSizeTest) {
for (auto Size : {1, 2, 48, 66}) {
DenseMap<int, CountCopyAndMove> Map(Size);
unsigned MemorySize = Map.getMemorySize();
- CountCopyAndMove::Copy = 0;
- CountCopyAndMove::Move = 0;
+ CountCopyAndMove::ResetCounts();
+
for (int i = 0; i < Size; ++i)
Map.insert(std::pair<int, CountCopyAndMove>(std::piecewise_construct,
std::forward_as_tuple(i),
@@ -448,9 +426,9 @@ TEST(DenseMapCustomTest, InitialSizeTest) {
// Check that we didn't grow
EXPECT_EQ(MemorySize, Map.getMemorySize());
// Check that move was called the expected number of times
- EXPECT_EQ(Size, CountCopyAndMove::Move);
+ EXPECT_EQ(Size, CountCopyAndMove::TotalMoves());
// Check that no copy occurred
- EXPECT_EQ(0, CountCopyAndMove::Copy);
+ EXPECT_EQ(0, CountCopyAndMove::TotalCopies());
}
}
@@ -461,15 +439,14 @@ TEST(DenseMapCustomTest, InitFromIterator) {
const int Count = 65;
Values.reserve(Count);
for (int i = 0; i < Count; i++)
- Values.emplace_back(i, CountCopyAndMove());
+ Values.emplace_back(i, CountCopyAndMove(i));
- CountCopyAndMove::Move = 0;
- CountCopyAndMove::Copy = 0;
+ CountCopyAndMove::ResetCounts();
DenseMap<int, CountCopyAndMove> Map(Values.begin(), Values.end());
// Check that no move occurred
- EXPECT_EQ(0, CountCopyAndMove::Move);
+ EXPECT_EQ(0, CountCopyAndMove::TotalMoves());
// Check that copy was called the expected number of times
- EXPECT_EQ(Count, CountCopyAndMove::Copy);
+ EXPECT_EQ(Count, CountCopyAndMove::TotalCopies());
}
// Make sure reserve actually gives us enough buckets to insert N items
@@ -484,8 +461,7 @@ TEST(DenseMapCustomTest, ReserveTest) {
DenseMap<int, CountCopyAndMove> Map;
Map.reserve(Size);
unsigned MemorySize = Map.getMemorySize();
- CountCopyAndMove::Copy = 0;
- CountCopyAndMove::Move = 0;
+ CountCopyAndMove::ResetCounts();
for (int i = 0; i < Size; ++i)
Map.insert(std::pair<int, CountCopyAndMove>(std::piecewise_construct,
std::forward_as_tuple(i),
@@ -493,44 +469,45 @@ TEST(DenseMapCustomTest, ReserveTest) {
// Check that we didn't grow
EXPECT_EQ(MemorySize, Map.getMemorySize());
// Check that move was called the expected number of times
- EXPECT_EQ(Size, CountCopyAndMove::Move);
+ EXPECT_EQ(Size, CountCopyAndMove::TotalMoves());
// Check that no copy occurred
- EXPECT_EQ(0, CountCopyAndMove::Copy);
+ EXPECT_EQ(0, CountCopyAndMove::TotalCopies());
}
}
TEST(DenseMapCustomTest, InsertOrAssignTest) {
- struct C : CountCopyAndMove {
- C(int v) : v(v) {}
- int v;
- };
-
- DenseMap<int, C> Map;
- CountCopyAndMove::Copy = 0;
- CountCopyAndMove::Move = 0;
+ DenseMap<int, CountCopyAndMove> Map;
+ CountCopyAndMove::ResetCounts();
- C val1(1);
+ CountCopyAndMove val1(1);
auto try0 = Map.insert_or_assign(0, val1);
EXPECT_TRUE(try0.second);
- EXPECT_EQ(0, CountCopyAndMove::Move);
- EXPECT_EQ(1, CountCopyAndMove::Copy);
+ EXPECT_EQ(0, CountCopyAndMove::TotalMoves());
+ EXPECT_EQ(1, CountCopyAndMove::CopyConstructions);
+ EXPECT_EQ(0, CountCopyAndMove::CopyAssignments);
auto try1 = Map.insert_or_assign(0, val1);
EXPECT_FALSE(try1.second);
- EXPECT_EQ(0, CountCopyAndMove::Move);
- EXPECT_EQ(2, CountCopyAndMove::Copy);
+ EXPECT_EQ(0, CountCopyAndMove::TotalMoves());
+ EXPECT_EQ(1, CountCopyAndMove::CopyConstructions);
+ EXPECT_EQ(1, CountCopyAndMove::CopyAssignments);
int key2 = 2;
- C val2(2);
- auto try2 = Map.insert_or_assign(key2, val2);
+ CountCopyAndMove val2(2);
+ auto try2 = Map.insert_or_assign(key2, std::move(val2));
EXPECT_TRUE(try2.second);
- EXPECT_EQ(0, CountCopyAndMove::Move);
- EXPECT_EQ(3, CountCopyAndMove::Copy);
+ EXPECT_EQ(1, CountCopyAndMove::MoveConstructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveAssignments);
+ EXPECT_EQ(1, CountCopyAndMove::CopyConstructions);
+ EXPECT_EQ(1, CountCopyAndMove::CopyAssignments);
- auto try3 = Map.insert_or_assign(key2, std::move(val2));
+ CountCopyAndMove val3(3);
+ auto try3 = Map.insert_or_assign(key2, std::move(val3));
EXPECT_FALSE(try3.second);
- EXPECT_EQ(1, CountCopyAndMove::Move);
- EXPECT_EQ(3, CountCopyAndMove::Copy);
+ EXPECT_EQ(1, CountCopyAndMove::MoveConstructions);
+ EXPECT_EQ(1, CountCopyAndMove::MoveAssignments);
+ EXPECT_EQ(1, CountCopyAndMove::CopyConstructions);
+ EXPECT_EQ(1, CountCopyAndMove::CopyAssignments);
}
// Make sure DenseMap works with StringRef keys.
diff --git a/llvm/unittests/ADT/MoveOnly.cpp b/llvm/unittests/ADT/MoveOnly.cpp
deleted file mode 100644
index 541903bbe9467..0000000000000
--- a/llvm/unittests/ADT/MoveOnly.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-//===- llvm/unittest/ADT/MoveOnly.cpp - Optional unit tests ---------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "MoveOnly.h"
-
-using namespace llvm;
-
-unsigned MoveOnly::MoveConstructions = 0;
-unsigned MoveOnly::Destructions = 0;
-unsigned MoveOnly::MoveAssignments = 0;
diff --git a/llvm/unittests/ADT/MoveOnly.h b/llvm/unittests/ADT/MoveOnly.h
deleted file mode 100644
index ad64deae771ba..0000000000000
--- a/llvm/unittests/ADT/MoveOnly.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//===- llvm/unittest/ADT/MoveOnly.h - Optional unit tests -----------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_UNITTESTS_ADT_MOVEONLY_H
-#define LLVM_UNITTESTS_ADT_MOVEONLY_H
-
-namespace llvm {
-
-struct MoveOnly {
- static unsigned MoveConstructions;
- static unsigned Destructions;
- static unsigned MoveAssignments;
- int val;
- explicit MoveOnly(int val) : val(val) {
- }
- MoveOnly(MoveOnly&& other) {
- val = other.val;
- ++MoveConstructions;
- }
- MoveOnly &operator=(MoveOnly&& other) {
- val = other.val;
- ++MoveAssignments;
- return *this;
- }
- ~MoveOnly() {
- ++Destructions;
- }
- static void ResetCounts() {
- MoveConstructions = 0;
- Destructions = 0;
- MoveAssignments = 0;
- }
-};
-
-} // end namespace llvm
-
-#endif // LLVM_UNITTESTS_ADT_MOVEONLY_H
diff --git a/llvm/unittests/ADT/STLForwardCompatTest.cpp b/llvm/unittests/ADT/STLForwardCompatTest.cpp
index b0c95d09ba2c6..7300b4883a173 100644
--- a/llvm/unittests/ADT/STLForwardCompatTest.cpp
+++ b/llvm/unittests/ADT/STLForwardCompatTest.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ADT/STLForwardCompat.h"
-#include "MoveOnly.h"
+#include "CountCopyAndMove.h"
#include "gtest/gtest.h"
namespace {
@@ -58,27 +58,27 @@ TEST(TransformTest, TransformStd) {
}
TEST(TransformTest, MoveTransformStd) {
- using llvm::MoveOnly;
+ using llvm::CountCopyAndMove;
- std::optional<MoveOnly> A;
+ std::optional<CountCopyAndMove> A;
- MoveOnly::ResetCounts();
+ CountCopyAndMove::ResetCounts();
std::optional<int> B = llvm::transformOptional(
- std::move(A), [&](const MoveOnly &M) { return M.val + 2; });
+ std::move(A), [&](const CountCopyAndMove &M) { return M.val + 2; });
EXPECT_FALSE(B.has_value());
- EXPECT_EQ(0u, MoveOnly::MoveConstructions);
- EXPECT_EQ(0u, MoveOnly::MoveAssignments);
- EXPECT_EQ(0u, MoveOnly::Destructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveConstructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveAssignments);
+ EXPECT_EQ(0, CountCopyAndMove::Destructions);
- A = MoveOnly(5);
- MoveOnly::ResetCounts();
+ A = CountCopyAndMove(5);
+ CountCopyAndMove::ResetCounts();
std::optional<int> C = llvm::transformOptional(
- std::move(A), [&](const MoveOnly &M) { return M.val + 2; });
+ std::move(A), [&](const CountCopyAndMove &M) { return M.val + 2; });
EXPECT_TRUE(C.has_value());
EXPECT_EQ(7, *C);
- EXPECT_EQ(0u, MoveOnly::MoveConstructions);
- EXPECT_EQ(0u, MoveOnly::MoveAssignments);
- EXPECT_EQ(0u, MoveOnly::Destructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveConstructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveAssignments);
+ EXPECT_EQ(0, CountCopyAndMove::Destructions);
}
TEST(TransformTest, TransformLlvm) {
@@ -96,27 +96,27 @@ TEST(TransformTest, TransformLlvm) {
}
TEST(TransformTest, MoveTransformLlvm) {
- using llvm::MoveOnly;
+ using llvm::CountCopyAndMove;
- std::optional<MoveOnly> A;
+ std::optional<CountCopyAndMove> A;
- MoveOnly::ResetCounts();
+ CountCopyAndMove::ResetCounts();
std::optional<int> B = llvm::transformOptional(
- std::move(A), [&](const MoveOnly &M) { return M.val + 2; });
+ std::move(A), [&](const CountCopyAndMove &M) { return M.val + 2; });
EXPECT_FALSE(B.has_value());
- EXPECT_EQ(0u, MoveOnly::MoveConstructions);
- EXPECT_EQ(0u, MoveOnly::MoveAssignments);
- EXPECT_EQ(0u, MoveOnly::Destructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveConstructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveAssignments);
+ EXPECT_EQ(0, CountCopyAndMove::Destructions);
- A = MoveOnly(5);
- MoveOnly::ResetCounts();
+ A = CountCopyAndMove(5);
+ CountCopyAndMove::ResetCounts();
std::optional<int> C = llvm::transformOptional(
- std::move(A), [&](const MoveOnly &M) { return M.val + 2; });
+ std::move(A), [&](const CountCopyAndMove &M) { return M.val + 2; });
EXPECT_TRUE(C.has_value());
EXPECT_EQ(7, *C);
- EXPECT_EQ(0u, MoveOnly::MoveConstructions);
- EXPECT_EQ(0u, MoveOnly::MoveAssignments);
- EXPECT_EQ(0u, MoveOnly::Destructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveConstructions);
+ EXPECT_EQ(0, CountCopyAndMove::MoveAssignments);
+ EXPECT_EQ(0, CountCopyAndMove::Destructions);
}
TEST(TransformTest, ToUnderlying) {
More information about the llvm-commits
mailing list