diff options
Diffstat (limited to 'gfx/skia/skia/src/core/SkPtrRecorder.cpp')
-rw-r--r-- | gfx/skia/skia/src/core/SkPtrRecorder.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/core/SkPtrRecorder.cpp b/gfx/skia/skia/src/core/SkPtrRecorder.cpp new file mode 100644 index 0000000000..eacd45546b --- /dev/null +++ b/gfx/skia/skia/src/core/SkPtrRecorder.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "src/base/SkTSearch.h" +#include "src/core/SkPtrRecorder.h" + +void SkPtrSet::reset() { + Pair* p = fList.begin(); + Pair* stop = fList.end(); + while (p < stop) { + this->decPtr(p->fPtr); + p += 1; + } + fList.reset(); +} + +bool SkPtrSet::Less(const Pair& a, const Pair& b) { + return (char*)a.fPtr < (char*)b.fPtr; +} + +uint32_t SkPtrSet::find(void* ptr) const { + if (nullptr == ptr) { + return 0; + } + + int count = fList.size(); + Pair pair; + pair.fPtr = ptr; + + int index = SkTSearch<Pair, Less>(fList.begin(), count, pair, sizeof(pair)); + if (index < 0) { + return 0; + } + return fList[index].fIndex; +} + +uint32_t SkPtrSet::add(void* ptr) { + if (nullptr == ptr) { + return 0; + } + + int count = fList.size(); + Pair pair; + pair.fPtr = ptr; + + int index = SkTSearch<Pair, Less>(fList.begin(), count, pair, sizeof(pair)); + if (index < 0) { + index = ~index; // turn it back into an index for insertion + this->incPtr(ptr); + pair.fIndex = count + 1; + *fList.insert(index) = pair; + return count + 1; + } else { + return fList[index].fIndex; + } +} + +void SkPtrSet::copyToArray(void* array[]) const { + int count = fList.size(); + if (count > 0) { + SkASSERT(array); + const Pair* p = fList.begin(); + // p->fIndex is base-1, so we need to subtract to find its slot + for (int i = 0; i < count; i++) { + int index = p[i].fIndex - 1; + SkASSERT((unsigned)index < (unsigned)count); + array[index] = p[i].fPtr; + } + } +} |