aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-03-25 13:23:13 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-03-25 13:23:13 -0700
commitd4714af018158c15e13439bef2c9b5bafc25c1d7 (patch)
treec3161b2001d9e2bdd2e378f3690c0bc3c1e20261
parentb3e5e4d314301617d2d48b7589dfd426bd68a671 (diff)
SkPDF SkPDFObject::addResources signature simplified
- SkPDFcatalog keeps a ordered list of object pointers - Elimiante SkTSet template class - SkPDFObject::addResources signature changes BUG=skia:3585 Review URL: https://codereview.chromium.org/1038523004
-rw-r--r--gyp/pdf.gypi1
-rw-r--r--gyp/tests.gypi1
-rw-r--r--src/doc/SkDocument_PDF.cpp13
-rw-r--r--src/pdf/SkPDFBitmap.cpp7
-rw-r--r--src/pdf/SkPDFBitmap.h3
-rw-r--r--src/pdf/SkPDFCatalog.cpp1
-rw-r--r--src/pdf/SkPDFCatalog.h3
-rw-r--r--src/pdf/SkPDFResourceDict.h1
-rw-r--r--src/pdf/SkPDFTypes.cpp21
-rw-r--r--src/pdf/SkPDFTypes.h17
-rw-r--r--src/pdf/SkTSet.h356
-rw-r--r--tests/TSetTest.cpp135
12 files changed, 27 insertions, 532 deletions
diff --git a/gyp/pdf.gypi b/gyp/pdf.gypi
index 9d406df876..9de60a60f4 100644
--- a/gyp/pdf.gypi
+++ b/gyp/pdf.gypi
@@ -37,6 +37,5 @@
'<(skia_src_path)/pdf/SkPDFTypes.h',
'<(skia_src_path)/pdf/SkPDFUtils.cpp',
'<(skia_src_path)/pdf/SkPDFUtils.h',
- '<(skia_src_path)/pdf/SkTSet.h',
],
}
diff --git a/gyp/tests.gypi b/gyp/tests.gypi
index 14ad99f056..049b4b2361 100644
--- a/gyp/tests.gypi
+++ b/gyp/tests.gypi
@@ -218,7 +218,6 @@
'../tests/TDPQueueTest.cpp',
'../tests/Time.cpp',
'../tests/TLSTest.cpp',
- '../tests/TSetTest.cpp',
'../tests/TextBlobTest.cpp',
'../tests/TextureCompressionTest.cpp',
'../tests/ToUnicodeTest.cpp',
diff --git a/src/doc/SkDocument_PDF.cpp b/src/doc/SkDocument_PDF.cpp
index ae0386ab1a..fcbba38306 100644
--- a/src/doc/SkDocument_PDF.cpp
+++ b/src/doc/SkDocument_PDF.cpp
@@ -211,19 +211,14 @@ static bool emit_pdf_document(const SkTDArray<const SkPDFDevice*>& pageDevices,
// Build font subsetting info before proceeding.
perform_font_subsetting(pageDevices, &catalog);
- SkTSet<SkPDFObject*> resourceSet;
- if (resourceSet.add(docCatalog.get())) {
- docCatalog->addResources(&resourceSet, &catalog);
+ if (catalog.addObject(docCatalog.get())) {
+ docCatalog->addResources(&catalog);
}
- for (int i = 0; i < resourceSet.count(); ++i) {
- SkAssertResult(catalog.addObject(resourceSet[i]));
- }
-
size_t baseOffset = SkToOffT(stream->bytesWritten());
emit_pdf_header(stream);
SkTDArray<int32_t> offsets;
- for (int i = 0; i < resourceSet.count(); ++i) {
- SkPDFObject* object = resourceSet[i];
+ for (int i = 0; i < catalog.objects().count(); ++i) {
+ SkPDFObject* object = catalog.objects()[i];
offsets.push(SkToS32(stream->bytesWritten() - baseOffset));
SkASSERT(object == catalog.getSubstituteObject(object));
SkASSERT(catalog.getObjectNumber(object) == i + 1);
diff --git a/src/pdf/SkPDFBitmap.cpp b/src/pdf/SkPDFBitmap.cpp
index 486dac44aa..765016dcf2 100644
--- a/src/pdf/SkPDFBitmap.cpp
+++ b/src/pdf/SkPDFBitmap.cpp
@@ -286,11 +286,10 @@ void PDFAlphaBitmap::emitDict(SkWStream* stream,
////////////////////////////////////////////////////////////////////////////////
-void SkPDFBitmap::addResources(SkTSet<SkPDFObject*>* resourceSet,
- SkPDFCatalog* catalog) const {
+void SkPDFBitmap::addResources(SkPDFCatalog* catalog) const {
if (fSMask.get()) {
- if (resourceSet->add(fSMask.get())) {
- fSMask->addResources(resourceSet, catalog);
+ if (catalog->addObject(fSMask.get())) {
+ fSMask->addResources(catalog);
}
}
}
diff --git a/src/pdf/SkPDFBitmap.h b/src/pdf/SkPDFBitmap.h
index 02a79df24e..c1ada1a1ad 100644
--- a/src/pdf/SkPDFBitmap.h
+++ b/src/pdf/SkPDFBitmap.h
@@ -28,8 +28,7 @@ public:
static SkPDFBitmap* Create(SkPDFCanon*, const SkBitmap&);
~SkPDFBitmap();
void emitObject(SkWStream*, SkPDFCatalog*) SK_OVERRIDE;
- void addResources(SkTSet<SkPDFObject*>* resourceSet,
- SkPDFCatalog* catalog) const SK_OVERRIDE;
+ void addResources(SkPDFCatalog*) const SK_OVERRIDE;
bool equals(const SkBitmap& other) const {
return fBitmap.getGenerationID() == other.getGenerationID() &&
fBitmap.pixelRefOrigin() == other.pixelRefOrigin() &&
diff --git a/src/pdf/SkPDFCatalog.cpp b/src/pdf/SkPDFCatalog.cpp
index ab5d510861..4069cc9762 100644
--- a/src/pdf/SkPDFCatalog.cpp
+++ b/src/pdf/SkPDFCatalog.cpp
@@ -21,6 +21,7 @@ bool SkPDFCatalog::addObject(SkPDFObject* obj) {
return false;
}
fObjectNumbers.set(obj, fObjectNumbers.count() + 1);
+ fObjects.push(obj);
return true;
}
diff --git a/src/pdf/SkPDFCatalog.h b/src/pdf/SkPDFCatalog.h
index 54d08c5e24..3609f3cbdb 100644
--- a/src/pdf/SkPDFCatalog.h
+++ b/src/pdf/SkPDFCatalog.h
@@ -45,7 +45,10 @@ public:
*/
SkPDFObject* getSubstituteObject(SkPDFObject* object) const;
+ const SkTDArray<SkPDFObject*>& objects() const { return fObjects; }
+
private:
+ SkTDArray<SkPDFObject*> fObjects;
SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers;
SkTHashMap<SkPDFObject*, SkPDFObject*> fSubstituteMap;
};
diff --git a/src/pdf/SkPDFResourceDict.h b/src/pdf/SkPDFResourceDict.h
index 551d20bc8c..22173719fe 100644
--- a/src/pdf/SkPDFResourceDict.h
+++ b/src/pdf/SkPDFResourceDict.h
@@ -10,7 +10,6 @@
#include "SkPDFTypes.h"
#include "SkTDArray.h"
-#include "SkTSet.h"
#include "SkTypes.h"
/** \class SkPDFResourceDict
diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp
index 8bb19360e1..02c5573360 100644
--- a/src/pdf/SkPDFTypes.cpp
+++ b/src/pdf/SkPDFTypes.cpp
@@ -31,12 +31,11 @@ void SkPDFObjRef::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
stream->writeText(" 0 R"); // Generation number is always 0.
}
-void SkPDFObjRef::addResources(SkTSet<SkPDFObject*>* resourceSet,
- SkPDFCatalog* catalog) const {
+void SkPDFObjRef::addResources(SkPDFCatalog* catalog) const {
SkPDFObject* obj = catalog->getSubstituteObject(fObj);
SkASSERT(obj);
- if (resourceSet->add(obj)) {
- obj->addResources(resourceSet, catalog);
+ if (catalog->addObject(obj)) {
+ obj->addResources(catalog);
}
}
@@ -257,11 +256,9 @@ void SkPDFArray::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
stream->writeText("]");
}
-void SkPDFArray::addResources(SkTSet<SkPDFObject*>* resourceSet,
- SkPDFCatalog* catalog) const {
+void SkPDFArray::addResources(SkPDFCatalog* catalog) const {
for (int i = 0; i < fValue.count(); i++) {
- catalog->getSubstituteObject(fValue[i])
- ->addResources(resourceSet, catalog);
+ catalog->getSubstituteObject(fValue[i])->addResources(catalog);
}
}
@@ -330,14 +327,12 @@ void SkPDFDict::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
stream->writeText(">>");
}
-void SkPDFDict::addResources(SkTSet<SkPDFObject*>* resourceSet,
- SkPDFCatalog* catalog) const {
+void SkPDFDict::addResources(SkPDFCatalog* catalog) const {
for (int i = 0; i < fValue.count(); i++) {
SkASSERT(fValue[i].key);
SkASSERT(fValue[i].value);
- fValue[i].key->addResources(resourceSet, catalog);
- catalog->getSubstituteObject(fValue[i].value)
- ->addResources(resourceSet, catalog);
+ fValue[i].key->addResources(catalog);
+ catalog->getSubstituteObject(fValue[i].value)->addResources(catalog);
}
}
diff --git a/src/pdf/SkPDFTypes.h b/src/pdf/SkPDFTypes.h
index 7a72a38c78..3bc606509c 100644
--- a/src/pdf/SkPDFTypes.h
+++ b/src/pdf/SkPDFTypes.h
@@ -14,7 +14,6 @@
#include "SkScalar.h"
#include "SkString.h"
#include "SkTDArray.h"
-#include "SkTSet.h"
#include "SkTypes.h"
class SkPDFCatalog;
@@ -41,13 +40,11 @@ public:
virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog) = 0;
/**
- * Adds all transitive dependencies of this object to resourceSet.
- *
- * @param catalog Implementations should respect the catalog's
- * object substitution map.
+ * Adds all transitive dependencies of this object to the
+ * catalog. Implementations should respect the catalog's object
+ * substitution map.
*/
- virtual void addResources(SkTSet<SkPDFObject*>* resourceSet,
- SkPDFCatalog* catalog) const {}
+ virtual void addResources(SkPDFCatalog* catalog) const {}
private:
typedef SkRefCnt INHERITED;
@@ -69,7 +66,7 @@ public:
// The SkPDFObject interface.
virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog) SK_OVERRIDE;
- virtual void addResources(SkTSet<SkPDFObject*>*, SkPDFCatalog*) const SK_OVERRIDE;
+ virtual void addResources(SkPDFCatalog*) const SK_OVERRIDE;
private:
SkAutoTUnref<SkPDFObject> fObj;
@@ -233,7 +230,7 @@ public:
// The SkPDFObject interface.
virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog) SK_OVERRIDE;
- virtual void addResources(SkTSet<SkPDFObject*>*, SkPDFCatalog*) const SK_OVERRIDE;
+ virtual void addResources(SkPDFCatalog*) const SK_OVERRIDE;
/** The size of the array.
*/
@@ -305,7 +302,7 @@ public:
// The SkPDFObject interface.
virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog) SK_OVERRIDE;
- virtual void addResources(SkTSet<SkPDFObject*>*, SkPDFCatalog*) const SK_OVERRIDE;
+ virtual void addResources(SkPDFCatalog*) const SK_OVERRIDE;
/** The size of the dictionary.
*/
diff --git a/src/pdf/SkTSet.h b/src/pdf/SkTSet.h
deleted file mode 100644
index f57d30eccb..0000000000
--- a/src/pdf/SkTSet.h
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkTSet_DEFINED
-#define SkTSet_DEFINED
-
-#include "SkTSort.h"
-#include "SkTDArray.h"
-#include "SkTypes.h"
-
-/** \class SkTSet<T>
-
- The SkTSet template class defines a set. Elements are additionally
- guaranteed to be sorted by their insertion order.
- Main operations supported now are: add, merge, find and contains.
-
- TSet<T> is mutable.
-*/
-
-// TODO: Add remove, intersect and difference operations.
-// TODO: Add bench tests.
-template <typename T> class SkTSet {
-public:
- SkTSet() {
- fSetArray = SkNEW(SkTDArray<T>);
- fOrderedArray = SkNEW(SkTDArray<T>);
- }
-
- ~SkTSet() {
- SkASSERT(fSetArray);
- SkDELETE(fSetArray);
- SkASSERT(fOrderedArray);
- SkDELETE(fOrderedArray);
- }
-
- SkTSet(const SkTSet<T>& src) {
- this->fSetArray = SkNEW_ARGS(SkTDArray<T>, (*src.fSetArray));
- this->fOrderedArray = SkNEW_ARGS(SkTDArray<T>, (*src.fOrderedArray));
-#ifdef SK_DEBUG
- validate();
-#endif
- }
-
- SkTSet<T>& operator=(const SkTSet<T>& src) {
- *this->fSetArray = *src.fSetArray;
- *this->fOrderedArray = *src.fOrderedArray;
-#ifdef SK_DEBUG
- validate();
-#endif
- return *this;
- }
-
- /** Merges src elements into this, and returns the number of duplicates
- * found. Elements from src will retain their ordering and will be ordered
- * after the elements currently in this set.
- *
- * Implementation note: this uses a 2-stage merge to obtain O(n log n) time.
- * The first stage goes through src.fOrderedArray, checking if
- * this->contains() is false before adding to this.fOrderedArray.
- * The second stage does a standard sorted list merge on the fSetArrays.
- */
- int mergeInto(const SkTSet<T>& src) {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
-
- // Do fOrderedArray merge.
- for (int i = 0; i < src.count(); ++i) {
- if (!contains((*src.fOrderedArray)[i])) {
- fOrderedArray->push((*src.fOrderedArray)[i]);
- }
- }
-
- // Do fSetArray merge.
- int duplicates = 0;
-
- SkTDArray<T>* fArrayNew = new SkTDArray<T>();
- fArrayNew->setReserve(fOrderedArray->count());
- int i = 0;
- int j = 0;
-
- while (i < fSetArray->count() && j < src.count()) {
- if ((*fSetArray)[i] < (*src.fSetArray)[j]) {
- fArrayNew->push((*fSetArray)[i]);
- i++;
- } else if ((*fSetArray)[i] > (*src.fSetArray)[j]) {
- fArrayNew->push((*src.fSetArray)[j]);
- j++;
- } else {
- duplicates++;
- j++; // Skip one of the duplicates.
- }
- }
-
- while (i < fSetArray->count()) {
- fArrayNew->push((*fSetArray)[i]);
- i++;
- }
-
- while (j < src.count()) {
- fArrayNew->push((*src.fSetArray)[j]);
- j++;
- }
- SkDELETE(fSetArray);
- fSetArray = fArrayNew;
- fArrayNew = NULL;
-
-#ifdef SK_DEBUG
- validate();
-#endif
- return duplicates;
- }
-
- /** Adds a new element into set and returns false if the element is already
- * in this set.
- */
- bool add(const T& elem) {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
-
- int pos = 0;
- int i = find(elem, &pos);
- if (i >= 0) {
- return false;
- }
- *fSetArray->insert(pos) = elem;
- fOrderedArray->push(elem);
-#ifdef SK_DEBUG
- validate();
-#endif
- return true;
- }
-
- /** Returns true if this set is empty.
- */
- bool isEmpty() const {
- SkASSERT(fOrderedArray);
- SkASSERT(fSetArray);
- SkASSERT(fSetArray->isEmpty() == fOrderedArray->isEmpty());
- return fOrderedArray->isEmpty();
- }
-
- /** Return the number of elements in the set.
- */
- int count() const {
- SkASSERT(fOrderedArray);
- SkASSERT(fSetArray);
- SkASSERT(fSetArray->count() == fOrderedArray->count());
- return fOrderedArray->count();
- }
-
- /** Return the number of bytes in the set: count * sizeof(T).
- */
- size_t bytes() const {
- SkASSERT(fOrderedArray);
- return fOrderedArray->bytes();
- }
-
- /** Return the beginning of a set iterator.
- * Elements in the iterator will be sorted ascending.
- */
- const T* begin() const {
- SkASSERT(fOrderedArray);
- return fOrderedArray->begin();
- }
-
- /** Return the end of a set iterator.
- */
- const T* end() const {
- SkASSERT(fOrderedArray);
- return fOrderedArray->end();
- }
-
- const T& operator[](int index) const {
- SkASSERT(fOrderedArray);
- return (*fOrderedArray)[index];
- }
-
- /** Resets the set (deletes memory and initiates an empty set).
- */
- void reset() {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
- fSetArray->reset();
- fOrderedArray->reset();
- }
-
- /** Rewinds the set (preserves memory and initiates an empty set).
- */
- void rewind() {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
- fSetArray->rewind();
- fOrderedArray->rewind();
- }
-
- /** Reserves memory for the set.
- */
- void setReserve(int reserve) {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
- fSetArray->setReserve(reserve);
- fOrderedArray->setReserve(reserve);
- }
-
- /** Returns true if the array contains this element.
- */
- bool contains(const T& elem) const {
- SkASSERT(fSetArray);
- return (this->find(elem) >= 0);
- }
-
- /** Copies internal array to destination.
- */
- void copy(T* dst) const {
- SkASSERT(fOrderedArray);
- fOrderedArray->copyRange(dst, 0, fOrderedArray->count());
- }
-
- /** Returns a const reference to the internal vector.
- */
- const SkTDArray<T>& toArray() {
- SkASSERT(fOrderedArray);
- return *fOrderedArray;
- }
-
- /** Unref all elements in the set.
- */
- void unrefAll() {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
- fOrderedArray->unrefAll();
- // Also reset the other array, as SkTDArray::unrefAll does an
- // implcit reset
- fSetArray->reset();
- }
-
- /** safeUnref all elements in the set.
- */
- void safeUnrefAll() {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
- fOrderedArray->safeUnrefAll();
- // Also reset the other array, as SkTDArray::safeUnrefAll does an
- // implcit reset
- fSetArray->reset();
- }
-
-#ifdef SK_DEBUG
- void validate() const {
- SkASSERT(fSetArray);
- SkASSERT(fOrderedArray);
- fSetArray->validate();
- fOrderedArray->validate();
- SkASSERT(isSorted() && !hasDuplicates() && arraysConsistent());
- }
-
- bool hasDuplicates() const {
- for (int i = 0; i < fSetArray->count() - 1; ++i) {
- if ((*fSetArray)[i] == (*fSetArray)[i + 1]) {
- return true;
- }
- }
- return false;
- }
-
- bool isSorted() const {
- for (int i = 0; i < fSetArray->count() - 1; ++i) {
- // Use only < operator
- if (!((*fSetArray)[i] < (*fSetArray)[i + 1])) {
- return false;
- }
- }
- return true;
- }
-
- /** Checks if fSetArray is consistent with fOrderedArray
- */
- bool arraysConsistent() const {
- if (fSetArray->count() != fOrderedArray->count()) {
- return false;
- }
- if (fOrderedArray->count() == 0) {
- return true;
- }
-
- // Copy and sort fOrderedArray, then compare to fSetArray.
- // A O(n log n) algorithm is necessary as O(n^2) will choke some GMs.
- SkAutoMalloc sortedArray(fOrderedArray->bytes());
- T* sortedBase = reinterpret_cast<T*>(sortedArray.get());
- int count = fOrderedArray->count();
- fOrderedArray->copyRange(sortedBase, 0, count);
-
- SkTQSort<T>(sortedBase, sortedBase + count - 1);
-
- for (int i = 0; i < count; ++i) {
- if (sortedBase[i] != (*fSetArray)[i]) {
- return false;
- }
- }
-
- return true;
- }
-#endif
-
-private:
- SkTDArray<T>* fSetArray; // Sorted by pointer address for fast
- // lookup.
- SkTDArray<T>* fOrderedArray; // Sorted by insertion order for
- // deterministic output.
-
- /** Returns the index in fSetArray where an element was found.
- * Returns -1 if the element was not found, and it fills *posToInsertSorted
- * with the index of the place where elem should be inserted to preserve the
- * internal array sorted.
- * If element was found, *posToInsertSorted is undefined.
- */
- int find(const T& elem, int* posToInsertSorted = NULL) const {
- SkASSERT(fSetArray);
-
- if (fSetArray->count() == 0) {
- if (posToInsertSorted) {
- *posToInsertSorted = 0;
- }
- return -1;
- }
- int iMin = 0;
- int iMax = fSetArray->count();
-
- while (iMin < iMax - 1) {
- int iMid = (iMin + iMax) / 2;
- if (elem < (*fSetArray)[iMid]) {
- iMax = iMid;
- } else {
- iMin = iMid;
- }
- }
- if (elem == (*fSetArray)[iMin]) {
- return iMin;
- }
- if (posToInsertSorted) {
- if (elem < (*fSetArray)[iMin]) {
- *posToInsertSorted = iMin;
- } else {
- *posToInsertSorted = iMin + 1;
- }
- }
-
- return -1;
- }
-};
-
-#endif
diff --git a/tests/TSetTest.cpp b/tests/TSetTest.cpp
deleted file mode 100644
index 3f826480ad..0000000000
--- a/tests/TSetTest.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkTSet.h"
-#include "Test.h"
-
-// Tests the SkTSet<T> class template.
-// Functions that just call SkTDArray are not tested.
-
-static void TestTSet_basic(skiatest::Reporter* reporter) {
- SkTSet<int> set0;
- REPORTER_ASSERT(reporter, set0.isEmpty());
- REPORTER_ASSERT(reporter, !set0.contains(-1));
- REPORTER_ASSERT(reporter, !set0.contains(0));
- REPORTER_ASSERT(reporter, !set0.contains(1));
- REPORTER_ASSERT(reporter, set0.count() == 0);
-
- REPORTER_ASSERT(reporter, set0.add(0));
- REPORTER_ASSERT(reporter, !set0.isEmpty());
- REPORTER_ASSERT(reporter, !set0.contains(-1));
- REPORTER_ASSERT(reporter, set0.contains(0));
- REPORTER_ASSERT(reporter, !set0.contains(1));
- REPORTER_ASSERT(reporter, set0.count() == 1);
- REPORTER_ASSERT(reporter, !set0.add(0));
- REPORTER_ASSERT(reporter, set0.count() == 1);
-
-#ifdef SK_DEBUG
- set0.validate();
-#endif
-}
-
-#define COUNT 1732
-#define PRIME1 10007
-#define PRIME2 1733
-
-// Generates a series of positive unique pseudo-random numbers.
-static int f(int i) {
- return (long(i) * PRIME1) % PRIME2;
-}
-
-// Will expose contains() too.
-static void TestTSet_advanced(skiatest::Reporter* reporter) {
- SkTSet<int> set0;
-
- for (int i = 0; i < COUNT; i++) {
- REPORTER_ASSERT(reporter, !set0.contains(f(i)));
- if (i > 0) {
- REPORTER_ASSERT(reporter, set0.contains(f(0)));
- REPORTER_ASSERT(reporter, set0.contains(f(i / 2)));
- REPORTER_ASSERT(reporter, set0.contains(f(i - 1)));
- }
- REPORTER_ASSERT(reporter, !set0.contains(f(i)));
- REPORTER_ASSERT(reporter, set0.count() == i);
- REPORTER_ASSERT(reporter, set0.add(f(i)));
- REPORTER_ASSERT(reporter, set0.contains(f(i)));
- REPORTER_ASSERT(reporter, set0.count() == i + 1);
- REPORTER_ASSERT(reporter, !set0.add(f(i)));
- }
-
- // Test deterministic output
- for (int i = 0; i < COUNT; i++) {
- REPORTER_ASSERT(reporter, set0[i] == f(i));
- }
-
- // Test copy constructor too.
- SkTSet<int> set1 = set0;
-
- REPORTER_ASSERT(reporter, set0.count() == set1.count());
- REPORTER_ASSERT(reporter, !set1.contains(-1000));
-
- for (int i = 0; i < COUNT; i++) {
- REPORTER_ASSERT(reporter, set1.contains(f(i)));
- REPORTER_ASSERT(reporter, set1[i] == f(i));
- }
-
- // Test operator= too.
- SkTSet<int> set2;
- set2 = set0;
-
- REPORTER_ASSERT(reporter, set0.count() == set2.count());
- REPORTER_ASSERT(reporter, !set2.contains(-1000));
-
- for (int i = 0; i < COUNT; i++) {
- REPORTER_ASSERT(reporter, set2.contains(f(i)));
- REPORTER_ASSERT(reporter, set2[i] == f(i));
- }
-
-#ifdef SK_DEBUG
- set0.validate();
- set1.validate();
- set2.validate();
-#endif
-}
-
-static void TestTSet_merge(skiatest::Reporter* reporter) {
- SkTSet<int> set;
- SkTSet<int> setOdd;
-
- for (int i = 0; i < COUNT; i++) {
- REPORTER_ASSERT(reporter, set.add(2 * i));
- REPORTER_ASSERT(reporter, setOdd.add(2 * i + 1));
- }
- // mergeInto returns the number of duplicates. Expected 0.
- REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == 0);
- REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);
-
- // mergeInto should now find all new numbers duplicate.
- REPORTER_ASSERT(reporter, set.mergeInto(setOdd) == setOdd.count());
- REPORTER_ASSERT(reporter, set.count() == 2 * COUNT);
-
- for (int i = 0; i < 2 * COUNT; i++) {
- REPORTER_ASSERT(reporter, set.contains(i));
- }
-
- // check deterministic output
- for (int i = 0; i < COUNT; i++) {
- REPORTER_ASSERT(reporter, set[i] == 2 * i);
- REPORTER_ASSERT(reporter, set[COUNT + i] == 2 * i + 1);
- }
-
-#ifdef SK_DEBUG
- set.validate();
- setOdd.validate();
-#endif
-}
-
-DEF_TEST(TSet, reporter) {
- TestTSet_basic(reporter);
- TestTSet_advanced(reporter);
- TestTSet_merge(reporter);
-}