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