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