Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #include "SkRefDict.h"
     11 #include "SkString.h"
     12 
     13 struct SkRefDict::Impl {
     14     Impl*       fNext;
     15     SkString    fName;
     16     SkRefCnt*   fData;
     17 };
     18 
     19 SkRefDict::SkRefDict() : fImpl(NULL) {}
     20 
     21 SkRefDict::~SkRefDict() {
     22     this->removeAll();
     23 }
     24 
     25 SkRefCnt* SkRefDict::find(const char name[]) const {
     26     if (NULL == name) {
     27         return NULL;
     28     }
     29 
     30     Impl* rec = fImpl;
     31     while (rec) {
     32         if (rec->fName.equals(name)) {
     33             return rec->fData;
     34         }
     35         rec = rec->fNext;
     36     }
     37     return NULL;
     38 }
     39 
     40 void SkRefDict::set(const char name[], SkRefCnt* data) {
     41     if (NULL == name) {
     42         return;
     43     }
     44 
     45     Impl* rec = fImpl;
     46     Impl* prev = NULL;
     47     while (rec) {
     48         if (rec->fName.equals(name)) {
     49             if (data) {
     50                 // replace
     51                 data->ref();
     52                 rec->fData->unref();
     53                 rec->fData = data;
     54             } else {
     55                 // remove
     56                 rec->fData->unref();
     57                 if (prev) {
     58                     prev->fNext = rec->fNext;
     59                 } else {
     60                     fImpl = rec->fNext;
     61                 }
     62                 delete rec;
     63             }
     64             return;
     65         }
     66         prev = rec;
     67         rec = rec->fNext;
     68     }
     69 
     70     // if get here, name was not found, so add it
     71     data->ref();
     72     rec = new Impl;
     73     rec->fName.set(name);
     74     rec->fData = data;
     75     // prepend to the head of our list
     76     rec->fNext = fImpl;
     77     fImpl = rec;
     78 }
     79 
     80 void SkRefDict::removeAll() {
     81     Impl* rec = fImpl;
     82     while (rec) {
     83         Impl* next = rec->fNext;
     84         rec->fData->unref();
     85         delete rec;
     86         rec = next;
     87     }
     88     fImpl = NULL;
     89 }
     90