зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1610066 - Make nsTArray::SafeElementAt not require the complete type for smart pointers. r=froydnj
Differential Revision: https://phabricator.services.mozilla.com/D60338 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
73177747e8
Коммит
71e16d9992
|
@ -264,12 +264,20 @@ struct nsTArray_SafeElementAtSmartPtrHelper {
|
|||
typedef size_t index_type;
|
||||
|
||||
elem_type SafeElementAt(index_type aIndex) {
|
||||
return static_cast<Derived*>(this)->SafeElementAt(aIndex, nullptr);
|
||||
auto* derived = static_cast<Derived*>(this);
|
||||
if (aIndex < derived->Length()) {
|
||||
return derived->Elements()[aIndex];
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// XXX: Probably should return const_elem_type, but callsites must be fixed.
|
||||
elem_type SafeElementAt(index_type aIndex) const {
|
||||
return static_cast<const Derived*>(this)->SafeElementAt(aIndex, nullptr);
|
||||
auto* derived = static_cast<const Derived*>(this);
|
||||
if (aIndex < derived->Length()) {
|
||||
return derived->Elements()[aIndex];
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -290,26 +298,8 @@ class OwningNonNull;
|
|||
} // namespace mozilla
|
||||
|
||||
template <class E, class Derived>
|
||||
struct nsTArray_SafeElementAtHelper<mozilla::OwningNonNull<E>, Derived> {
|
||||
typedef E* elem_type;
|
||||
typedef const E* const_elem_type;
|
||||
typedef size_t index_type;
|
||||
|
||||
elem_type SafeElementAt(index_type aIndex) {
|
||||
if (aIndex < static_cast<Derived*>(this)->Length()) {
|
||||
return static_cast<Derived*>(this)->ElementAt(aIndex);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// XXX: Probably should return const_elem_type, but callsites must be fixed.
|
||||
elem_type SafeElementAt(index_type aIndex) const {
|
||||
if (aIndex < static_cast<const Derived*>(this)->Length()) {
|
||||
return static_cast<const Derived*>(this)->ElementAt(aIndex);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
struct nsTArray_SafeElementAtHelper<mozilla::OwningNonNull<E>, Derived>
|
||||
: public nsTArray_SafeElementAtSmartPtrHelper<E, Derived> {};
|
||||
|
||||
// Servo bindings.
|
||||
extern "C" void Gecko_EnsureTArrayCapacity(void* aArray, size_t aCapacity,
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "nsTArray.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "mozilla/ArrayUtils.h"
|
||||
#include "mozilla/RefPtr.h"
|
||||
|
||||
using namespace mozilla;
|
||||
|
||||
|
@ -461,4 +462,17 @@ TEST(TArray, MakeBackInserter)
|
|||
ASSERT_EQ(expected, dst);
|
||||
}
|
||||
|
||||
// This should compile:
|
||||
struct RefCounted;
|
||||
|
||||
class Foo {
|
||||
~Foo(); // Intentionally out of line
|
||||
|
||||
nsTArray<RefPtr<RefCounted>> mArray;
|
||||
|
||||
const RefCounted* GetFirst() const {
|
||||
return mArray.SafeElementAt(0);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace TestTArray
|
||||
|
|
Загрузка…
Ссылка в новой задаче