| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> |
| <title>SGL: SkTDict.h Source File</title> |
| <link href="doxygen.css" rel="stylesheet" type="text/css"> |
| </head><body> |
| <!-- Generated by Doxygen 1.4.0 --> |
| <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> |
| <div class="nav"> |
| <a class="el" href="dir_000000.html">include</a> / <a class="el" href="dir_000001.html">skia</a></div> |
| <h1>SkTDict.h</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef SkTDict_DEFINED</span> |
| 00002 <span class="preprocessor"></span><span class="preprocessor">#define SkTDict_DEFINED</span> |
| 00003 <span class="preprocessor"></span> |
| 00004 <span class="preprocessor">#include "SkChunkAlloc.h"</span> |
| 00005 <span class="comment">//#include "SkTemplates.h"</span> |
| 00006 <span class="preprocessor">#include "SkTSearch.h"</span> |
| 00007 <span class="preprocessor">#include "SkTDArray.h"</span> |
| 00008 |
| 00009 <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keyword">class </span>SkTDict { |
| 00010 <span class="keyword">public</span>: |
| 00011 SkTDict(size_t minStringAlloc) : fStrings(minStringAlloc) {} |
| 00012 |
| 00013 <span class="keywordtype">void</span> reset() |
| 00014 { |
| 00015 fArray.reset(); |
| 00016 fStrings.reset(); |
| 00017 } |
| 00018 |
| 00019 <span class="keywordtype">int</span> count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> fArray.count(); } |
| 00020 |
| 00021 <span class="keywordtype">bool</span> set(<span class="keyword">const</span> <span class="keywordtype">char</span> name[], <span class="keyword">const</span> T& value) |
| 00022 { |
| 00023 <span class="keywordflow">return</span> set(name, strlen(name), value); |
| 00024 } |
| 00025 |
| 00026 <span class="keywordtype">bool</span> set(<span class="keyword">const</span> <span class="keywordtype">char</span> name[], size_t len, <span class="keyword">const</span> T& value) |
| 00027 { |
| 00028 SkASSERT(name); |
| 00029 |
| 00030 <span class="keywordtype">int</span> index = this->find_index(name, len); |
| 00031 |
| 00032 <span class="keywordflow">if</span> (index >= 0) |
| 00033 { |
| 00034 fArray[index].fValue = value; |
| 00035 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| 00036 } |
| 00037 <span class="keywordflow">else</span> |
| 00038 { |
| 00039 len += 1; <span class="comment">// make space for trailing zero</span> |
| 00040 Pair* pair = fArray.insert(~index); |
| 00041 <span class="keywordtype">char</span>* copy = (<span class="keywordtype">char</span>*)fStrings.alloc(len, SkChunkAlloc::kThrow_AllocFailType); |
| 00042 memcpy(copy, name, len); |
| 00043 pair->fName = copy; |
| 00044 pair->fValue = value; |
| 00045 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| 00046 } |
| 00047 } |
| 00048 |
| 00049 <span class="keywordtype">bool</span> find(<span class="keyword">const</span> <span class="keywordtype">char</span> name[])<span class="keyword"> const</span> |
| 00050 <span class="keyword"> </span>{ |
| 00051 <span class="keywordflow">return</span> this->find_index(name) >= 0; |
| 00052 } |
| 00053 |
| 00054 <span class="keywordtype">bool</span> find(<span class="keyword">const</span> <span class="keywordtype">char</span> name[], T* value)<span class="keyword"> const</span> |
| 00055 <span class="keyword"> </span>{ |
| 00056 <span class="keywordflow">return</span> find(name, strlen(name), value); |
| 00057 } |
| 00058 |
| 00059 <span class="keywordtype">bool</span> find(<span class="keyword">const</span> <span class="keywordtype">char</span> name[], size_t len, T* value)<span class="keyword"> const</span> |
| 00060 <span class="keyword"> </span>{ |
| 00061 <span class="keywordtype">int</span> index = this->find_index(name, len); |
| 00062 |
| 00063 <span class="keywordflow">if</span> (index >= 0) |
| 00064 { |
| 00065 <span class="keywordflow">if</span> (value) |
| 00066 *value = fArray[index].fValue; |
| 00067 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| 00068 } |
| 00069 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| 00070 } |
| 00071 |
| 00072 <span class="keywordtype">bool</span> findKey(T& value, <span class="keyword">const</span> <span class="keywordtype">char</span>** name)<span class="keyword"> const</span> |
| 00073 <span class="keyword"> </span>{ |
| 00074 Pair* end = fArray.end(); |
| 00075 <span class="keywordflow">for</span> (Pair* pair = fArray.begin(); pair < end; pair++) { |
| 00076 <span class="keywordflow">if</span> (pair->fValue != value) |
| 00077 continue; |
| 00078 *name = pair->fName; |
| 00079 return true; |
| 00080 } |
| 00081 return false; |
| 00082 } |
| 00083 |
| 00084 public: |
| 00085 struct Pair { |
| 00086 <span class="keyword">const</span> <span class="keywordtype">char</span>* fName; |
| 00087 T fValue; |
| 00088 |
| 00089 <span class="keyword">friend</span> <span class="keywordtype">int</span> operator<(<span class="keyword">const</span> Pair& a, <span class="keyword">const</span> Pair& b) |
| 00090 { |
| 00091 <span class="keywordflow">return</span> strcmp(a.fName, b.fName); |
| 00092 } |
| 00093 <span class="keyword">friend</span> <span class="keywordtype">int</span> operator!=(<span class="keyword">const</span> Pair& a, <span class="keyword">const</span> Pair& b) |
| 00094 { |
| 00095 <span class="keywordflow">return</span> strcmp(a.fName, b.fName); |
| 00096 } |
| 00097 }; |
| 00098 <span class="keyword">friend</span> <span class="keyword">class </span>Iter; |
| 00099 |
| 00100 <span class="keyword">public</span>: |
| 00101 <span class="keyword">class </span>Iter { |
| 00102 <span class="keyword">public</span>: |
| 00103 Iter(<span class="keyword">const</span> SkTDict<T>& dict) |
| 00104 { |
| 00105 fIter = dict.fArray.begin(); |
| 00106 fStop = dict.fArray.end(); |
| 00107 } |
| 00108 <span class="keyword">const</span> <span class="keywordtype">char</span>* next(T* value) |
| 00109 { |
| 00110 <span class="keyword">const</span> <span class="keywordtype">char</span>* name = nil; |
| 00111 <span class="keywordflow">if</span> (fIter < fStop) |
| 00112 { |
| 00113 name = fIter->fName; |
| 00114 <span class="keywordflow">if</span> (value) |
| 00115 *value = fIter->fValue; |
| 00116 fIter += 1; |
| 00117 } |
| 00118 <span class="keywordflow">return</span> name; |
| 00119 } |
| 00120 <span class="keyword">private</span>: |
| 00121 Pair* fIter; |
| 00122 Pair* fStop; |
| 00123 }; |
| 00124 |
| 00125 <span class="keyword">private</span>: |
| 00126 SkTDArray<Pair> fArray; |
| 00127 SkChunkAlloc fStrings; |
| 00128 |
| 00129 <span class="keywordtype">int</span> find_index(<span class="keyword">const</span> <span class="keywordtype">char</span> name[])<span class="keyword"> const</span> |
| 00130 <span class="keyword"> </span>{ |
| 00131 <span class="keywordflow">return</span> find_index(name, strlen(name)); |
| 00132 } |
| 00133 |
| 00134 <span class="keywordtype">int</span> find_index(<span class="keyword">const</span> <span class="keywordtype">char</span> name[], size_t len)<span class="keyword"> const</span> |
| 00135 <span class="keyword"> </span>{ |
| 00136 SkASSERT(name); |
| 00137 |
| 00138 <span class="keywordtype">int</span> count = fArray.count(); |
| 00139 <span class="keywordtype">int</span> index = ~0; |
| 00140 |
| 00141 <span class="keywordflow">if</span> (count) |
| 00142 index = SkStrSearch(&fArray.begin()->fName, count, name, len, sizeof(Pair)); |
| 00143 return index; |
| 00144 } |
| 00145 friend class Iter; |
| 00146 }; |
| 00147 |
| 00148 #endif |
| 00149 |
| </pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue May 9 14:35:23 2006 for SGL by |
| <a href="http://www.doxygen.org/index.html"> |
| <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.0 </small></address> |
| </body> |
| </html> |