1/* 2 * Copyright 2011 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#include "SkPtrRecorder.h" 8#include "SkTSearch.h" 9 10void SkPtrSet::reset() { 11 Pair* p = fList.begin(); 12 Pair* stop = fList.end(); 13 while (p < stop) { 14 this->decPtr(p->fPtr); 15 p += 1; 16 } 17 fList.reset(); 18} 19 20bool SkPtrSet::Less(const Pair& a, const Pair& b) { 21 return (char*)a.fPtr < (char*)b.fPtr; 22} 23 24uint32_t SkPtrSet::find(void* ptr) const { 25 if (nullptr == ptr) { 26 return 0; 27 } 28 29 int count = fList.count(); 30 Pair pair; 31 pair.fPtr = ptr; 32 33 int index = SkTSearch<Pair, Less>(fList.begin(), count, pair, sizeof(pair)); 34 if (index < 0) { 35 return 0; 36 } 37 return fList[index].fIndex; 38} 39 40uint32_t SkPtrSet::add(void* ptr) { 41 if (nullptr == ptr) { 42 return 0; 43 } 44 45 int count = fList.count(); 46 Pair pair; 47 pair.fPtr = ptr; 48 49 int index = SkTSearch<Pair, Less>(fList.begin(), count, pair, sizeof(pair)); 50 if (index < 0) { 51 index = ~index; // turn it back into an index for insertion 52 this->incPtr(ptr); 53 pair.fIndex = count + 1; 54 *fList.insert(index) = pair; 55 return count + 1; 56 } else { 57 return fList[index].fIndex; 58 } 59} 60 61void SkPtrSet::copyToArray(void* array[]) const { 62 int count = fList.count(); 63 if (count > 0) { 64 SkASSERT(array); 65 const Pair* p = fList.begin(); 66 // p->fIndex is base-1, so we need to subtract to find its slot 67 for (int i = 0; i < count; i++) { 68 int index = p[i].fIndex - 1; 69 SkASSERT((unsigned)index < (unsigned)count); 70 array[index] = p[i].fPtr; 71 } 72 } 73} 74