13636ed558fb2af5a48a9634efec55fd8a87c88d7reed@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
73636ed558fb2af5a48a9634efec55fd8a87c88d7reed@google.com */
83636ed558fb2af5a48a9634efec55fd8a87c88d7reed@google.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
100e190d0e126991cfba4bc7415c1911761d7be87breed@google.com#include "SkRefDict.h"
110e190d0e126991cfba4bc7415c1911761d7be87breed@google.com#include "SkString.h"
120e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
130e190d0e126991cfba4bc7415c1911761d7be87breed@google.comstruct SkRefDict::Impl {
140e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    Impl*       fNext;
150e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    SkString    fName;
160e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    SkRefCnt*   fData;
170e190d0e126991cfba4bc7415c1911761d7be87breed@google.com};
180e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
190e190d0e126991cfba4bc7415c1911761d7be87breed@google.comSkRefDict::SkRefDict() : fImpl(NULL) {}
200e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
210e190d0e126991cfba4bc7415c1911761d7be87breed@google.comSkRefDict::~SkRefDict() {
220e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    this->removeAll();
230e190d0e126991cfba4bc7415c1911761d7be87breed@google.com}
240e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
250e190d0e126991cfba4bc7415c1911761d7be87breed@google.comSkRefCnt* SkRefDict::find(const char name[]) const {
260e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    if (NULL == name) {
270e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        return NULL;
280e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    }
290e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
300e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    Impl* rec = fImpl;
310e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    while (rec) {
320e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        if (rec->fName.equals(name)) {
330e190d0e126991cfba4bc7415c1911761d7be87breed@google.com            return rec->fData;
340e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        }
350e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        rec = rec->fNext;
360e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    }
370e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    return NULL;
380e190d0e126991cfba4bc7415c1911761d7be87breed@google.com}
390e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
400e190d0e126991cfba4bc7415c1911761d7be87breed@google.comvoid SkRefDict::set(const char name[], SkRefCnt* data) {
410e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    if (NULL == name) {
420e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        return;
430e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    }
440e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
450e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    Impl* rec = fImpl;
460e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    Impl* prev = NULL;
470e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    while (rec) {
480e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        if (rec->fName.equals(name)) {
490e190d0e126991cfba4bc7415c1911761d7be87breed@google.com            if (data) {
500e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                // replace
510e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                data->ref();
520e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                rec->fData->unref();
530e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                rec->fData = data;
540e190d0e126991cfba4bc7415c1911761d7be87breed@google.com            } else {
550e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                // remove
560e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                rec->fData->unref();
570e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                if (prev) {
580e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                    prev->fNext = rec->fNext;
590e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                } else {
600e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                    fImpl = rec->fNext;
610e190d0e126991cfba4bc7415c1911761d7be87breed@google.com                }
6235300c47fc6e59d8415a06042f230ed36deb60b3robertphillips@google.com                delete rec;
630e190d0e126991cfba4bc7415c1911761d7be87breed@google.com            }
640e190d0e126991cfba4bc7415c1911761d7be87breed@google.com            return;
650e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        }
660e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        prev = rec;
670e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        rec = rec->fNext;
680e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    }
690e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
700e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    // if get here, name was not found, so add it
710e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    data->ref();
720e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    rec = new Impl;
730e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    rec->fName.set(name);
740e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    rec->fData = data;
750e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    // prepend to the head of our list
760e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    rec->fNext = fImpl;
770e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    fImpl = rec;
780e190d0e126991cfba4bc7415c1911761d7be87breed@google.com}
790e190d0e126991cfba4bc7415c1911761d7be87breed@google.com
800e190d0e126991cfba4bc7415c1911761d7be87breed@google.comvoid SkRefDict::removeAll() {
810e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    Impl* rec = fImpl;
820e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    while (rec) {
830e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        Impl* next = rec->fNext;
840e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        rec->fData->unref();
850e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        delete rec;
860e190d0e126991cfba4bc7415c1911761d7be87breed@google.com        rec = next;
870e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    }
880e190d0e126991cfba4bc7415c1911761d7be87breed@google.com    fImpl = NULL;
890e190d0e126991cfba4bc7415c1911761d7be87breed@google.com}
90