1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> 3<title>oscl_map.h Source File</title> 4<link href="doxygen.css" rel="stylesheet" type="text/css"> 5</head><body> 6<!-- Generated by Doxygen 1.2.18 --> 7<center> 8<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> </center> 9<hr><h1>oscl_map.h</h1><a href="oscl__map_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">// -*- c++ -*-</span> 1000002 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> 1100003 1200004 <span class="comment">// O S C L _ M A P</span> 1300005 1400006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> 1500007 1600018 <span class="preprocessor">#ifndef OSCL_MAP_H_INCLUDED</span> 1700019 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_MAP_H_INCLUDED</span> 1800020 <span class="preprocessor"></span> 1900021 <span class="preprocessor">#ifndef OSCL_BASE_H_INCLUDED</span> 2000022 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__base_8h.html">oscl_base.h</a>"</span> 2100023 <span class="preprocessor">#endif</span> 2200024 <span class="preprocessor"></span> 2300025 <span class="preprocessor">#ifndef OSCL_TREE_H_INCLUDED</span> 2400026 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__tree_8h.html">oscl_tree.h</a>"</span> 2500027 <span class="preprocessor">#endif</span> 2600028 <span class="preprocessor"></span> 27<a name="l00029"></a><a class="code" href="oscl__map_8h.html#a0">00029</a> <span class="preprocessor">#define OSCL_DISABLE_WARNING_TRUNCATE_DEBUG_MESSAGE</span> 2800030 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="osclconfig__compiler__warnings_8h.html">osclconfig_compiler_warnings.h</a>"</span> 2900031 3000032 <span class="keyword">template</span> <<span class="keyword">class</span> T> 31<a name="l00033"></a><a class="code" href="structOscl__Less.html">00033</a> <span class="keyword">struct </span><a class="code" href="structOscl__Less.html">Oscl_Less</a> 3200034 { 33<a name="l00035"></a><a class="code" href="structOscl__Less.html#a0">00035</a> <span class="keywordtype">bool</span> <a class="code" href="structOscl__Less.html#a0">operator()</a>(<span class="keyword">const</span> T& x, <span class="keyword">const</span> T& y)<span class="keyword"> const</span> 3400036 <span class="keyword"> </span>{ 3500037 <span class="keywordflow">return</span> x < y ? <span class="keyword">true</span> : <span class="keyword">false</span> ; 3600038 } 3700039 }; 3800040 3900041 <span class="keyword">template</span> <<span class="keyword">class</span> V, <span class="keyword">class</span> U> 40<a name="l00042"></a><a class="code" href="structOscl__Select1st.html">00042</a> <span class="keyword">struct </span><a class="code" href="structOscl__Select1st.html">Oscl_Select1st</a> 4100043 { 42<a name="l00044"></a><a class="code" href="structOscl__Select1st.html#a0">00044</a> <span class="keyword">const</span> U& <a class="code" href="structOscl__Select1st.html#a0">operator()</a>(<span class="keyword">const</span> V& x)<span class="keyword"> const</span> 4300045 <span class="keyword"> </span>{ 4400046 <span class="keywordflow">return</span> x.first; 4500047 } 4600048 }; 4700049 4800060 <span class="keyword">template</span> < <span class="keyword">class</span> Key, <span class="keyword">class</span> T, <span class="keyword">class</span> Alloc, <span class="keyword">class</span> Compare = Oscl_Less<Key> > 49<a name="l00061"></a><a class="code" href="classOscl__Map.html">00061</a> <span class="keyword">class </span><a class="code" href="classOscl__Map.html">Oscl_Map</a> 5000062 { 5100063 5200064 <span class="keyword">public</span>: 53<a name="l00065"></a><a class="code" href="classOscl__Map.html#s0">00065</a> <span class="keyword">typedef</span> Key <a class="code" href="classOscl__Map.html#s0">key_type</a>; 54<a name="l00066"></a><a class="code" href="classOscl__Map.html#s1">00066</a> <span class="keyword">typedef</span> Compare <a class="code" href="structOscl__Tag__Base.html">key_compare</a>; 55<a name="l00067"></a><a class="code" href="classOscl__Map.html#s2">00067</a> <span class="keyword">typedef</span> <a class="code" href="structOscl__Pair.html">Oscl_Pair<const Key, T></a> <a class="code" href="structOscl__Pair.html">value_type</a>; 56<a name="l00068"></a><a class="code" href="classOscl__Map.html#s3">00068</a> <span class="keyword">typedef</span> <a class="code" href="classOscl__Map.html">Oscl_Map<Key, T, Alloc, Compare></a> <a class="code" href="classOscl__Map.html">self</a>; 5700069 5800070 <span class="keyword">private</span>: 5900071 <span class="keyword">typedef</span> <a class="code" href="classOscl__Rb__Tree.html">Oscl_Rb_Tree</a> < <a class="code" href="classOscl__Map.html#s0">key_type</a>, value_type, 6000072 <a class="code" href="structOscl__Select1st.html">Oscl_Select1st<value_type, key_type></a>, 6100073 <a class="code" href="structOscl__Tag__Base.html">key_compare</a>, Alloc > <a class="code" href="classOscl__Rb__Tree.html">rep_type</a>; 6200074 <a class="code" href="classOscl__Rb__Tree.html">rep_type</a> t; <span class="comment">// red-black tree representing map</span> 6300075 6400076 <span class="keyword">public</span>: 65<a name="l00077"></a><a class="code" href="classOscl__Map.html#s4">00077</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> rep_type::pointer <a class="code" href="classOscl__Map.html#s4">pointer</a>; 66<a name="l00078"></a><a class="code" href="classOscl__Map.html#s5">00078</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> rep_type::reference <a class="code" href="classOscl__Map.html#s5">reference</a>; 67<a name="l00079"></a><a class="code" href="classOscl__Map.html#s6">00079</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> rep_type::const_reference <a class="code" href="classOscl__Map.html#s6">const_reference</a>; 68<a name="l00080"></a><a class="code" href="classOscl__Map.html#s7">00080</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> rep_type::iterator <a class="code" href="classOscl__Map.html#s7">iterator</a>; 69<a name="l00081"></a><a class="code" href="classOscl__Map.html#s8">00081</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> rep_type::const_iterator <a class="code" href="classOscl__Map.html#s8">const_iterator</a>; 70<a name="l00082"></a><a class="code" href="classOscl__Map.html#s9">00082</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> rep_type::size_type <a class="code" href="classOscl__Map.html#s9">size_type</a>; 7100083 72<a name="l00084"></a><a class="code" href="classOscl__Map_1_1value__compare.html">00084</a> <span class="keyword">class </span><a class="code" href="classOscl__Map_1_1value__compare.html">value_compare</a> 7300085 { 74<a name="l00086"></a><a class="code" href="classOscl__Map_1_1value__compare.html#l0">00086</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classOscl__Map.html">Oscl_Map</a><Key, T, Alloc, Compare>; 7500087 <span class="keyword">protected</span> : 76<a name="l00088"></a><a class="code" href="classOscl__Map_1_1value__compare.html#n0">00088</a> Compare <a class="code" href="classOscl__Map_1_1value__compare.html#n0">comp</a>; 77<a name="l00089"></a><a class="code" href="classOscl__Map_1_1value__compare.html#b0">00089</a> <a class="code" href="classOscl__Map_1_1value__compare.html#b0">value_compare</a>(Compare c) : <a class="code" href="classOscl__Map_1_1value__compare.html#n0">comp</a>(c) {} 7800090 <span class="keyword">public</span>: 79<a name="l00091"></a><a class="code" href="classOscl__Map_1_1value__compare.html#a0">00091</a> <span class="keywordtype">bool</span> <a class="code" href="classOscl__Map_1_1value__compare.html#a0">operator()</a>(<span class="keyword">const</span> value_type& x, <span class="keyword">const</span> value_type& y)<span class="keyword"> const</span> 8000092 <span class="keyword"> </span>{ 8100093 <span class="keywordflow">return</span> <a class="code" href="classOscl__Map_1_1value__compare.html#n0">comp</a>(x.<a class="code" href="structOscl__Pair.html#m0">first</a>, y.<a class="code" href="structOscl__Pair.html#m0">first</a>); 8200094 } 8300095 }; 8400096 8500097 <span class="keyword">public</span>: 8600098 87<a name="l00102"></a><a class="code" href="classOscl__Map.html#a0">00102</a> <a class="code" href="classOscl__Map.html#a0">Oscl_Map</a>(<span class="keyword">const</span> Compare& comp = Compare()) : t(comp) {} 8800103 <span class="comment">// Oscl_Map(const value_type* first, const value_type* last,</span> 8900104 <span class="comment">// const Compare& comp = Compare()) : t(first, last, comp, false) {}</span> 9000105 91<a name="l00109"></a><a class="code" href="classOscl__Map.html#a1">00109</a> <a class="code" href="classOscl__Map.html#a0">Oscl_Map</a>(<span class="keyword">const</span> self& x) : t(x.t) {} 92<a name="l00113"></a><a class="code" href="classOscl__Map.html#a2">00113</a> self& <a class="code" href="classOscl__Map.html#a2">operator=</a>(<span class="keyword">const</span> self& x) 9300114 { 9400115 t = x.<a class="code" href="classOscl__Map.html#o0">t</a>; 9500116 <span class="keywordflow">return</span> *<span class="keyword">this</span>; 9600117 } 97<a name="l00121"></a><a class="code" href="classOscl__Map.html#a3">00121</a> key_compare <a class="code" href="classOscl__Map.html#a3">key_comp</a>()<span class="keyword"> const</span> 9800122 <span class="keyword"> </span>{ 9900123 <span class="keywordflow">return</span> t.key_comp(); 10000124 } 101<a name="l00128"></a><a class="code" href="classOscl__Map.html#a4">00128</a> value_compare <a class="code" href="classOscl__Map.html#a4">value_comp</a>()<span class="keyword"> const</span> 10200129 <span class="keyword"> </span>{ 10300130 <span class="keywordflow">return</span> value_compare(t.key_comp()); 10400131 } 105<a name="l00135"></a><a class="code" href="classOscl__Map.html#a5">00135</a> <a class="code" href="classOscl__Map.html#s7">iterator</a> <a class="code" href="classOscl__Map.html#a5">begin</a>() 10600136 { 10700137 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a4">begin</a>(); 10800138 } 109<a name="l00142"></a><a class="code" href="classOscl__Map.html#a6">00142</a> <a class="code" href="classOscl__Map.html#s8">const_iterator</a> <a class="code" href="classOscl__Map.html#a5">begin</a>()<span class="keyword"> const</span> 11000143 <span class="keyword"> </span>{ 11100144 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a4">begin</a>(); 11200145 } 113<a name="l00149"></a><a class="code" href="classOscl__Map.html#a7">00149</a> <a class="code" href="classOscl__Map.html#s7">iterator</a> <a class="code" href="classOscl__Map.html#a7">end</a>() 11400150 { 11500151 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a6">end</a>(); 11600152 } 117<a name="l00156"></a><a class="code" href="classOscl__Map.html#a8">00156</a> <a class="code" href="classOscl__Map.html#s8">const_iterator</a> <a class="code" href="classOscl__Map.html#a7">end</a>()<span class="keyword"> const</span> 11800157 <span class="keyword"> </span>{ 11900158 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a6">end</a>(); 12000159 } 121<a name="l00163"></a><a class="code" href="classOscl__Map.html#a9">00163</a> <span class="keywordtype">bool</span> <a class="code" href="classOscl__Map.html#a9">empty</a>()<span class="keyword"> const</span> 12200164 <span class="keyword"> </span>{ 12300165 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a8">empty</a>(); 12400166 } 125<a name="l00170"></a><a class="code" href="classOscl__Map.html#a10">00170</a> <a class="code" href="classOscl__Map.html#s9">size_type</a> <a class="code" href="classOscl__Map.html#a10">size</a>()<span class="keyword"> const</span> 12600171 <span class="keyword"> </span>{ 12700172 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a9">size</a>(); 12800173 } 129<a name="l00177"></a><a class="code" href="classOscl__Map.html#a11">00177</a> <a class="code" href="classOscl__Map.html#s9">size_type</a> <a class="code" href="classOscl__Map.html#a11">max_size</a>()<span class="keyword"> const</span> 13000178 <span class="keyword"> </span>{ 13100179 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a10">max_size</a>(); 13200180 } 133<a name="l00185"></a><a class="code" href="classOscl__Map.html#a12">00185</a> T& <a class="code" href="classOscl__Map.html#a12">operator[]</a>(<span class="keyword">const</span> key_type& k) 13400186 { 13500187 <span class="keywordflow">return</span> (*((<a class="code" href="classOscl__Map.html#a13">insert</a>(<a class="code" href="classOscl__Map.html#s2">value_type</a>(k, T()))).first)).second; 13600188 } 13700189 <span class="comment">// void swap(map<Key, T, Compare>& x) { t.swap(x.t); }</span> 13800190 13900191 140<a name="l00192"></a><a class="code" href="classOscl__Map.html#s10">00192</a> <span class="keyword">typedef</span> <a class="code" href="structOscl__Pair.html">Oscl_Pair<iterator, bool></a> <a class="code" href="structOscl__Pair.html">pair_iterator_bool</a>; 141<a name="l00196"></a><a class="code" href="classOscl__Map.html#a13">00196</a> pair_iterator_bool <a class="code" href="classOscl__Map.html#a13">insert</a>(<span class="keyword">const</span> value_type& x) 14200197 { 14300198 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a11">insert_unique</a>(x); 14400199 } 145<a name="l00203"></a><a class="code" href="classOscl__Map.html#a14">00203</a> <a class="code" href="classOscl__Map.html#s7">iterator</a> <a class="code" href="classOscl__Map.html#a13">insert</a>(<a class="code" href="classOscl__Map.html#s7">iterator</a> position, <span class="keyword">const</span> value_type& x) 14600204 { 14700205 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a11">insert_unique</a>(position, x); 14800206 } 149<a name="l00210"></a><a class="code" href="classOscl__Map.html#a15">00210</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__Map.html#a13">insert</a>(<span class="keyword">const</span> value_type* first, <span class="keyword">const</span> value_type* last) 15000211 { 15100212 t.<a class="code" href="classOscl__Rb__Tree.html#a11">insert_unique</a>(first, last); 15200213 } 153<a name="l00217"></a><a class="code" href="classOscl__Map.html#a16">00217</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__Map.html#a16">erase</a>(<a class="code" href="classOscl__Map.html#s7">iterator</a> position) 15400218 { 15500219 t.<a class="code" href="classOscl__Rb__Tree.html#a15">erase</a>(position); 15600220 } 157<a name="l00224"></a><a class="code" href="classOscl__Map.html#a17">00224</a> <a class="code" href="classOscl__Map.html#s9">size_type</a> <a class="code" href="classOscl__Map.html#a16">erase</a>(<span class="keyword">const</span> key_type& x) 15800225 { 15900226 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a15">erase</a>(x); 16000227 } 161<a name="l00231"></a><a class="code" href="classOscl__Map.html#a18">00231</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__Map.html#a16">erase</a>(<a class="code" href="classOscl__Map.html#s7">iterator</a> first, <a class="code" href="classOscl__Map.html#s7">iterator</a> last) 16200232 { 16300233 t.<a class="code" href="classOscl__Rb__Tree.html#a15">erase</a>(first, last); 16400234 } 165<a name="l00238"></a><a class="code" href="classOscl__Map.html#a19">00238</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__Map.html#a19">clear</a>() 16600239 { 16700240 t.<a class="code" href="classOscl__Rb__Tree.html#a19">clear</a>(); 16800241 } 169<a name="l00245"></a><a class="code" href="classOscl__Map.html#a20">00245</a> <a class="code" href="classOscl__Map.html#s7">iterator</a> <a class="code" href="classOscl__Map.html#a20">find</a>(<span class="keyword">const</span> key_type& x) 17000246 { 17100247 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a20">find</a>(x); 17200248 } 173<a name="l00252"></a><a class="code" href="classOscl__Map.html#a21">00252</a> <a class="code" href="classOscl__Map.html#s8">const_iterator</a> <a class="code" href="classOscl__Map.html#a20">find</a>(<span class="keyword">const</span> key_type& x)<span class="keyword"> const</span> 17400253 <span class="keyword"> </span>{ 17500254 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a20">find</a>(x); 17600255 } 177<a name="l00259"></a><a class="code" href="classOscl__Map.html#a22">00259</a> <a class="code" href="classOscl__Map.html#s9">size_type</a> <a class="code" href="classOscl__Map.html#a22">count</a>(<span class="keyword">const</span> key_type& x)<span class="keyword"> const</span> 17800260 <span class="keyword"> </span>{ 17900261 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a22">count</a>(x); 18000262 } 181<a name="l00266"></a><a class="code" href="classOscl__Map.html#a23">00266</a> <a class="code" href="classOscl__Map.html#s7">iterator</a> <a class="code" href="classOscl__Map.html#a23">lower_bound</a>(<span class="keyword">const</span> key_type& x) 18200267 { 18300268 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a23">lower_bound</a>(x); 18400269 } 185<a name="l00273"></a><a class="code" href="classOscl__Map.html#a24">00273</a> <a class="code" href="classOscl__Map.html#s8">const_iterator</a> <a class="code" href="classOscl__Map.html#a23">lower_bound</a>(<span class="keyword">const</span> key_type& x)<span class="keyword"> const</span> 18600274 <span class="keyword"> </span>{ 18700275 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a23">lower_bound</a>(x); 18800276 } 189<a name="l00280"></a><a class="code" href="classOscl__Map.html#a25">00280</a> <a class="code" href="classOscl__Map.html#s7">iterator</a> <a class="code" href="classOscl__Map.html#a25">upper_bound</a>(<span class="keyword">const</span> key_type& x) 19000281 { 19100282 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a25">upper_bound</a>(x); 19200283 } 193<a name="l00287"></a><a class="code" href="classOscl__Map.html#a26">00287</a> <a class="code" href="classOscl__Map.html#s8">const_iterator</a> <a class="code" href="classOscl__Map.html#a25">upper_bound</a>(<span class="keyword">const</span> key_type& x)<span class="keyword"> const</span> 19400288 <span class="keyword"> </span>{ 19500289 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a25">upper_bound</a>(x); 19600290 } 197<a name="l00291"></a><a class="code" href="classOscl__Map.html#s11">00291</a> <span class="keyword">typedef</span> <a class="code" href="structOscl__Pair.html">Oscl_Pair<iterator, iterator></a> <a class="code" href="structOscl__Pair.html">pair_iterator_iterator</a>; 198<a name="l00295"></a><a class="code" href="classOscl__Map.html#a27">00295</a> pair_iterator_iterator <a class="code" href="classOscl__Map.html#a27">equal_range</a>(<span class="keyword">const</span> key_type& x) 19900296 { 20000297 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a27">equal_range</a>(x); 20100298 } 202<a name="l00299"></a><a class="code" href="classOscl__Map.html#s12">00299</a> <span class="keyword">typedef</span> <a class="code" href="structOscl__Pair.html">Oscl_Pair<const_iterator, const_iterator></a> <a class="code" href="structOscl__Pair.html">pair_citerator_citerator</a>; 203<a name="l00303"></a><a class="code" href="classOscl__Map.html#a28">00303</a> pair_citerator_citerator <a class="code" href="classOscl__Map.html#a27">equal_range</a>(<span class="keyword">const</span> key_type& x)<span class="keyword"> const</span> 20400304 <span class="keyword"> </span>{ 20500305 <span class="keywordflow">return</span> t.<a class="code" href="classOscl__Rb__Tree.html#a27">equal_range</a>(x); 20600306 } 20700307 20800308 <span class="keyword">private</span>: 20900309 21000310 }; 21100311 21200312 <span class="comment">//template <class Key, class T, class Compare></span> 21300313 <span class="comment">//inline bool operator==(const map<Key, T, Compare>& x,</span> 21400314 <span class="comment">// const map<Key, T, Compare>& y) {</span> 21500315 <span class="comment">// return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());</span> 21600316 <span class="comment">//}</span> 21700317 21800318 <span class="comment">//template <class Key, class T, class Compare></span> 21900319 <span class="comment">//inline bool operator<(const map<Key, T, Compare>& x,</span> 22000320 <span class="comment">// const map<Key, T, Compare>& y) {</span> 22100321 <span class="comment">// return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());</span> 22200322 <span class="comment">//}</span> 22300323 22400324 22500328 <span class="preprocessor">#endif</span> 226</pre></div><hr size="1"><img src="pvlogo_small.jpg"><address style="align: right;"><small>OSCL API</small> 227<address style="align: left;"><small>Posting Version: OPENCORE_20090310 </small> 228</small></address> 229</body> 230</html> 231