michael@0: michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkRefDict.h" michael@0: #include "SkString.h" michael@0: michael@0: struct SkRefDict::Impl { michael@0: Impl* fNext; michael@0: SkString fName; michael@0: SkRefCnt* fData; michael@0: }; michael@0: michael@0: SkRefDict::SkRefDict() : fImpl(NULL) {} michael@0: michael@0: SkRefDict::~SkRefDict() { michael@0: this->removeAll(); michael@0: } michael@0: michael@0: SkRefCnt* SkRefDict::find(const char name[]) const { michael@0: if (NULL == name) { michael@0: return NULL; michael@0: } michael@0: michael@0: Impl* rec = fImpl; michael@0: while (rec) { michael@0: if (rec->fName.equals(name)) { michael@0: return rec->fData; michael@0: } michael@0: rec = rec->fNext; michael@0: } michael@0: return NULL; michael@0: } michael@0: michael@0: void SkRefDict::set(const char name[], SkRefCnt* data) { michael@0: if (NULL == name) { michael@0: return; michael@0: } michael@0: michael@0: Impl* rec = fImpl; michael@0: Impl* prev = NULL; michael@0: while (rec) { michael@0: if (rec->fName.equals(name)) { michael@0: if (data) { michael@0: // replace michael@0: data->ref(); michael@0: rec->fData->unref(); michael@0: rec->fData = data; michael@0: } else { michael@0: // remove michael@0: rec->fData->unref(); michael@0: if (prev) { michael@0: prev->fNext = rec->fNext; michael@0: } else { michael@0: fImpl = rec->fNext; michael@0: } michael@0: delete rec; michael@0: } michael@0: return; michael@0: } michael@0: prev = rec; michael@0: rec = rec->fNext; michael@0: } michael@0: michael@0: // if get here, name was not found, so add it michael@0: data->ref(); michael@0: rec = new Impl; michael@0: rec->fName.set(name); michael@0: rec->fData = data; michael@0: // prepend to the head of our list michael@0: rec->fNext = fImpl; michael@0: fImpl = rec; michael@0: } michael@0: michael@0: void SkRefDict::removeAll() { michael@0: Impl* rec = fImpl; michael@0: while (rec) { michael@0: Impl* next = rec->fNext; michael@0: rec->fData->unref(); michael@0: delete rec; michael@0: rec = next; michael@0: } michael@0: fImpl = NULL; michael@0: }