|
1 |
|
2 /* |
|
3 * Copyright 2011 Google Inc. |
|
4 * |
|
5 * Use of this source code is governed by a BSD-style license that can be |
|
6 * found in the LICENSE file. |
|
7 */ |
|
8 |
|
9 |
|
10 #include "SkRefDict.h" |
|
11 #include "SkString.h" |
|
12 |
|
13 struct SkRefDict::Impl { |
|
14 Impl* fNext; |
|
15 SkString fName; |
|
16 SkRefCnt* fData; |
|
17 }; |
|
18 |
|
19 SkRefDict::SkRefDict() : fImpl(NULL) {} |
|
20 |
|
21 SkRefDict::~SkRefDict() { |
|
22 this->removeAll(); |
|
23 } |
|
24 |
|
25 SkRefCnt* SkRefDict::find(const char name[]) const { |
|
26 if (NULL == name) { |
|
27 return NULL; |
|
28 } |
|
29 |
|
30 Impl* rec = fImpl; |
|
31 while (rec) { |
|
32 if (rec->fName.equals(name)) { |
|
33 return rec->fData; |
|
34 } |
|
35 rec = rec->fNext; |
|
36 } |
|
37 return NULL; |
|
38 } |
|
39 |
|
40 void SkRefDict::set(const char name[], SkRefCnt* data) { |
|
41 if (NULL == name) { |
|
42 return; |
|
43 } |
|
44 |
|
45 Impl* rec = fImpl; |
|
46 Impl* prev = NULL; |
|
47 while (rec) { |
|
48 if (rec->fName.equals(name)) { |
|
49 if (data) { |
|
50 // replace |
|
51 data->ref(); |
|
52 rec->fData->unref(); |
|
53 rec->fData = data; |
|
54 } else { |
|
55 // remove |
|
56 rec->fData->unref(); |
|
57 if (prev) { |
|
58 prev->fNext = rec->fNext; |
|
59 } else { |
|
60 fImpl = rec->fNext; |
|
61 } |
|
62 delete rec; |
|
63 } |
|
64 return; |
|
65 } |
|
66 prev = rec; |
|
67 rec = rec->fNext; |
|
68 } |
|
69 |
|
70 // if get here, name was not found, so add it |
|
71 data->ref(); |
|
72 rec = new Impl; |
|
73 rec->fName.set(name); |
|
74 rec->fData = data; |
|
75 // prepend to the head of our list |
|
76 rec->fNext = fImpl; |
|
77 fImpl = rec; |
|
78 } |
|
79 |
|
80 void SkRefDict::removeAll() { |
|
81 Impl* rec = fImpl; |
|
82 while (rec) { |
|
83 Impl* next = rec->fNext; |
|
84 rec->fData->unref(); |
|
85 delete rec; |
|
86 rec = next; |
|
87 } |
|
88 fImpl = NULL; |
|
89 } |