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