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