skia2/include/core/SkTDict.h
epoger@google.com ec3ed6a5eb Automatic update of all copyright notices to reflect new license terms.
I have manually examined all of these diffs and restored a few files that
seem to require manual adjustment.

The following files still need to be modified manually, in a separate CL:

android_sample/SampleApp/AndroidManifest.xml
android_sample/SampleApp/res/layout/layout.xml
android_sample/SampleApp/res/menu/sample.xml
android_sample/SampleApp/res/values/strings.xml
android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java
android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java
experimental/CiCarbonSampleMain.c
experimental/CocoaDebugger/main.m
experimental/FileReaderApp/main.m
experimental/SimpleCocoaApp/main.m
experimental/iOSSampleApp/Shared/SkAlertPrompt.h
experimental/iOSSampleApp/Shared/SkAlertPrompt.m
experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig
experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig
experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig
gpu/src/android/GrGLDefaultInterface_android.cpp
gyp/common.gypi
gyp_skia
include/ports/SkHarfBuzzFont.h
include/views/SkOSWindow_wxwidgets.h
make.bat
make.py
src/opts/memset.arm.S
src/opts/memset16_neon.S
src/opts/memset32_neon.S
src/opts/opts_check_arm.cpp
src/ports/SkDebug_brew.cpp
src/ports/SkMemory_brew.cpp
src/ports/SkOSFile_brew.cpp
src/ports/SkXMLParser_empty.cpp
src/utils/ios/SkImageDecoder_iOS.mm
src/utils/ios/SkOSFile_iOS.mm
src/utils/ios/SkStream_NSData.mm
tests/FillPathTest.cpp
Review URL: http://codereview.appspot.com/4816058

git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
2011-07-28 14:26:00 +00:00

163 lines
3.5 KiB
C++

/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkTDict_DEFINED
#define SkTDict_DEFINED
#include "SkChunkAlloc.h"
#include "SkTSearch.h"
#include "SkTDArray.h"
template <typename T> class SkTDict : SkNoncopyable {
public:
SkTDict(size_t minStringAlloc) : fStrings(minStringAlloc) {}
void reset()
{
fArray.reset();
fStrings.reset();
}
int count() const { return fArray.count(); }
bool set(const char name[], const T& value)
{
return set(name, strlen(name), value);
}
bool set(const char name[], size_t len, const T& value)
{
SkASSERT(name);
int index = this->find_index(name, len);
if (index >= 0)
{
fArray[index].fValue = value;
return false;
}
else
{
Pair* pair = fArray.insert(~index);
char* copy = (char*)fStrings.alloc(len + 1, SkChunkAlloc::kThrow_AllocFailType);
memcpy(copy, name, len);
copy[len] = '\0';
pair->fName = copy;
pair->fValue = value;
return true;
}
}
bool find(const char name[]) const
{
return this->find_index(name) >= 0;
}
bool find(const char name[], size_t len) const
{
return this->find_index(name, len) >= 0;
}
bool find(const char name[], T* value) const
{
return find(name, strlen(name), value);
}
bool find(const char name[], size_t len, T* value) const
{
int index = this->find_index(name, len);
if (index >= 0)
{
if (value)
*value = fArray[index].fValue;
return true;
}
return false;
}
bool findKey(T& value, const char** name) const
{
Pair* end = fArray.end();
for (Pair* pair = fArray.begin(); pair < end; pair++) {
if (pair->fValue != value)
continue;
*name = pair->fName;
return true;
}
return false;
}
public:
struct Pair {
const char* fName;
T fValue;
friend int operator<(const Pair& a, const Pair& b)
{
return strcmp(a.fName, b.fName);
}
friend int operator!=(const Pair& a, const Pair& b)
{
return strcmp(a.fName, b.fName);
}
};
friend class Iter;
public:
class Iter {
public:
Iter(const SkTDict<T>& dict)
{
fIter = dict.fArray.begin();
fStop = dict.fArray.end();
}
const char* next(T* value)
{
const char* name = NULL;
if (fIter < fStop)
{
name = fIter->fName;
if (value)
*value = fIter->fValue;
fIter += 1;
}
return name;
}
private:
Pair* fIter;
Pair* fStop;
};
private:
SkTDArray<Pair> fArray;
SkChunkAlloc fStrings;
int find_index(const char name[]) const
{
return find_index(name, strlen(name));
}
int find_index(const char name[], size_t len) const
{
SkASSERT(name);
int count = fArray.count();
int index = ~0;
if (count)
index = SkStrSearch(&fArray.begin()->fName, count, name, len, sizeof(Pair));
return index;
}
friend class Iter;
};
#endif