
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "SkRefDict.h"
#include "SkString.h"

struct SkRefDict::Impl {
    Impl*       fNext;
    SkString    fName;
    SkRefCnt*   fData;
};

SkRefDict::SkRefDict() : fImpl(NULL) {}

SkRefDict::~SkRefDict() {
    this->removeAll();
}

SkRefCnt* SkRefDict::find(const char name[]) const {
    if (NULL == name) {
        return NULL;
    }

    Impl* rec = fImpl;
    while (rec) {
        if (rec->fName.equals(name)) {
            return rec->fData;
        }
        rec = rec->fNext;
    }
    return NULL;
}

void SkRefDict::set(const char name[], SkRefCnt* data) {
    if (NULL == name) {
        return;
    }

    Impl* rec = fImpl;
    Impl* prev = NULL;
    while (rec) {
        if (rec->fName.equals(name)) {
            if (data) {
                // replace
                data->ref();
                rec->fData->unref();
                rec->fData = data;
            } else {
                // remove
                rec->fData->unref();
                if (prev) {
                    prev->fNext = rec->fNext;
                } else {
                    fImpl = rec->fNext;
                }
                delete rec;
            }
            return;
        }
        prev = rec;
        rec = rec->fNext;
    }

    // if get here, name was not found, so add it
    data->ref();
    rec = new Impl;
    rec->fName.set(name);
    rec->fData = data;
    // prepend to the head of our list
    rec->fNext = fImpl;
    fImpl = rec;
}

void SkRefDict::removeAll() {
    Impl* rec = fImpl;
    while (rec) {
        Impl* next = rec->fNext;
        rec->fData->unref();
        delete rec;
        rec = next;
    }
    fImpl = NULL;
}
