/usr/include/thunderbird/skia/SkTDict.h is in thunderbird-dev 1:38.6.0+build1-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | /*
* 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 {
const Pair* end = fArray.end();
for (const 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:
const Pair* fIter;
const 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
|