diff options
author | 2011-01-25 23:36:05 +0000 | |
---|---|---|
committer | 2011-01-25 23:36:05 +0000 | |
commit | 0e190d0e126991cfba4bc7415c1911761d7be87b (patch) | |
tree | 93cee043ffa6c09206bd63ff523d0bd17f8e31f4 /src/core/SkRefDict.cpp | |
parent | 02cc5aa736086320649d8a932515691ae18a0dd5 (diff) |
add refdict class, for holding a dictionary of reference-counted objects
-- experimental
git-svn-id: http://skia.googlecode.com/svn/trunk@730 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkRefDict.cpp')
-rw-r--r-- | src/core/SkRefDict.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/core/SkRefDict.cpp b/src/core/SkRefDict.cpp new file mode 100644 index 0000000000..572ed7e180 --- /dev/null +++ b/src/core/SkRefDict.cpp @@ -0,0 +1,80 @@ +#include "SkRefDict.h" +#include "SkString.h" + +struct SkRefDict::Impl { + Impl* fNext; + SkString fName; + SkRefCnt* fData; +}; + +SkRefDict::SkRefDict() : fImpl(NULL) {} + +SkRefDict::~SkRefDict() { + this->removeAll(); +} + +SkRefCnt* SkRefDict::find(const char name[]) const { + if (NULL == name) { + return NULL; + } + + Impl* rec = fImpl; + while (rec) { + if (rec->fName.equals(name)) { + return rec->fData; + } + rec = rec->fNext; + } + return NULL; +} + +void SkRefDict::set(const char name[], SkRefCnt* data) { + if (NULL == name) { + return; + } + + Impl* rec = fImpl; + Impl* prev = NULL; + while (rec) { + if (rec->fName.equals(name)) { + if (data) { + // replace + data->ref(); + rec->fData->unref(); + rec->fData = data; + } else { + // remove + rec->fData->unref(); + if (prev) { + prev->fNext = rec->fNext; + } else { + fImpl = rec->fNext; + } + } + return; + } + prev = rec; + rec = rec->fNext; + } + + // if get here, name was not found, so add it + data->ref(); + rec = new Impl; + rec->fName.set(name); + rec->fData = data; + // prepend to the head of our list + rec->fNext = fImpl; + fImpl = rec; +} + +void SkRefDict::removeAll() { + Impl* rec = fImpl; + while (rec) { + Impl* next = rec->fNext; + rec->fData->unref(); + delete rec; + rec = next; + } + fImpl = NULL; +} + |