Rename SkTDLinkedList to SkTInternalLinked list, add some methods useful for forthcoming SkTLList.
Review URL: https://codereview.appspot.com/6858101

git-svn-id: http://skia.googlecode.com/svn/trunk@6643 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gyp/core.gypi b/gyp/core.gypi
index 6251ce6..960af33 100644
--- a/gyp/core.gypi
+++ b/gyp/core.gypi
@@ -253,7 +253,7 @@
         '<(skia_include_path)/core/SkTDArray.h',
         '<(skia_include_path)/core/SkTDStack.h',
         '<(skia_include_path)/core/SkTDict.h',
-        '<(skia_include_path)/core/SkTDLinkedList.h',
+        '<(skia_include_path)/core/SkTInternalLList.h',
         '<(skia_include_path)/core/SkTRegistry.h',
         '<(skia_include_path)/core/SkTScopedPtr.h',
         '<(skia_include_path)/core/SkTSearch.h',
diff --git a/include/core/SkTDLinkedList.h b/include/core/SkTInternalLList.h
similarity index 64%
rename from include/core/SkTDLinkedList.h
rename to include/core/SkTInternalLList.h
index 9247812..32245b5 100644
--- a/include/core/SkTDLinkedList.h
+++ b/include/core/SkTInternalLList.h
@@ -5,14 +5,13 @@
  * found in the LICENSE file.
  */
 
