• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SkRefDict()19 SkRefDict::SkRefDict() : fImpl(nullptr) {}
20 
~SkRefDict()21 SkRefDict::~SkRefDict() {
22     this->removeAll();
23 }
24 
find(const char name[]) const25 SkRefCnt* SkRefDict::find(const char name[]) const {
26     if (nullptr == name) {
27         return nullptr;
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 nullptr;
38 }
39 
set(const char name[],SkRefCnt * data)40 void SkRefDict::set(const char name[], SkRefCnt* data) {
41     if (nullptr == name) {
42         return;
43     }
44 
45     Impl* rec = fImpl;
46     Impl* prev = nullptr;
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 
removeAll()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 = nullptr;
89 }
90