diff options
Diffstat (limited to 'chromium/third_party/skia/src/gpu/GrRedBlackTree.h')
-rw-r--r-- | chromium/third_party/skia/src/gpu/GrRedBlackTree.h | 181 |
1 files changed, 7 insertions, 174 deletions
diff --git a/chromium/third_party/skia/src/gpu/GrRedBlackTree.h b/chromium/third_party/skia/src/gpu/GrRedBlackTree.h index 1b2195c4f7e..d9b1a049bd8 100644 --- a/chromium/third_party/skia/src/gpu/GrRedBlackTree.h +++ b/chromium/third_party/skia/src/gpu/GrRedBlackTree.h @@ -8,6 +8,7 @@ #ifndef GrRedBlackTree_DEFINED #define GrRedBlackTree_DEFINED +#include "GrConfig.h" #include "SkTypes.h" template <typename T> @@ -22,6 +23,11 @@ public: bool operator()(const T* a, const T* b) const { return *a < *b; } }; +class GrStrLess { +public: + bool operator()(const char* a, const char* b) const { return strcmp(a,b) < 0; } +}; + /** * In debug build this will cause full traversals of the tree when the validate * is called on insert and remove. Useful for debugging but very slow. @@ -34,7 +40,7 @@ public: * will be created and used for all comparisons. */ template <typename T, typename C = GrLess<T> > -class GrRedBlackTree : public SkNoncopyable { +class GrRedBlackTree : SkNoncopyable { public: /** * Creates an empty tree. @@ -124,8 +130,6 @@ public: */ void remove(const Iter& iter) { deleteAtNode(iter.fN); } - static void UnitTest(); - private: enum Color { kRed_Color, @@ -941,175 +945,4 @@ bool GrRedBlackTree<T,C>::validateChildRelations(const Node* n, } #endif -#include "SkRandom.h" - -template <typename T, typename C> -void GrRedBlackTree<T,C>::UnitTest() { - GrRedBlackTree<int> tree; - - SkRandom r; - - int count[100] = {0}; - // add 10K ints - for (int i = 0; i < 10000; ++i) { - int x = r.nextU()%100; - SkDEBUGCODE(Iter xi = ) tree.insert(x); - SkASSERT(*xi == x); - ++count[x]; - } - - tree.insert(0); - ++count[0]; - tree.insert(99); - ++count[99]; - SkASSERT(*tree.begin() == 0); - SkASSERT(*tree.last() == 99); - SkASSERT(--(++tree.begin()) == tree.begin()); - SkASSERT(--tree.end() == tree.last()); - SkASSERT(tree.count() == 10002); - - int c = 0; - // check that we iterate through the correct number of - // elements and they are properly sorted. - for (Iter a = tree.begin(); tree.end() != a; ++a) { - Iter b = a; - ++b; - ++c; - SkASSERT(b == tree.end() || *a <= *b); - } - SkASSERT(c == tree.count()); - - // check that the tree reports the correct number of each int - // and that we can iterate through them correctly both forward - // and backward. - for (int i = 0; i < 100; ++i) { - int c; - c = tree.countOf(i); - SkASSERT(c == count[i]); - c = 0; - Iter iter = tree.findFirst(i); - while (iter != tree.end() && *iter == i) { - ++c; - ++iter; - } - SkASSERT(count[i] == c); - c = 0; - iter = tree.findLast(i); - if (iter != tree.end()) { - do { - if (*iter == i) { - ++c; - } else { - break; - } - if (iter != tree.begin()) { - --iter; - } else { - break; - } - } while (true); - } - SkASSERT(c == count[i]); - } - // remove all the ints between 25 and 74. Randomly chose to remove - // the first, last, or any entry for each. - for (int i = 25; i < 75; ++i) { - while (0 != tree.countOf(i)) { - --count[i]; - int x = r.nextU() % 3; - Iter iter; - switch (x) { - case 0: - iter = tree.findFirst(i); - break; - case 1: - iter = tree.findLast(i); - break; - case 2: - default: - iter = tree.find(i); - break; - } - tree.remove(iter); - } - SkASSERT(0 == count[i]); - SkASSERT(tree.findFirst(i) == tree.end()); - SkASSERT(tree.findLast(i) == tree.end()); - SkASSERT(tree.find(i) == tree.end()); - } - // remove all of the 0 entries. (tests removing begin()) - SkASSERT(*tree.begin() == 0); - SkASSERT(*(--tree.end()) == 99); - while (0 != tree.countOf(0)) { - --count[0]; - tree.remove(tree.find(0)); - } - SkASSERT(0 == count[0]); - SkASSERT(tree.findFirst(0) == tree.end()); - SkASSERT(tree.findLast(0) == tree.end()); - SkASSERT(tree.find(0) == tree.end()); - SkASSERT(0 < *tree.begin()); - - // remove all the 99 entries (tests removing last()). - while (0 != tree.countOf(99)) { - --count[99]; - tree.remove(tree.find(99)); - } - SkASSERT(0 == count[99]); - SkASSERT(tree.findFirst(99) == tree.end()); - SkASSERT(tree.findLast(99) == tree.end()); - SkASSERT(tree.find(99) == tree.end()); - SkASSERT(99 > *(--tree.end())); - SkASSERT(tree.last() == --tree.end()); - - // Make sure iteration still goes through correct number of entries - // and is still sorted correctly. - c = 0; - for (Iter a = tree.begin(); tree.end() != a; ++a) { - Iter b = a; - ++b; - ++c; - SkASSERT(b == tree.end() || *a <= *b); - } - SkASSERT(c == tree.count()); - - // repeat check that correct number of each entry is in the tree - // and iterates correctly both forward and backward. - for (int i = 0; i < 100; ++i) { - SkASSERT(tree.countOf(i) == count[i]); - int c = 0; - Iter iter = tree.findFirst(i); - while (iter != tree.end() && *iter == i) { - ++c; - ++iter; - } - SkASSERT(count[i] == c); - c = 0; - iter = tree.findLast(i); - if (iter != tree.end()) { - do { - if (*iter == i) { - ++c; - } else { - break; - } - if (iter != tree.begin()) { - --iter; - } else { - break; - } - } while (true); - } - SkASSERT(count[i] == c); - } - - // remove all entries - while (!tree.empty()) { - tree.remove(tree.begin()); - } - - // test reset on empty tree. - tree.reset(); -} - #endif |