Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: include/core/SkTInternalLList.h

Issue 1712563004: Move SkTInternalLList.h to src/core. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gyp/core.gypi ('k') | src/core/SkTInternalLList.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « gyp/core.gypi ('k') | src/core/SkTInternalLList.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698