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
diff --git a/gyp/pdf.gypi b/gyp/pdf.gypi
index 9d406df..9de60a6 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 14ad99f..049b4b2 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 ae0386a..fcbba38 100644
--- a/src/doc/SkDocument_PDF.cpp
+++ b/src/doc/SkDocument_PDF.cpp
@@ -211,19 +211,14 @@
     // 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 486dac4..765016d 100644
--- a/src/pdf/SkPDFBitmap.cpp
+++ b/src/pdf/SkPDFBitmap.cpp
@@ -286,11 +286,10 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-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 02a79df..c1ada1a 100644
--- a/src/pdf/SkPDFBitmap.h
+++ b/src/pdf/SkPDFBitmap.h
@@ -28,8 +28,7 @@
     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 ab5d510..4069cc9 100644
--- a/src/pdf/SkPDFCatalog.cpp
+++ b/src/pdf/SkPDFCatalog.cpp
@@ -21,6 +21,7 @@
         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 54d08c5..3609f3c 100644
--- a/src/pdf/SkPDFCatalog.h
+++ b/src/pdf/SkPDFCatalog.h
@@ -45,7 +45,10 @@
      */
     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 551d20b..2217371 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 8bb1936..02c5573 100644
--- a/src/pdf/SkPDFTypes.cpp
+++ b/src/pdf/SkPDFTypes.cpp
@@ -31,12 +31,11 @@
     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 @@
     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 @@
     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 7a72a38..3bc6065 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 @@
     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 @@
 
     // 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 @@
 
     // 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 @@
 
     // 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 f57d30e..0000000
--- 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 3f82648..0000000
--- 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);
-}