| Index: include/core/SkTInternalLList.h
|
| diff --git a/include/core/SkTInternalLList.h b/include/core/SkTInternalLList.h
|
| deleted file mode 100644
|
| index 1aa1a12209884f27b8e907506f7e85e5053a9c0e..0000000000000000000000000000000000000000
|
| --- a/include/core/SkTInternalLList.h
|
| +++ /dev/null
|
| @@ -1,272 +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 SkTInternalLList_DEFINED
|
| -#define SkTInternalLList_DEFINED
|
| -
|
| -#include "SkTypes.h"
|
| -
|
| -/**
|
| - * Helper class to automatically initialize the doubly linked list created pointers.
|
| - */
|
| -template <typename T> class SkPtrWrapper {
|
| - public:
|
| - SkPtrWrapper() : fPtr(NULL) {}
|
| - SkPtrWrapper& operator =(T* ptr) { fPtr = ptr; return *this; }
|
| - operator T*() const { return fPtr; }
|
| - T* operator->() { return fPtr; }
|
| - private:
|
| - T* fPtr;
|
| -};
|
| -
|
| -
|
| -/**
|
| - * 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_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 SkTInternalLList : SkNoncopyable {
|
| -public:
|
| - SkTInternalLList()
|
| - : fHead(NULL)
|
| - , fTail(NULL) {
|
| - }
|
| -
|
| - void remove(T* entry) {
|
| - SkASSERT(fHead && fTail);
|
| - SkASSERT(this->isInList(entry));
|
| -
|
| - T* prev = entry->fPrev;
|
| - T* next = entry->fNext;
|
| -
|
| - if (prev) {
|
| - prev->fNext = next;
|
| - } else {
|
| - fHead = next;
|
| - }
|
| - if (next) {
|
| - next->fPrev = prev;
|
| - } else {
|
| - fTail = prev;
|
| - }
|
| -
|
| - entry->fPrev = NULL;
|
| - entry->fNext = NULL;
|
| -
|
| -#ifdef SK_DEBUG
|
| - entry->fList = NULL;
|
| -#endif
|
| - }
|
| -
|
| - void addToHead(T* entry) {
|
| - SkASSERT(NULL == entry->fPrev && NULL == entry->fNext);
|
| - SkASSERT(NULL == entry->fList);
|
| -
|
| - entry->fPrev = NULL;
|
| - entry->fNext = fHead;
|
| - if (fHead) {
|
| - fHead->fPrev = entry;
|
| - }
|
| - fHead = entry;
|
| - if (NULL == fTail) {
|
| - fTail = entry;
|
| - }
|
| -
|
| -#ifdef SK_DEBUG
|
| - entry->fList = this;
|
| -#endif
|
| - }
|
| -
|
| - void addToTail(T* entry) {
|
| - SkASSERT(NULL == entry->fPrev && NULL == entry->fNext);
|
| - SkASSERT(NULL == entry->fList);
|
| -
|
| - entry->fPrev = fTail;
|
| - entry->fNext = NULL;
|
| - if (fTail) {
|
| - fTail->fNext = entry;
|
| - }
|
| - fTail = entry;
|
| - if (NULL == fHead) {
|
| - fHead = entry;
|
| - }
|
| -
|
| -#ifdef SK_DEBUG
|
| - entry->fList = this;
|
| -#endif
|
| - }
|
| -
|
| - /**
|
| - * Inserts a new list entry before an existing list entry. The new entry must not already be
|
| - * a member of this or any other list. If existingEntry is NULL then the new entry is added
|
| - * at the tail.
|
| - */
|
| - void addBefore(T* newEntry, T* existingEntry) {
|
| - SkASSERT(newEntry);
|
| -
|
| - if (NULL == existingEntry) {
|
| - this->addToTail(newEntry);
|
| - return;
|
| - }
|
| -
|
| - SkASSERT(this->isInList(existingEntry));
|
| - newEntry->fNext = existingEntry;
|
| - T* prev = existingEntry->fPrev;
|
| - existingEntry->fPrev = newEntry;
|
| - newEntry->fPrev = prev;
|
| - if (NULL == prev) {
|
| - SkASSERT(fHead == existingEntry);
|
| - fHead = newEntry;
|
| - } else {
|
| - prev->fNext = newEntry;
|
| - }
|
| -#ifdef SK_DEBUG
|
| - newEntry->fList = this;
|
| -#endif
|
| - }
|
| -
|
| - /**
|
| - * Inserts a new list entry after an existing list entry. The new entry must not already be
|
| - * a member of this or any other list. If existingEntry is NULL then the new entry is added
|
| - * at the head.
|
| - */
|
| - void addAfter(T* newEntry, T* existingEntry) {
|
| - SkASSERT(newEntry);
|
| -
|
| - if (NULL == existingEntry) {
|
| - this->addToHead(newEntry);
|
| - return;
|
| - }
|
| -
|
| - SkASSERT(this->isInList(existingEntry));
|
| - newEntry->fPrev = existingEntry;
|
| - T* next = existingEntry->fNext;
|
| - existingEntry->fNext = newEntry;
|
| - newEntry->fNext = next;
|
| - if (NULL == next) {
|
| - SkASSERT(fTail == existingEntry);
|
| - fTail = newEntry;
|
| - } else {
|
| - next->fPrev = newEntry;
|
| - }
|
| -#ifdef SK_DEBUG
|
| - newEntry->fList = this;
|
| -#endif
|
| - }
|
| -
|
| - bool isEmpty() const {
|
| - return NULL == fHead && NULL == fTail;
|
| - }
|
| -
|
| - T* head() { return fHead; }
|
| - T* tail() { return fTail; }
|
| -
|
| - class Iter {
|
| - public:
|
| - enum IterStart {
|
| - kHead_IterStart,
|
| - kTail_IterStart
|
| - };
|
| -
|
| - Iter() : fCurr(NULL) {}
|
| - Iter(const Iter& iter) : fCurr(iter.fCurr) {}
|
| - Iter& operator= (const Iter& iter) { fCurr = iter.fCurr; return *this; }
|
| -
|
| - T* init(const SkTInternalLList& list, IterStart startLoc) {
|
| - if (kHead_IterStart == startLoc) {
|
| - fCurr = list.fHead;
|
| - } else {
|
| - SkASSERT(kTail_IterStart == startLoc);
|
| - fCurr = list.fTail;
|
| - }
|
| -
|
| - return fCurr;
|
| - }
|
| -
|
| - T* get() { return fCurr; }
|
| -
|
| - /**
|
| - * Return the next/previous element in the list or NULL if at the end.
|
| - */
|
| - T* next() {
|
| - if (NULL == fCurr) {
|
| - return NULL;
|
| - }
|
| -
|
| - fCurr = fCurr->fNext;
|
| - return fCurr;
|
| - }
|
| -
|
| - T* prev() {
|
| - if (NULL == fCurr) {
|
| - return NULL;
|
| - }
|
| -
|
| - fCurr = fCurr->fPrev;
|
| - return fCurr;
|
| - }
|
| -
|
| - private:
|
| - T* fCurr;
|
| - };
|
| -
|
| -#ifdef SK_DEBUG
|
| - void validate() const {
|
| - SkASSERT(!fHead == !fTail);
|
| - Iter iter;
|
| - for (T* item = iter.init(*this, Iter::kHead_IterStart); item; item = iter.next()) {
|
| - SkASSERT(this->isInList(item));
|
| - if (NULL == item->fPrev) {
|
| - SkASSERT(fHead == item);
|
| - } else {
|
| - SkASSERT(item->fPrev->fNext == item);
|
| - }
|
| - if (NULL == item->fNext) {
|
| - SkASSERT(fTail == item);
|
| - } else {
|
| - SkASSERT(item->fNext->fPrev == item);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * 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;
|
| - }
|
| -
|
| - /**
|
| - * Debugging-only method that laboriously counts the list entries.
|
| - */
|
| - int countEntries() const {
|
| - int count = 0;
|
| - for (T* entry = fHead; entry; entry = entry->fNext) {
|
| - ++count;
|
| - }
|
| - return count;
|
| - }
|
| -#endif // SK_DEBUG
|
| -
|
| -private:
|
| - T* fHead;
|
| - T* fTail;
|
| -
|
| - typedef SkNoncopyable INHERITED;
|
| -};
|
| -
|
| -#endif
|
|
|