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 "src/core/SkPtrRecorder.h"
8#include "src/core/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