forked from OSchip/llvm-project
parent
1e9db7e639
commit
9cb331f9fb
|
@ -109,8 +109,8 @@ public:
|
||||||
|
|
||||||
explicit StringMapEntry(unsigned strLen)
|
explicit StringMapEntry(unsigned strLen)
|
||||||
: StringMapEntryBase(strLen), second() {}
|
: StringMapEntryBase(strLen), second() {}
|
||||||
StringMapEntry(unsigned strLen, const ValueTy &V)
|
StringMapEntry(unsigned strLen, ValueTy V)
|
||||||
: StringMapEntryBase(strLen), second(V) {}
|
: StringMapEntryBase(strLen), second(std::move(V)) {}
|
||||||
|
|
||||||
StringRef getKey() const {
|
StringRef getKey() const {
|
||||||
return StringRef(getKeyData(), getKeyLength());
|
return StringRef(getKeyData(), getKeyLength());
|
||||||
|
@ -146,7 +146,7 @@ public:
|
||||||
static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
|
static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
|
||||||
|
|
||||||
// Default construct the value.
|
// Default construct the value.
|
||||||
new (NewItem) StringMapEntry(KeyLength, InitVal);
|
new (NewItem) StringMapEntry(KeyLength, std::move(InitVal));
|
||||||
|
|
||||||
// Copy the string information.
|
// Copy the string information.
|
||||||
char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
|
char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
|
||||||
|
@ -166,7 +166,7 @@ public:
|
||||||
static StringMapEntry *Create(const char *KeyStart, const char *KeyEnd,
|
static StringMapEntry *Create(const char *KeyStart, const char *KeyEnd,
|
||||||
InitType InitVal) {
|
InitType InitVal) {
|
||||||
MallocAllocator A;
|
MallocAllocator A;
|
||||||
return Create(KeyStart, KeyEnd, A, InitVal);
|
return Create(KeyStart, KeyEnd, A, std::move(InitVal));
|
||||||
}
|
}
|
||||||
|
|
||||||
static StringMapEntry *Create(const char *KeyStart, const char *KeyEnd) {
|
static StringMapEntry *Create(const char *KeyStart, const char *KeyEnd) {
|
||||||
|
@ -348,7 +348,7 @@ public:
|
||||||
return *static_cast<MapEntryTy*>(Bucket);
|
return *static_cast<MapEntryTy*>(Bucket);
|
||||||
|
|
||||||
MapEntryTy *NewItem =
|
MapEntryTy *NewItem =
|
||||||
MapEntryTy::Create(Key.begin(), Key.end(), Allocator, Val);
|
MapEntryTy::Create(Key.begin(), Key.end(), Allocator, std::move(Val));
|
||||||
|
|
||||||
if (Bucket == getTombstoneVal())
|
if (Bucket == getTombstoneVal())
|
||||||
--NumTombstones;
|
--NumTombstones;
|
||||||
|
|
|
@ -218,4 +218,20 @@ TEST_F(StringMapTest, NonDefaultConstructable) {
|
||||||
ASSERT_EQ(iter->second.i, 123);
|
ASSERT_EQ(iter->second.i, 123);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct MoveOnly {
|
||||||
|
int i;
|
||||||
|
MoveOnly(int i) : i(i) {}
|
||||||
|
MoveOnly(MoveOnly&&) = default;
|
||||||
|
MoveOnly(const MoveOnly&) = delete;
|
||||||
|
MoveOnly &operator=(MoveOnly&&) = default;
|
||||||
|
MoveOnly &operator=(const MoveOnly&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(StringMapTest, MoveOnlyKey) {
|
||||||
|
StringMap<MoveOnly> t;
|
||||||
|
t.GetOrCreateValue("Test", MoveOnly(42));
|
||||||
|
StringRef Key = "Test";
|
||||||
|
StringMapEntry<MoveOnly>::Create(Key.begin(), Key.end(), MoveOnly(42))->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
Loading…
Reference in New Issue