mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 01:05:45 +00:00
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:
parent
a4d08e88db
commit
5ff63a5642
@ -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__
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user