aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkRefDict.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-01-25 23:36:05 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-01-25 23:36:05 +0000
commit0e190d0e126991cfba4bc7415c1911761d7be87b (patch)
tree93cee043ffa6c09206bd63ff523d0bd17f8e31f4 /src/core/SkRefDict.cpp
parent02cc5aa736086320649d8a932515691ae18a0dd5 (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.cpp80
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;
+}
+