Bug 1397056 - Add Contains and a return parameter to Remove for SmallPointerArray. r=froydnj

* * *
[mq]: fix

MozReview-Commit-ID: 5laM7PQLP7X
This commit is contained in:
Matt Woodrow 2017-09-12 14:11:47 -04:00
parent cc2e281b3b
commit a56e3551a2
3 changed files with 46 additions and 11 deletions

View File

@ -9,6 +9,7 @@
#define mozilla_SmallPointerArray_h
#include "mozilla/Assertions.h"
#include <algorithm>
#include <iterator>
#include <vector>
@ -96,34 +97,60 @@ public:
mInlineElements[0] = nullptr;
}
void RemoveElement(T* aElement) {
bool RemoveElement(T* aElement) {
MOZ_ASSERT(aElement != nullptr);
if (aElement == nullptr) {
return;
return false;
}
if (mInlineElements[0] == aElement) {
// Expectected case.
mInlineElements[0] = mInlineElements[1];
mInlineElements[1] = nullptr;
return;
return true;
}
if (mInlineElements[0]) {
if (mInlineElements[1] == aElement) {
mInlineElements[1] = nullptr;
return true;
}
return;
return false;
}
if (mArray) {
for (auto iter = mArray->begin(); iter != mArray->end(); iter++) {
if (*iter == aElement) {
mArray->erase(iter);
return;
return true;
}
}
}
return false;
}
bool Contains(T* aElement) const {
MOZ_ASSERT(aElement != nullptr);
if (aElement == nullptr) {
return false;
}
if (mInlineElements[0] == aElement) {
return true;
}
if (mInlineElements[0]) {
if (mInlineElements[1] == aElement) {
return true;
}
return false;
}
if (mArray) {
return std::find(mArray->begin(), mArray->end(), aElement) != mArray->end();
}
return false;
}
size_t Length() const

View File

@ -19,12 +19,14 @@ void TestArrayManipulation()
MOZ_RELEASE_ASSERT(testArray.Length() == 0);
MOZ_RELEASE_ASSERT(sizeof(testArray) == 2 * sizeof(void*));
MOZ_RELEASE_ASSERT(!testArray.Contains(PTR1));
testArray.AppendElement(PTR1);
MOZ_RELEASE_ASSERT(testArray.Length() == 1);
MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
MOZ_RELEASE_ASSERT(testArray.Contains(PTR1));
testArray.AppendElement(PTR2);
@ -33,12 +35,15 @@ void TestArrayManipulation()
MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR2);
MOZ_RELEASE_ASSERT(testArray.Contains(PTR2));
testArray.RemoveElement(PTR1);
MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR1));
MOZ_RELEASE_ASSERT(!testArray.RemoveElement(PTR1));
MOZ_RELEASE_ASSERT(testArray.Length() == 1);
MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
MOZ_RELEASE_ASSERT(!testArray.Contains(PTR1));
testArray.AppendElement(PTR1);
@ -47,6 +52,7 @@ void TestArrayManipulation()
MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
MOZ_RELEASE_ASSERT(testArray[1] == PTR1);
MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR1);
MOZ_RELEASE_ASSERT(testArray.Contains(PTR1));
testArray.AppendElement(PTR3);
@ -57,8 +63,9 @@ void TestArrayManipulation()
MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR1);
MOZ_RELEASE_ASSERT(testArray[2] == PTR3);
MOZ_RELEASE_ASSERT(testArray.ElementAt(2) == PTR3);
MOZ_RELEASE_ASSERT(testArray.Contains(PTR3));
testArray.RemoveElement(PTR1);
MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR1));
MOZ_RELEASE_ASSERT(testArray.Length() == 2);
MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
@ -66,13 +73,13 @@ void TestArrayManipulation()
MOZ_RELEASE_ASSERT(testArray[1] == PTR3);
MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR3);
testArray.RemoveElement(PTR2);
MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR2));
MOZ_RELEASE_ASSERT(testArray.Length() == 1);
MOZ_RELEASE_ASSERT(testArray[0] == PTR3);
MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR3);
testArray.RemoveElement(PTR3);
MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR3));
MOZ_RELEASE_ASSERT(testArray.Length() == 0);
@ -94,13 +101,13 @@ void TestArrayManipulation()
MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR2);
testArray.RemoveElement(PTR2);
MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR2));
MOZ_RELEASE_ASSERT(testArray.Length() == 1);
MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
testArray.RemoveElement(PTR3);
MOZ_RELEASE_ASSERT(!testArray.RemoveElement(PTR3));
MOZ_RELEASE_ASSERT(testArray.Length() == 1);
MOZ_RELEASE_ASSERT(testArray[0] == PTR1);

View File

@ -38,6 +38,7 @@ skip-if = os == 'android' # Bug 1147630
[TestScopeExit]
[TestSegmentedVector]
[TestSHA1]
[TestSmallPointerArray]
[TestSaturate]
[TestSplayTree]
[TestSyncRunnable]