-#ifndef SkTDLinkedList_DEFINED
-#define SkTDLinkedList_DEFINED
+#ifndef SkTInternalLList_DEFINED
+#define SkTInternalLList_DEFINED
 
 #include "SkTypes.h"
 
 /**
- * Helper class to automatically initialize the doubly linked list
- * created pointers.
+ * Helper class to automatically initialize the doubly linked list created pointers.
  */
 template <typename T> class SkPtrWrapper {
   public:
@@ -26,23 +25,22 @@
 
 
 /**
- * This macro creates the member variables required by
- * the SkTDLinkedList class. It should be placed in the private section
- * of any class that will be stored in a double linked list.
+ * This macro creates the member variables required by the SkTInternalLList class. It should be
+ * placed in the private section of any class that will be stored in a double linked list.
  */
-#define SK_DEFINE_DLINKEDLIST_INTERFACE(ClassName)              \
-    friend class SkTDLinkedList<ClassName>;                     \
-    /* back pointer to the owning list - for debugging */       \
-    SkDEBUGCODE(SkPtrWrapper<SkTDLinkedList<ClassName> > fList;)\
-    SkPtrWrapper<ClassName> fPrev;                              \
-    SkPtrWrapper<ClassName> fNext;
+#define SK_DECLARE_INTERNAL_LLIST_INTERFACE(ClassName)              \
+    friend class SkTInternalLList<ClassName>;                       \
+    /* back pointer to the owning list - for debugging */           \
+    SkDEBUGCODE(SkPtrWrapper<SkTInternalLList<ClassName> > fList;)  \
+    SkPtrWrapper<ClassName> fPrev;                                  \
+    SkPtrWrapper<ClassName> fNext
 
 /**
  * This class implements a templated internal doubly linked list data structure.
  */
-template <class T> class SkTDLinkedList : public SkNoncopyable {
+template <class T> class SkTInternalLList : public SkNoncopyable {
 public:
-    SkTDLinkedList()
+    SkTInternalLList()
         : fHead(NULL)
         , fTail(NULL) {
     }
@@ -92,6 +90,25 @@
 #endif
     }
 
+    void addToTail(T* entry) {
+        SkASSERT(NULL == entry->fPrev && NULL == entry->fNext);
+        SkASSERT(NULL == entry->fList);
+
+        entry->fPrev = fTail;
+        entry->fNext = NULL;
+        if (NULL != fTail) {
+            fTail->fNext = entry;
+        }
+        fTail = entry;
+        if (NULL == fHead) {
+            fHead = entry;
+        }
+
+#ifdef SK_DEBUG
+        entry->fList = this;
+#endif
+    }
+
     bool isEmpty() const {
         return NULL == fHead && NULL == fTail;
     }
@@ -106,52 +123,56 @@
             kTail_IterStart
         };
 
-        Iter() : fCur(NULL) {}
+        Iter() : fCurr(NULL) {}
+        Iter(const Iter& iter) : fCurr(iter.fCurr) {}
+        Iter& operator= (const Iter& iter) { fCurr = iter.fCurr; return *this; }
 
-        T* init(SkTDLinkedList& list, IterStart startLoc) {
+        T* init(const SkTInternalLList& list, IterStart startLoc) {
             if (kHead_IterStart == startLoc) {
-                fCur = list.fHead;
+                fCurr = list.fHead;
             } else {
                 SkASSERT(kTail_IterStart == startLoc);
-                fCur = list.fTail;
+                fCurr = list.fTail;
             }
 
-            return fCur;
+            return fCurr;
         }
 
+        T* get() { return fCurr; }
+
         /**
          * Return the next/previous element in the list or NULL if at the end.
          */
         T* next() {
-            if (NULL == fCur) {
+            if (NULL == fCurr) {
                 return NULL;
             }
 
-            fCur = fCur->fNext;
-            return fCur;
+            fCurr = fCurr->fNext;
+            return fCurr;
         }
 
         T* prev() {
-            if (NULL == fCur) {
+            if (NULL == fCurr) {
                 return NULL;
             }
 
-            fCur = fCur->fPrev;
-            return fCur;
+            fCurr = fCurr->fPrev;
+            return fCurr;
         }
 
     private:
-        T* fCur;
+        T* fCurr;
     };
 
 #ifdef SK_DEBUG
     void validate() const {
-        GrAssert(!fHead == !fTail);
+        SkASSERT(!fHead == !fTail);
     }
 
     /**
-     * Debugging-only method that uses the list back pointer to check if
-     * 'entry' is indeed in 'this' list.
+     * Debugging-only method that uses the list back pointer to check if 'entry' is indeed in 'this'
+     * list.
      */
     bool isInList(const T* entry) const {
         return entry->fList == this;
@@ -176,4 +197,4 @@
     typedef SkNoncopyable INHERITED;
 };
 
-#endif // SkTDLinkedList_DEFINED
+#endif
diff --git a/include/gpu/GrResource.h b/include/gpu/GrResource.h
index aeab180..3c306f8 100644
--- a/include/gpu/GrResource.h
+++ b/include/gpu/GrResource.h
@@ -12,7 +12,7 @@
 
 #include "GrRefCnt.h"
 
-#include "SkTDLinkedList.h"
+#include "SkTInternalLList.h"
 
 class GrGpu;
 class GrContext;
@@ -93,8 +93,8 @@
                             // release() on all such resources in its
                             // destructor.
 
-    // we're a dlinklist
-    SK_DEFINE_DLINKEDLIST_INTERFACE(GrResource);
+    // We're in an internal doubly linked list
+    SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrResource);
 
     GrResourceEntry* fCacheEntry;  // NULL if not in cache
 
diff --git a/include/utils/SkThreadPool.h b/include/utils/SkThreadPool.h
index a96f87b..cc45fc2 100644
--- a/include/utils/SkThreadPool.h
+++ b/include/utils/SkThreadPool.h
@@ -10,7 +10,7 @@
 
 #include "SkCondVar.h"
 #include "SkTDArray.h"
-#include "SkTDLinkedList.h"
+#include "SkTInternalLList.h"
 
 class SkRunnable;
 class SkThread;
@@ -36,13 +36,13 @@
         SkRunnable* fRunnable;
 
     private:
-        SK_DEFINE_DLINKEDLIST_INTERFACE(LinkedRunnable)
+        SK_DECLARE_INTERNAL_LLIST_INTERFACE(LinkedRunnable);
     };
 
-    SkTDLinkedList<LinkedRunnable> fQueue;
-    SkCondVar                      fReady;
-    SkTDArray<SkThread*>           fThreads;
-    bool                           fDone;
+    SkTInternalLList<LinkedRunnable>    fQueue;
+    SkCondVar                           fReady;
+    SkTDArray<SkThread*>                fThreads;
+    bool                            fDone;
 
     static void Loop(void*);  // Static because we pass in this.
 };
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index a4ed0ed..f9fd779 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -553,7 +553,7 @@
 
     bool                        fContextIsDirty;
 
