| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright 2012 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 | |
| 8 #include "Test.h" | |
| 9 | |
| 10 // This is a GR test | |
| 11 #if SK_SUPPORT_GPU | |
| 12 #include "GrTHashTable.h" | |
| 13 | |
| 14 struct HashElement { | |
| 15 int fKey; | |
| 16 int fValue; | |
| 17 }; | |
| 18 | |
| 19 class GrFindPositivesFunctor { | |
| 20 public: | |
| 21 // only return elements with positive values | |
| 22 bool operator()(const HashElement* elem) const { | |
| 23 return elem->fValue > 0; | |
| 24 } | |
| 25 }; | |
| 26 | |
| 27 class GrFindNegativesFunctor { | |
| 28 public: | |
| 29 // only return elements with negative values | |
| 30 bool operator()(const HashElement* elem) const { | |
| 31 return elem->fValue < 0; | |
| 32 } | |
| 33 }; | |
| 34 | |
| 35 class HashKey { | |
| 36 public: | |
| 37 HashKey(int key) : fKey(key) {} | |
| 38 | |
| 39 uint32_t getHash() const { return fKey; } | |
| 40 | |
| 41 static bool LessThan(const HashElement& entry, const HashKey& key) { | |
| 42 return entry.fKey < key.fKey; | |
| 43 } | |
| 44 static bool Equals(const HashElement& entry, const HashKey& key) { | |
| 45 return entry.fKey == key.fKey; | |
| 46 } | |
| 47 | |
| 48 #ifdef SK_DEBUG | |
| 49 static bool LessThan(const HashElement& a, const HashElement& b) { | |
| 50 return a.fKey < b.fKey; | |
| 51 } | |
| 52 static bool Equals(const HashElement& a, const HashElement& b) { | |
| 53 return a.fKey == b.fKey; | |
| 54 } | |
| 55 #endif | |
| 56 | |
| 57 protected: | |
| 58 int fKey; | |
| 59 }; | |
| 60 | |
| 61 DEF_TEST(HashCache, reporter) { | |
| 62 GrTHashTable<HashElement, HashKey, 4> cache; | |
| 63 | |
| 64 HashElement negHashElements[10] = { | |
| 65 { 0, 0 }, | |
| 66 { 1, -1 }, | |
| 67 { 2, -2 }, | |
| 68 { 3, -3 }, | |
| 69 { 4, -4 }, | |
| 70 { 5, -5 }, | |
| 71 { 6, -6 }, | |
| 72 { 7, -7 }, | |
| 73 { 8, -8 }, | |
| 74 { 9, -9 } | |
| 75 }; | |
| 76 HashElement posHashElements[10] = { | |
| 77 { 0, 0 }, | |
| 78 { 1, 1 }, | |
| 79 { 2, 2 }, | |
| 80 { 3, 3 }, | |
| 81 { 4, 4 }, | |
| 82 { 5, 5 }, | |
| 83 { 6, 6 }, | |
| 84 { 7, 7 }, | |
| 85 { 8, 8 }, | |
| 86 { 9, 9 } | |
| 87 }; | |
| 88 | |
| 89 // add i: -i pairs | |
| 90 for (int i = 0; i < 10; ++i) { | |
| 91 cache.insert(HashKey(i), &negHashElements[i]); | |
| 92 } | |
| 93 | |
| 94 REPORTER_ASSERT(reporter, 10 == cache.count()); | |
| 95 | |
| 96 // look for all i's and assert we found the -i's | |
| 97 for (int i = 0; i < 10; ++i) { | |
| 98 HashElement* found = cache.find(i); | |
| 99 REPORTER_ASSERT(reporter, NULL != found && -i == found->fValue); | |
| 100 } | |
| 101 | |
| 102 // look for something not in the cache | |
| 103 { | |
| 104 HashElement* found = cache.find(10); | |
| 105 REPORTER_ASSERT(reporter, NULL == found); | |
| 106 } | |
| 107 | |
| 108 // add i:i duplicates (so each i will have a positive & negative entry) | |
| 109 for (int i = 0; i < 10; ++i) { | |
| 110 cache.insert(i, &posHashElements[i]); | |
| 111 } | |
| 112 | |
| 113 REPORTER_ASSERT(reporter, 20 == cache.count()); | |
| 114 | |
| 115 // test out the find functor to find all the positive values | |
| 116 { | |
| 117 GrFindPositivesFunctor findPos; | |
| 118 | |
| 119 HashElement* found = cache.find(0, findPos); | |
| 120 REPORTER_ASSERT(reporter, NULL == found); | |
| 121 | |
| 122 for (int i = 1; i < 10; ++i) { | |
| 123 found = cache.find(i, findPos); | |
| 124 | |
| 125 REPORTER_ASSERT(reporter, NULL != found && found->fValue > 0); | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 // make sure finding the positives wasn't a fluke - find the negatives | |
| 130 { | |
| 131 GrFindNegativesFunctor findNeg; | |
| 132 | |
| 133 HashElement* found = cache.find(0, findNeg); | |
| 134 REPORTER_ASSERT(reporter, NULL == found); | |
| 135 | |
| 136 for (int i = 1; i < 10; ++i) { | |
| 137 found = cache.find(i, findNeg); | |
| 138 | |
| 139 REPORTER_ASSERT(reporter, NULL != found && found->fValue < 0); | |
| 140 } | |
| 141 } | |
| 142 | |
| 143 // remove the 0:0 entries | |
| 144 { | |
| 145 cache.remove(0, &negHashElements[0]); | |
| 146 cache.remove(0, &posHashElements[0]); | |
| 147 REPORTER_ASSERT(reporter, 18 == cache.count()); | |
| 148 | |
| 149 HashElement* found = cache.find(0); | |
| 150 REPORTER_ASSERT(reporter, NULL == found); | |
| 151 } | |
| 152 } | |
| 153 | |
| 154 #endif | |
| OLD | NEW |