1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

Make the moved-from SmallPtrSet be a valid, empty, small-state object.

Enhance the tests to actually require moves in C++11 mode, in addition
to testing the moved-from state. Further enhance the tests to cover
copy-assignment into a moved-from object and moving a large-state
object. (Note that we can't really test small-state vs. large-state as
that isn't an observable property of the API really.) This should finish
addressing review on r195239.

llvm-svn: 195261
This commit is contained in:
Chandler Carruth 2013-11-20 18:29:56 +00:00
parent 90ef1fdaca
commit ffaacacd23
3 changed files with 36 additions and 10 deletions

View File

@ -140,7 +140,7 @@ protected:
void CopyFrom(const SmallPtrSetImpl &RHS);
#if LLVM_HAS_RVALUE_REFERENCES
void MoveFrom(SmallPtrSetImpl &&RHS);
void MoveFrom(unsigned SmallSize, SmallPtrSetImpl &&RHS);
#endif
};
@ -300,7 +300,7 @@ public:
#if LLVM_HAS_RVALUE_REFERENCES
SmallPtrSet<PtrType, SmallSize>&
operator=(SmallPtrSet<PtrType, SmallSize> &&RHS) {
MoveFrom(std::move(RHS));
MoveFrom(SmallSizePowTwo, std::move(RHS));
return *this;
}
#endif

View File

@ -206,6 +206,12 @@ SmallPtrSetImpl::SmallPtrSetImpl(const void **SmallStorage, unsigned SmallSize,
// Otherwise, we steal the large memory allocation and no copy is needed.
CurArray = that.CurArray;
that.CurArray = that.SmallArray;
// Make the "that" object small and empty.
that.CurArraySize = SmallSize;
assert(that.CurArray == that.SmallArray);
that.NumElements = 0;
that.NumTombstones = 0;
}
#endif
@ -246,7 +252,7 @@ void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) {
}
#if LLVM_HAS_RVALUE_REFERENCES
void SmallPtrSetImpl::MoveFrom(SmallPtrSetImpl &&RHS) {
void SmallPtrSetImpl::MoveFrom(unsigned SmallSize, SmallPtrSetImpl &&RHS) {
if (!isSmall())
free(CurArray);
@ -263,6 +269,12 @@ void SmallPtrSetImpl::MoveFrom(SmallPtrSetImpl &&RHS) {
CurArraySize = RHS.CurArraySize;
NumElements = RHS.NumElements;
NumTombstones = RHS.NumTombstones;
// Make the RHS small and empty.
RHS.CurArraySize = SmallSize;
assert(RHS.CurArray == RHS.SmallArray);
RHS.NumElements = 0;
RHS.NumTombstones = 0;
}
#endif

View File

@ -121,28 +121,42 @@ TEST(SmallPtrSetTest, CopyAndMoveTest) {
s1 = s2;
EXPECT_EQ(4U, s1.size());
EXPECT_EQ(4U, s2.size());
for (int i = 0; i < 8; ++i)
if (i < 4)
EXPECT_TRUE(s1.count(&buf[i]));
else
EXPECT_FALSE(s1.count(&buf[i]));
SmallPtrSet<int *, 4> s3(llvm_move(s1));
#if LLVM_HAS_RVALUE_REFERENCES
SmallPtrSet<int *, 4> s3(std::move(s1));
EXPECT_EQ(4U, s3.size());
EXPECT_TRUE(s1.empty());
for (int i = 0; i < 8; ++i)
if (i < 4)
EXPECT_TRUE(s3.count(&buf[i]));
else
EXPECT_FALSE(s3.count(&buf[i]));
// Move assign to the moved-from object.
// Move assign into the moved-from object. Also test move of a non-small
// container.
s3.insert(&buf[4]);
s3.insert(&buf[5]);
s3.insert(&buf[6]);
s3.insert(&buf[7]);
s1 = llvm_move(s3);
EXPECT_EQ(4U, s1.size());
EXPECT_EQ(8U, s1.size());
EXPECT_TRUE(s3.empty());
for (int i = 0; i < 8; ++i)
if (i < 4)
EXPECT_TRUE(s1.count(&buf[i]));
else
EXPECT_FALSE(s1.count(&buf[i]));
EXPECT_TRUE(s1.count(&buf[i]));
// Copy assign into a moved-from object.
s3 = s1;
EXPECT_EQ(8U, s3.size());
EXPECT_EQ(8U, s1.size());
for (int i = 0; i < 8; ++i)
EXPECT_TRUE(s3.count(&buf[i]));
#endif
}
TEST(SmallPtrSetTest, SwapTest) {