blob: 572ed7e180b71b55b3607f44f0d8fae2d778e336 [file] [log] [blame]
reed@google.com0e190d02011-01-25 23:36:05 +00001#include "SkRefDict.h"
2#include "SkString.h"
3
4struct SkRefDict::Impl {
5 Impl* fNext;
6 SkString fName;
7 SkRefCnt* fData;
8};
9
10SkRefDict::SkRefDict() : fImpl(NULL) {}
11
12SkRefDict::~SkRefDict() {
13 this->removeAll();
14}
15
16SkRefCnt* SkRefDict::find(const char name[]) const {
17 if (NULL == name) {
18 return NULL;
19 }
20
21 Impl* rec = fImpl;
22 while (rec) {
23 if (rec->fName.equals(name)) {
24 return rec->fData;
25 }
26 rec = rec->fNext;
27 }
28 return NULL;
29}
30
31void SkRefDict::set(const char name[], SkRefCnt* data) {
32 if (NULL == name) {
33 return;
34 }
35
36 Impl* rec = fImpl;
37 Impl* prev = NULL;
38 while (rec) {
39 if (rec->fName.equals(name)) {
40 if (data) {
41 // replace
42 data->ref();
43 rec->fData->unref();
44 rec->fData = data;
45 } else {
46 // remove
47 rec->fData->unref();
48 if (prev) {
49 prev->fNext = rec->fNext;
50 } else {
51 fImpl = rec->fNext;
52 }
53 }
54 return;
55 }
56 prev = rec;
57 rec = rec->fNext;
58 }
59
60 // if get here, name was not found, so add it
61 data->ref();
62 rec = new Impl;
63 rec->fName.set(name);
64 rec->fData = data;
65 // prepend to the head of our list
66 rec->fNext = fImpl;
67 fImpl = rec;
68}
69
70void SkRefDict::removeAll() {
71 Impl* rec = fImpl;
72 while (rec) {
73 Impl* next = rec->fNext;
74 rec->fData->unref();
75 delete rec;
76 rec = next;
77 }
78 fImpl = NULL;
79}
80