Bug 1606187 - Part 2a: Switch nsClassHashtable over to UniquePtr r=KrisWright,froydnj

Differential Revision: https://phabricator.services.mozilla.com/D59041

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Eric Rahm 2020-01-13 19:18:43 +00:00
parent a4d08e88db
commit 5ff63a5642
2 changed files with 32 additions and 11 deletions

View File

@ -8,9 +8,23 @@
#define nsClassHashtable_h__
#include "mozilla/Move.h"
#include "mozilla/UniquePtr.h"
#include "nsBaseHashtable.h"
#include "nsHashKeys.h"
#include "nsAutoPtr.h"
/**
* Helper class that provides methods to wrap and unwrap the UserDataType.
*/
template <class T>
class nsUniquePtrConverter {
public:
using UserDataType = T*;
using DataType = mozilla::UniquePtr<T>;
static UserDataType Unwrap(DataType& src) { return src.get(); }
static DataType Wrap(UserDataType&& src) { return DataType(std::move(src)); }
static DataType Wrap(const UserDataType& src) { return DataType(src); }
};
/**
* templated hashtable class maps keys to C++ object pointers.
@ -21,18 +35,22 @@
* @see nsInterfaceHashtable, nsClassHashtable
*/
template <class KeyClass, class T>
class nsClassHashtable : public nsBaseHashtable<KeyClass, nsAutoPtr<T>, T*> {
class nsClassHashtable : public nsBaseHashtable<KeyClass, mozilla::UniquePtr<T>,
T*, nsUniquePtrConverter<T>> {
public:
typedef typename KeyClass::KeyType KeyType;
typedef T* UserDataType;
typedef nsBaseHashtable<KeyClass, nsAutoPtr<T>, T*> base_type;
typedef nsBaseHashtable<KeyClass, mozilla::UniquePtr<T>, T*,
nsUniquePtrConverter<T>>
base_type;
using base_type::IsEmpty;
using base_type::Remove;
nsClassHashtable() {}
explicit nsClassHashtable(uint32_t aInitLength)
: nsBaseHashtable<KeyClass, nsAutoPtr<T>, T*>(aInitLength) {}
: nsBaseHashtable<KeyClass, mozilla::UniquePtr<T>, T*,
nsUniquePtrConverter<T>>(aInitLength) {}
/**
* Looks up aKey in the hash table. If it doesn't exist a new object of
@ -80,9 +98,10 @@ T* nsClassHashtable<KeyClass, T>::LookupOrAdd(KeyType aKey,
auto count = this->Count();
typename base_type::EntryType* ent = this->PutEntry(aKey);
if (count != this->Count()) {
ent->SetData(nsAutoPtr<T>(new T(std::forward<Args>(aConstructionArgs)...)));
ent->SetData(
mozilla::MakeUnique<T>(std::forward<Args>(aConstructionArgs)...));
}
return ent->GetData();
return ent->GetData().get();
}
template <class KeyClass, class T>
@ -91,7 +110,7 @@ bool nsClassHashtable<KeyClass, T>::Get(KeyType aKey, T** aRetVal) const {
if (ent) {
if (aRetVal) {
*aRetVal = ent->GetData();
*aRetVal = ent->GetData().get();
}
return true;
@ -111,7 +130,7 @@ T* nsClassHashtable<KeyClass, T>::Get(KeyType aKey) const {
return nullptr;
}
return ent->GetData();
return ent->GetData().get();
}
#endif // nsClassHashtable_h__

View File

@ -20,6 +20,8 @@
#include <numeric>
using mozilla::UniquePtr;
namespace TestHashtables {
class TestUniChar // for nsClassHashtable
@ -425,7 +427,7 @@ TEST(Hashtables, ClassHashtable_RangeBasedFor)
ASSERT_EQ(1u,
entities.erase(EntityNode{str, entity.GetData()->GetChar()}));
entity.SetData(nsAutoPtr<TestUniChar>{});
entity.SetData(UniquePtr<TestUniChar>{});
ASSERT_EQ(nullptr, entity.GetData());
}
ASSERT_TRUE(entities.empty());
@ -594,7 +596,7 @@ TEST(Hashtables, ClassHashtable_LookupForAdd)
for (auto& entity : gEntities) {
auto entry = EntToUniClass.LookupForAdd(nsDependentCString(entity.mStr));
const TestUniChar* val = entry.OrInsert([]() { return nullptr; });
const TestUniChar* val = entry.OrInsert([]() { return nullptr; }).get();
ASSERT_FALSE(entry);
ASSERT_TRUE(val == nullptr);
ASSERT_TRUE(entry.Data() == nullptr);
@ -644,7 +646,7 @@ TEST(Hashtables, ClassHashtable_LookupForAdd)
// Remove existing entries via OrRemove.
for (auto& entity : gEntities) {
auto entry = EntToUniClass.LookupForAdd(nsDependentCString(entity.mStr));
const TestUniChar* val = entry.OrInsert([]() { return nullptr; });
const TestUniChar* val = entry.OrInsert([]() { return nullptr; }).get();
ASSERT_FALSE(entry);
ASSERT_TRUE(val == nullptr);
ASSERT_TRUE(entry.Data() == nullptr);