blob: 94f70c952572748bab75ac1c6d97b323d4dd1ee4 [file] [log] [blame]
<!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&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">include</a>&nbsp;/&nbsp;<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> &lt;<span class="keyword">typename</span> T&gt; <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&amp; 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&amp; value)
00027 {
00028 SkASSERT(name);
00029
00030 <span class="keywordtype">int</span> index = this-&gt;find_index(name, len);
00031
00032 <span class="keywordflow">if</span> (index &gt;= 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-&gt;fName = copy;
00044 pair-&gt;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-&gt;find_index(name) &gt;= 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-&gt;find_index(name, len);
00062
00063 <span class="keywordflow">if</span> (index &gt;= 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&amp; 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 &lt; end; pair++) {
00076 <span class="keywordflow">if</span> (pair-&gt;fValue != value)
00077 continue;
00078 *name = pair-&gt;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&lt;(<span class="keyword">const</span> Pair&amp; a, <span class="keyword">const</span> Pair&amp; 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&amp; a, <span class="keyword">const</span> Pair&amp; 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&lt;T&gt;&amp; 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 &lt; fStop)
00112 {
00113 name = fIter-&gt;fName;
00114 <span class="keywordflow">if</span> (value)
00115 *value = fIter-&gt;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&lt;Pair&gt; 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(&amp;fArray.begin()-&gt;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&nbsp;
<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>