diff options
author | 2015-03-25 13:23:13 -0700 | |
---|---|---|
committer | 2015-03-25 13:23:13 -0700 | |
commit | d4714af018158c15e13439bef2c9b5bafc25c1d7 (patch) | |
tree | c3161b2001d9e2bdd2e378f3690c0bc3c1e20261 | |
parent | b3e5e4d314301617d2d48b7589dfd426bd68a671 (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.gypi | 1 | ||||
-rw-r--r-- | gyp/tests.gypi | 1 | ||||
-rw-r--r-- | src/doc/SkDocument_PDF.cpp | 13 | ||||
-rw-r--r-- | src/pdf/SkPDFBitmap.cpp | 7 | ||||
-rw-r--r-- | src/pdf/SkPDFBitmap.h | 3 | ||||
-rw-r--r-- | src/pdf/SkPDFCatalog.cpp | 1 | ||||
-rw-r--r-- | src/pdf/SkPDFCatalog.h | 3 | ||||
-rw-r--r-- | src/pdf/SkPDFResourceDict.h | 1 | ||||
-rw-r--r-- | src/pdf/SkPDFTypes.cpp | 21 | ||||
-rw-r--r-- | src/pdf/SkPDFTypes.h | 17 | ||||
-rw-r--r-- | src/pdf/SkTSet.h | 356 | ||||
-rw-r--r-- | tests/TSetTest.cpp | 135 |
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); -} |