-    typedef SkTDLinkedList<GrResource> ResourceList;
+    typedef SkTInternalLList<GrResource> ResourceList;
     ResourceList                fResourceList;
 
     // Given a rt, find or create a stencil buffer and attach it
diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h
index c56edf6..2541930 100644
--- a/src/gpu/GrResourceCache.h
+++ b/src/gpu/GrResourceCache.h
@@ -14,7 +14,7 @@
 #include "GrConfig.h"
 #include "GrTypes.h"
 #include "GrTHashCache.h"
-#include "SkTDLinkedList.h"
+#include "SkTInternalLList.h"
 
 class GrResource;
 
@@ -159,8 +159,8 @@
     GrResourceKey    fKey;
     GrResource*      fResource;
 
-    // we're a dlinklist
-    SK_DEFINE_DLINKEDLIST_INTERFACE(GrResourceEntry);
+    // we're a linked list
+    SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrResourceEntry);
 
     friend class GrResourceCache;
     friend class GrDLinkedList;
@@ -312,8 +312,8 @@
     class Key;
     GrTHashTable<GrResourceEntry, Key, 8> fCache;
 
-    // manage the dlink list
-    typedef SkTDLinkedList<GrResourceEntry> EntryList;
+    // We're an internal doubly linked list
+    typedef SkTInternalLList<GrResourceEntry> EntryList;
     EntryList    fList;
 
 #if GR_DEBUG
@@ -342,7 +342,7 @@
     bool fPurging;
 
 #if GR_DEBUG
-    static size_t countBytes(const SkTDLinkedList<GrResourceEntry>& list);
+    static size_t countBytes(const SkTInternalLList<GrResourceEntry>& list);
 #endif
 };
 
diff --git a/tests/TDLinkedListTest.cpp b/tests/TDLinkedListTest.cpp
index 8df39b8..b4ea0b7 100644
--- a/tests/TDLinkedListTest.cpp
+++ b/tests/TDLinkedListTest.cpp
@@ -6,7 +6,7 @@
  */
 
 #include "Test.h"
-#include "SkTDLinkedList.h"
+#include "SkTInternalLList.h"
 
 class ListElement {
 public:
@@ -16,10 +16,10 @@
     int fID;
 
 private:
-    SK_DEFINE_DLINKEDLIST_INTERFACE(ListElement);
+    SK_DECLARE_INTERNAL_LLIST_INTERFACE(ListElement);
 };
 
-static void CheckList(const SkTDLinkedList<ListElement>& list,
+static void CheckList(const SkTInternalLList<ListElement>& list,
                       skiatest::Reporter* reporter,
                       bool empty,
                       int numElements,
@@ -37,7 +37,7 @@
 }
 
 static void TestTDLinkedList(skiatest::Reporter* reporter) {
-    SkTDLinkedList<ListElement> list;
+    SkTInternalLList<ListElement> list;
     ListElement elements[4] = {
         ListElement(0),
         ListElement(1),
@@ -59,14 +59,15 @@
     CheckList(list, reporter, false, 4, true, true, true, true, elements);
 
     // test out iterators
-    SkTDLinkedList<ListElement>::Iter iter;
+    typedef SkTInternalLList<ListElement>::Iter Iter;
+    Iter iter;
 
-    ListElement* cur = iter.init(list, SkTDLinkedList<ListElement>::Iter::kHead_IterStart);
+    ListElement* cur = iter.init(list, Iter::kHead_IterStart);
     for (int i = 0; NULL != cur; ++i, cur = iter.next()) {
         REPORTER_ASSERT(reporter, cur->fID == 3-i);
     }
 
-    cur = iter.init(list, SkTDLinkedList<ListElement>::Iter::kTail_IterStart);
+    cur = iter.init(list, Iter::kTail_IterStart);
     for (int i = 0; NULL != cur; ++i, cur = iter.prev()) {
         REPORTER_ASSERT(reporter, cur->fID == i);
     }