<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Atlas-C++: Element.h Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.5.9 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul> </div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> </ul> </div> <h1>Element.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// This file may be redistributed and modified only under the terms of</span> <a name="l00002"></a>00002 <span class="comment">// the GNU Lesser General Public License (See COPYING for details).</span> <a name="l00003"></a>00003 <span class="comment">// Copyright (C) 2000-2001 Stefanus Du Toit, Karsten-O. Laux and Al Riddoch</span> <a name="l00004"></a>00004 <a name="l00005"></a>00005 <span class="preprocessor">#ifndef ATLAS_MESSAGE_ELEMENT_H</span> <a name="l00006"></a>00006 <span class="preprocessor"></span><span class="preprocessor">#define ATLAS_MESSAGE_ELEMENT_H</span> <a name="l00007"></a>00007 <span class="preprocessor"></span> <a name="l00008"></a>00008 <span class="preprocessor">#include <Atlas/Exception.h></span> <a name="l00009"></a>00009 <a name="l00010"></a>00010 <span class="preprocessor">#include <string></span> <a name="l00011"></a>00011 <span class="preprocessor">#include <map></span> <a name="l00012"></a>00012 <span class="preprocessor">#include <vector></span> <a name="l00013"></a>00013 <a name="l00014"></a>00014 <span class="keyword">namespace </span>Atlas { <span class="keyword">namespace </span>Message { <a name="l00015"></a>00015 <a name="l00017"></a><a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html">00017</a> <span class="keyword">class </span><a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a> : <span class="keyword">public</span> Atlas::<a class="code" href="class_atlas_1_1_exception.html" title="Base class for all exceptions thrown by Atlas-C++.">Exception</a> <a name="l00018"></a>00018 { <a name="l00019"></a>00019 <span class="keyword">public</span>: <a name="l00020"></a>00020 <a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>() : <a class="code" href="class_atlas_1_1_exception.html" title="Base class for all exceptions thrown by Atlas-C++.">Atlas::Exception</a>(<span class="stringliteral">"Wrong Message::Element type"</span>) { } <a name="l00021"></a>00021 }; <a name="l00022"></a>00022 <a name="l00023"></a>00023 <span class="keyword">class </span><a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>; <a name="l00024"></a>00024 <a name="l00025"></a>00025 <span class="keyword">typedef</span> <span class="keywordtype">long</span> IntType; <a name="l00026"></a>00026 <span class="keyword">typedef</span> <span class="keywordtype">double</span> FloatType; <a name="l00027"></a>00027 <span class="keyword">typedef</span> <span class="keywordtype">void</span> * PtrType; <a name="l00028"></a>00028 <span class="keyword">typedef</span> std::string StringType; <a name="l00029"></a>00029 <span class="keyword">typedef</span> std::map<std::string, Element> MapType; <a name="l00030"></a>00030 <span class="keyword">typedef</span> std::vector<Element> ListType; <a name="l00031"></a>00031 <a name="l00057"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html">00057</a> <span class="keyword">class </span><a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a> <a name="l00058"></a>00058 { <a name="l00059"></a>00059 <span class="keyword">public</span>: <a name="l00060"></a>00060 <span class="keyword">enum</span> Type { <a name="l00061"></a>00061 TYPE_NONE, <a name="l00062"></a>00062 TYPE_INT, <a name="l00063"></a>00063 TYPE_FLOAT, <a name="l00064"></a>00064 TYPE_PTR, <a name="l00065"></a>00065 TYPE_STRING, <a name="l00066"></a>00066 TYPE_MAP, <a name="l00067"></a>00067 TYPE_LIST <a name="l00068"></a>00068 }; <a name="l00069"></a>00069 <a name="l00070"></a>00070 <span class="keyword">private</span>: <a name="l00071"></a>00071 <span class="comment">// These are now legacy typedefs. New code should use the</span> <a name="l00072"></a>00072 <span class="comment">// Atlas::Message::*Type versions.</span> <a name="l00073"></a>00073 <span class="keyword">typedef</span> Atlas::Message::IntType IntType; <a name="l00074"></a>00074 <span class="keyword">typedef</span> Atlas::Message::FloatType FloatType; <a name="l00075"></a>00075 <span class="keyword">typedef</span> Atlas::Message::PtrType PtrType; <a name="l00076"></a>00076 <span class="keyword">typedef</span> Atlas::Message::StringType StringType; <a name="l00077"></a>00077 <span class="keyword">typedef</span> Atlas::Message::MapType MapType; <a name="l00078"></a>00078 <span class="keyword">typedef</span> Atlas::Message::ListType ListType; <a name="l00079"></a>00079 <a name="l00081"></a>00081 <span class="keywordtype">void</span> clear(Type new_type = TYPE_NONE); <a name="l00082"></a>00082 <a name="l00083"></a>00083 <span class="keyword">public</span>: <a name="l00085"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#9d672b44fa137c737e0c6452337bbef6">00085</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>() <a name="l00086"></a>00086 : t(TYPE_NONE) <a name="l00087"></a>00087 { <a name="l00088"></a>00088 } <a name="l00089"></a>00089 <a name="l00091"></a>00091 ~<a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>() <a name="l00092"></a>00092 { <a name="l00093"></a>00093 clear(); <a name="l00094"></a>00094 } <a name="l00095"></a>00095 <a name="l00097"></a>00097 Element(<span class="keyword">const</span> Element& obj); <a name="l00098"></a>00098 <a name="l00100"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#4be54f577f2dc6abbc1b179dad555832">00100</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keywordtype">int</span> v) <a name="l00101"></a>00101 : t(TYPE_INT), i(v) <a name="l00102"></a>00102 { <a name="l00103"></a>00103 } <a name="l00104"></a>00104 <a name="l00106"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#17f78e2b9ca63006ff0bae3dc5186513">00106</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keywordtype">bool</span> v) <a name="l00107"></a>00107 : t(TYPE_INT), i(v) <a name="l00108"></a>00108 { <a name="l00109"></a>00109 } <a name="l00110"></a>00110 <a name="l00112"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#050c6ea9c21a842543e6d595bfbaa330">00112</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(IntType v) <a name="l00113"></a>00113 : t(TYPE_INT), i(v) <a name="l00114"></a>00114 { <a name="l00115"></a>00115 } <a name="l00116"></a>00116 <a name="l00118"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#ab6a6ba79132ac7377484363dca318aa">00118</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keywordtype">float</span> v) <a name="l00119"></a>00119 : t(TYPE_FLOAT), f(v) <a name="l00120"></a>00120 { <a name="l00121"></a>00121 } <a name="l00122"></a>00122 <a name="l00124"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#0d7c50947cc213c6bae6d1b4ba1365c9">00124</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(FloatType v) <a name="l00125"></a>00125 : t(TYPE_FLOAT), f(v) <a name="l00126"></a>00126 { <a name="l00127"></a>00127 } <a name="l00128"></a>00128 <a name="l00130"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#612a6f4b1a10d1245bf3848627da5cc2">00130</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(PtrType v) <a name="l00131"></a>00131 : t(TYPE_PTR), p(v) <a name="l00132"></a>00132 { <a name="l00133"></a>00133 } <a name="l00134"></a>00134 <a name="l00136"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#3e2c6b6ef7538df1422d0abfb6485c05">00136</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* v) <a name="l00137"></a>00137 : t(TYPE_STRING) <a name="l00138"></a>00138 { <a name="l00139"></a>00139 <span class="keywordflow">if</span>(v) <a name="l00140"></a>00140 s = <span class="keyword">new</span> DataType<StringType>(v); <a name="l00141"></a>00141 <span class="keywordflow">else</span> <a name="l00142"></a>00142 s = <span class="keyword">new</span> DataType<StringType>(); <a name="l00143"></a>00143 } <a name="l00144"></a>00144 <a name="l00146"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#06d477c06eea8f3c5d3df5d69e055a14">00146</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keyword">const</span> StringType& v) <a name="l00147"></a>00147 : t(TYPE_STRING) <a name="l00148"></a>00148 { <a name="l00149"></a>00149 s = <span class="keyword">new</span> DataType<StringType>(v); <a name="l00150"></a>00150 } <a name="l00152"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#e7e30d1975ef9f971f057a42628cae25">00152</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keyword">const</span> MapType& v) <a name="l00153"></a>00153 : t(TYPE_MAP) <a name="l00154"></a>00154 { <a name="l00155"></a>00155 m = <span class="keyword">new</span> DataType<MapType>(v); <a name="l00156"></a>00156 } <a name="l00158"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#abf8cd76bd2736f16ae725313e1a0f78">00158</a> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>(<span class="keyword">const</span> ListType& v) <a name="l00159"></a>00159 : t(TYPE_LIST) <a name="l00160"></a>00160 { <a name="l00161"></a>00161 l = <span class="keyword">new</span> DataType<ListType>(v); <a name="l00162"></a>00162 } <a name="l00163"></a>00163 <a name="l00165"></a>00165 <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>& operator=(<span class="keyword">const</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>& obj); <a name="l00166"></a>00166 <a name="l00167"></a>00167 <a class="code" href="class_atlas_1_1_message_1_1_element.html" title="Multi-type container.">Element</a>& operator=(<span class="keywordtype">int</span> v) <a name="l00168"></a>00168 { <a name="l00169"></a>00169 <span class="keywordflow">if</span> (TYPE_INT != t) <a name="l00170"></a>00170 { <a name="l00171"></a>00171 clear(TYPE_INT); <a name="l00172"></a>00172 } <a name="l00173"></a>00173 i = v; <a name="l00174"></a>00174 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00175"></a>00175 } <a name="l00176"></a>00176 <a name="l00177"></a>00177 Element& operator=(<span class="keywordtype">bool</span> v) <a name="l00178"></a>00178 { <a name="l00179"></a>00179 <span class="keywordflow">if</span> (TYPE_INT != t) <a name="l00180"></a>00180 { <a name="l00181"></a>00181 clear(TYPE_INT); <a name="l00182"></a>00182 } <a name="l00183"></a>00183 i = v; <a name="l00184"></a>00184 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00185"></a>00185 } <a name="l00186"></a>00186 <a name="l00187"></a>00187 Element& operator=(IntType v) <a name="l00188"></a>00188 { <a name="l00189"></a>00189 <span class="keywordflow">if</span> (TYPE_INT != t) <a name="l00190"></a>00190 { <a name="l00191"></a>00191 clear(TYPE_INT); <a name="l00192"></a>00192 } <a name="l00193"></a>00193 i = v; <a name="l00194"></a>00194 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00195"></a>00195 } <a name="l00196"></a>00196 <a name="l00197"></a>00197 Element& operator=(<span class="keywordtype">float</span> v) <a name="l00198"></a>00198 { <a name="l00199"></a>00199 <span class="keywordflow">if</span> (TYPE_FLOAT != t) <a name="l00200"></a>00200 { <a name="l00201"></a>00201 clear(TYPE_FLOAT); <a name="l00202"></a>00202 } <a name="l00203"></a>00203 f = v; <a name="l00204"></a>00204 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00205"></a>00205 } <a name="l00206"></a>00206 <a name="l00207"></a>00207 Element& operator=(FloatType v) <a name="l00208"></a>00208 { <a name="l00209"></a>00209 <span class="keywordflow">if</span> (TYPE_FLOAT != t) <a name="l00210"></a>00210 { <a name="l00211"></a>00211 clear(TYPE_FLOAT); <a name="l00212"></a>00212 } <a name="l00213"></a>00213 f = v; <a name="l00214"></a>00214 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00215"></a>00215 } <a name="l00216"></a>00216 <a name="l00217"></a>00217 Element& operator=(PtrType v) <a name="l00218"></a>00218 { <a name="l00219"></a>00219 <span class="keywordflow">if</span> (TYPE_PTR != t) <a name="l00220"></a>00220 { <a name="l00221"></a>00221 clear(TYPE_PTR); <a name="l00222"></a>00222 } <a name="l00223"></a>00223 p = v; <a name="l00224"></a>00224 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00225"></a>00225 } <a name="l00226"></a>00226 <a name="l00227"></a>00227 Element& operator=(<span class="keyword">const</span> <span class="keywordtype">char</span> * v) <a name="l00228"></a>00228 { <a name="l00229"></a>00229 <span class="keywordflow">if</span> (TYPE_STRING != t || !s->unique()) <a name="l00230"></a>00230 { <a name="l00231"></a>00231 clear(TYPE_STRING); <a name="l00232"></a>00232 s = <span class="keyword">new</span> DataType<StringType>(v); <a name="l00233"></a>00233 } <span class="keywordflow">else</span> { <a name="l00234"></a>00234 *s = StringType(v); <a name="l00235"></a>00235 } <a name="l00236"></a>00236 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00237"></a>00237 } <a name="l00238"></a>00238 <a name="l00239"></a>00239 Element& operator=(<span class="keyword">const</span> StringType & v) <a name="l00240"></a>00240 { <a name="l00241"></a>00241 <span class="keywordflow">if</span> (TYPE_STRING != t || !s->unique()) <a name="l00242"></a>00242 { <a name="l00243"></a>00243 clear(TYPE_STRING); <a name="l00244"></a>00244 s = <span class="keyword">new</span> DataType<StringType>(v); <a name="l00245"></a>00245 } <span class="keywordflow">else</span> { <a name="l00246"></a>00246 *s = v; <a name="l00247"></a>00247 } <a name="l00248"></a>00248 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00249"></a>00249 } <a name="l00250"></a>00250 <a name="l00251"></a>00251 Element& operator=(<span class="keyword">const</span> MapType & v) <a name="l00252"></a>00252 { <a name="l00253"></a>00253 <span class="keywordflow">if</span> (TYPE_MAP != t || !m->unique()) <a name="l00254"></a>00254 { <a name="l00255"></a>00255 clear(TYPE_MAP); <a name="l00256"></a>00256 m = <span class="keyword">new</span> DataType<MapType>(v); <a name="l00257"></a>00257 } <span class="keywordflow">else</span> { <a name="l00258"></a>00258 *m = v; <a name="l00259"></a>00259 } <a name="l00260"></a>00260 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00261"></a>00261 } <a name="l00262"></a>00262 <a name="l00263"></a>00263 Element& operator=(<span class="keyword">const</span> ListType & v) <a name="l00264"></a>00264 { <a name="l00265"></a>00265 <span class="keywordflow">if</span> (TYPE_LIST != t || !l->unique()) <a name="l00266"></a>00266 { <a name="l00267"></a>00267 clear(TYPE_LIST); <a name="l00268"></a>00268 l = <span class="keyword">new</span> DataType<ListType>(v); <a name="l00269"></a>00269 } <span class="keywordflow">else</span> { <a name="l00270"></a>00270 *l = v; <a name="l00271"></a>00271 } <a name="l00272"></a>00272 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l00273"></a>00273 } <a name="l00274"></a>00274 <a name="l00276"></a>00276 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> Element& o) <span class="keyword">const</span>; <a name="l00277"></a>00277 <a name="l00278"></a>00278 <span class="preprocessor">#if defined(__GNUC__) && __GNUC__ < 3</span> <a name="l00279"></a>00279 <span class="preprocessor"></span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> Element& o)<span class="keyword"> const</span> <a name="l00280"></a>00280 <span class="keyword"> </span>{ <a name="l00281"></a>00281 <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == o); <a name="l00282"></a>00282 } <a name="l00283"></a>00283 <span class="preprocessor">#endif // defined(__GNUC__) && __GNUC__ < 3</span> <a name="l00284"></a>00284 <span class="preprocessor"></span> <a name="l00286"></a>00286 <span class="keyword">template</span><<span class="keyword">class</span> C> <a name="l00287"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#23edcc06db08800e26defaa5de365b85">00287</a> <span class="keywordtype">bool</span> operator!=(C c)<span class="keyword"> const</span> <a name="l00288"></a>00288 <span class="keyword"> </span>{ <a name="l00289"></a>00289 <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == c); <a name="l00290"></a>00290 } <a name="l00291"></a>00291 <a name="l00293"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#ccb353829d096c51f068e1d7016b6249">00293</a> <span class="keywordtype">bool</span> operator==(IntType v)<span class="keyword"> const</span> <a name="l00294"></a>00294 <span class="keyword"> </span>{ <a name="l00295"></a>00295 <span class="keywordflow">return</span> (t == TYPE_INT && i == v); <a name="l00296"></a>00296 } <a name="l00297"></a>00297 <a name="l00299"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#4a150f4207759102aa37d9696ce77240">00299</a> <span class="keywordtype">bool</span> operator==(FloatType v)<span class="keyword"> const</span> <a name="l00300"></a>00300 <span class="keyword"> </span>{ <a name="l00301"></a>00301 <span class="keywordflow">return</span> t == TYPE_FLOAT && f == v; <a name="l00302"></a>00302 } <a name="l00303"></a>00303 <a name="l00305"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#788dbe6928bd686ba5716737db950740">00305</a> <span class="keywordtype">bool</span> operator==(PtrType v)<span class="keyword"> const</span> <a name="l00306"></a>00306 <span class="keyword"> </span>{ <a name="l00307"></a>00307 <span class="keywordflow">return</span> t == TYPE_PTR && p == v; <a name="l00308"></a>00308 } <a name="l00309"></a>00309 <a name="l00311"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#471712da2ba22282e2f1bc950c954518">00311</a> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> <span class="keywordtype">char</span> * v)<span class="keyword"> const</span> <a name="l00312"></a>00312 <span class="keyword"> </span>{ <a name="l00313"></a>00313 <span class="keywordflow">if</span>(t == TYPE_STRING) <a name="l00314"></a>00314 <span class="keywordflow">return</span> (*s == v); <a name="l00315"></a>00315 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00316"></a>00316 } <a name="l00317"></a>00317 <a name="l00319"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#e3bd4c71d14c3cc23bc5e31db76bdeb7">00319</a> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> StringType& v)<span class="keyword"> const</span> <a name="l00320"></a>00320 <span class="keyword"> </span>{ <a name="l00321"></a>00321 <span class="keywordflow">if</span>(t == TYPE_STRING) <a name="l00322"></a>00322 <span class="keywordflow">return</span> (*s == v); <a name="l00323"></a>00323 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00324"></a>00324 } <a name="l00325"></a>00325 <a name="l00327"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#6ce7257a4e7f0ba9fba0dce6af3f4150">00327</a> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> MapType& v)<span class="keyword"> const</span> <a name="l00328"></a>00328 <span class="keyword"> </span>{ <a name="l00329"></a>00329 <span class="keywordflow">if</span>(t == TYPE_MAP) <a name="l00330"></a>00330 <span class="keywordflow">return</span> (*m == v); <a name="l00331"></a>00331 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00332"></a>00332 } <a name="l00333"></a>00333 <a name="l00335"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#2f44d67287dbff0fa2ede0e5c59b76cb">00335</a> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> ListType& v)<span class="keyword"> const</span> <a name="l00336"></a>00336 <span class="keyword"> </span>{ <a name="l00337"></a>00337 <span class="keywordflow">if</span> (t == TYPE_LIST) <a name="l00338"></a>00338 <span class="keywordflow">return</span> (*l == v); <a name="l00339"></a>00339 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00340"></a>00340 } <a name="l00341"></a>00341 <a name="l00343"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#f472a81ae77aed9485cf07fd6af9fbd6">00343</a> Type <a class="code" href="class_atlas_1_1_message_1_1_element.html#f472a81ae77aed9485cf07fd6af9fbd6" title="Get the current type.">getType</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> t; } <a name="l00345"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#a70fdeccddb6ec054981c7156f1c1249">00345</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#a70fdeccddb6ec054981c7156f1c1249" title="Check whether the current type is nothing.">isNone</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_NONE); } <a name="l00347"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#7de7529561dcc22283e0884b2c0c4b68">00347</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#7de7529561dcc22283e0884b2c0c4b68" title="Check whether the current type is int.">isInt</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_INT); } <a name="l00349"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#8e51cd879a08363c751375630821c4fe">00349</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#8e51cd879a08363c751375630821c4fe" title="Check whether the current type is double.">isFloat</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_FLOAT); } <a name="l00351"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#6c24657f0ebcbbd98d34e21eaf54ad66">00351</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#6c24657f0ebcbbd98d34e21eaf54ad66" title="Check whether the current type is pointer.">isPtr</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_PTR); } <a name="l00353"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#8966bf862a9ae619b7d21a5b11d34c7f">00353</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#8966bf862a9ae619b7d21a5b11d34c7f" title="Check whether the current type is numeric.">isNum</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ((t == TYPE_FLOAT) || (t == TYPE_INT)); } <a name="l00355"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#56941658ab61f4fa18db5b83d2684052">00355</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#56941658ab61f4fa18db5b83d2684052" title="Check whether the current type is std::string.">isString</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_STRING); } <a name="l00357"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#9d8b65d49d72f8f2d3380e0a043e9c50">00357</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#9d8b65d49d72f8f2d3380e0a043e9c50" title="Check whether the current type is MapType.">isMap</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_MAP); } <a name="l00359"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#f5322eb0edebd71d9f158459beec4b33">00359</a> <span class="keywordtype">bool</span> <a class="code" href="class_atlas_1_1_message_1_1_element.html#f5322eb0edebd71d9f158459beec4b33" title="Check whether the current type is ListType.">isList</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (t == TYPE_LIST); } <a name="l00360"></a>00360 <a name="l00362"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#0f13348d0e9ecec7782136c276903248">00362</a> IntType asInt() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00363"></a>00363 { <a name="l00364"></a>00364 <span class="keywordflow">if</span> (t == TYPE_INT) <span class="keywordflow">return</span> i; <a name="l00365"></a>00365 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00366"></a>00366 } <a name="l00367"></a>00367 IntType Int()<span class="keyword"> const</span> <a name="l00368"></a>00368 <span class="keyword"> </span>{ <a name="l00369"></a>00369 <span class="keywordflow">return</span> i; <a name="l00370"></a>00370 } <a name="l00372"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#f72f810ac0e3b08212a39e1ba26ed645">00372</a> FloatType asFloat() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00373"></a>00373 { <a name="l00374"></a>00374 <span class="keywordflow">if</span> (t == TYPE_FLOAT) <span class="keywordflow">return</span> f; <a name="l00375"></a>00375 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00376"></a>00376 } <a name="l00377"></a>00377 FloatType Float()<span class="keyword"> const</span> <a name="l00378"></a>00378 <span class="keyword"> </span>{ <a name="l00379"></a>00379 <span class="keywordflow">return</span> f; <a name="l00380"></a>00380 } <a name="l00382"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#d3fe6c53d5601ebe841cb70fae82d315">00382</a> PtrType asPtr() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00383"></a>00383 { <a name="l00384"></a>00384 <span class="keywordflow">if</span> (t == TYPE_PTR) <span class="keywordflow">return</span> p; <a name="l00385"></a>00385 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00386"></a>00386 } <a name="l00387"></a>00387 PtrType Ptr()<span class="keyword"> const</span> <a name="l00388"></a>00388 <span class="keyword"> </span>{ <a name="l00389"></a>00389 <span class="keywordflow">return</span> p; <a name="l00390"></a>00390 } <a name="l00392"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#9bbf88db833f91b54b5dc98f6e89ae58">00392</a> FloatType asNum() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00393"></a>00393 { <a name="l00394"></a>00394 <span class="keywordflow">if</span> (t == TYPE_FLOAT) <span class="keywordflow">return</span> f; <a name="l00395"></a>00395 <span class="keywordflow">if</span> (t == TYPE_INT) <span class="keywordflow">return</span> FloatType(i); <a name="l00396"></a>00396 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00397"></a>00397 } <a name="l00399"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#ed6dd89e1fcb594cd4b02bfafab3faa0">00399</a> <span class="keyword">const</span> std::string& asString() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00400"></a>00400 { <a name="l00401"></a>00401 <span class="keywordflow">if</span> (t == TYPE_STRING) <span class="keywordflow">return</span> *s; <a name="l00402"></a>00402 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00403"></a>00403 } <a name="l00405"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#7aa5f7c4c1cef5be35b3ac9dee2036e2">00405</a> std::string& asString() throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00406"></a>00406 { <a name="l00407"></a>00407 <span class="keywordflow">if</span> (t == TYPE_STRING) <span class="keywordflow">return</span> *(s = s->makeUnique()); <a name="l00408"></a>00408 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00409"></a>00409 } <a name="l00410"></a>00410 <span class="keyword">const</span> StringType& String()<span class="keyword"> const</span> <a name="l00411"></a>00411 <span class="keyword"> </span>{ <a name="l00412"></a>00412 <span class="keywordflow">return</span> *s; <a name="l00413"></a>00413 } <a name="l00414"></a>00414 StringType& String() <a name="l00415"></a>00415 { <a name="l00416"></a>00416 <span class="keywordflow">return</span> *(s = s->makeUnique()); <a name="l00417"></a>00417 } <a name="l00419"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#d3fd9f538daffc94ab983018983e6f89">00419</a> <span class="keyword">const</span> MapType& asMap() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00420"></a>00420 { <a name="l00421"></a>00421 <span class="keywordflow">if</span> (t == TYPE_MAP) <span class="keywordflow">return</span> *m; <a name="l00422"></a>00422 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00423"></a>00423 } <a name="l00425"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#7433be6062591c12edf93a84195847ac">00425</a> MapType& asMap() throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00426"></a>00426 { <a name="l00427"></a>00427 <span class="keywordflow">if</span> (t == TYPE_MAP) <span class="keywordflow">return</span> *(m = m->makeUnique()); <a name="l00428"></a>00428 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00429"></a>00429 } <a name="l00430"></a>00430 <span class="keyword">const</span> MapType& Map()<span class="keyword"> const</span> <a name="l00431"></a>00431 <span class="keyword"> </span>{ <a name="l00432"></a>00432 <span class="keywordflow">return</span> *m; <a name="l00433"></a>00433 } <a name="l00434"></a>00434 MapType& Map() <a name="l00435"></a>00435 { <a name="l00436"></a>00436 <span class="keywordflow">return</span> *(m = m->makeUnique()); <a name="l00437"></a>00437 } <a name="l00439"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#78c3ce3b25b9b3d2dd982b5134450f40">00439</a> <span class="keyword">const</span> ListType& asList() <span class="keyword">const</span> throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00440"></a>00440 { <a name="l00441"></a>00441 <span class="keywordflow">if</span> (t == TYPE_LIST) <span class="keywordflow">return</span> *l; <a name="l00442"></a>00442 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00443"></a>00443 } <a name="l00445"></a><a class="code" href="class_atlas_1_1_message_1_1_element.html#0560ce5a5032a1ef700858ca27320b7c">00445</a> ListType& asList() throw (<a class="code" href="class_atlas_1_1_message_1_1_wrong_type_exception.html" title="An exception class issued when the wrong type is requested in as().">WrongTypeException</a>) <a name="l00446"></a>00446 { <a name="l00447"></a>00447 <span class="keywordflow">if</span> (t == TYPE_LIST) <span class="keywordflow">return</span> *(l = l->makeUnique()); <a name="l00448"></a>00448 <span class="keywordflow">throw</span> WrongTypeException(); <a name="l00449"></a>00449 } <a name="l00450"></a>00450 <span class="keyword">const</span> ListType& List()<span class="keyword"> const</span> <a name="l00451"></a>00451 <span class="keyword"> </span>{ <a name="l00452"></a>00452 <span class="keywordflow">return</span> *l; <a name="l00453"></a>00453 } <a name="l00454"></a>00454 ListType& List() <a name="l00455"></a>00455 { <a name="l00456"></a>00456 <span class="keywordflow">return</span> *(l = l->makeUnique()); <a name="l00457"></a>00457 } <a name="l00458"></a>00458 <a name="l00459"></a>00459 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * typeName(Type); <a name="l00460"></a>00460 <a name="l00461"></a>00461 <span class="keyword">protected</span>: <a name="l00462"></a>00462 <a name="l00463"></a>00463 <span class="keyword">template</span><<span class="keyword">class</span> C> <a name="l00464"></a>00464 <span class="keyword">class </span>DataType <a name="l00465"></a>00465 { <a name="l00466"></a>00466 <span class="keyword">public</span>: <a name="l00467"></a>00467 DataType() : _refcount(1) {} <a name="l00468"></a>00468 DataType(<span class="keyword">const</span> C& c) : _refcount(1), _data(c) {} <a name="l00469"></a>00469 <a name="l00470"></a>00470 DataType& operator=(<span class="keyword">const</span> C& c) {_data = c; <span class="keywordflow">return</span> *<span class="keyword">this</span>;} <a name="l00471"></a>00471 <a name="l00472"></a>00472 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> C& c)<span class="keyword"> const </span>{<span class="keywordflow">return</span> _data == c;} <a name="l00473"></a>00473 <a name="l00474"></a>00474 <span class="keywordtype">void</span> ref() {++_refcount;} <a name="l00475"></a>00475 <span class="keywordtype">void</span> unref() {<span class="keywordflow">if</span>(--_refcount == 0) <span class="keyword">delete</span> <span class="keyword">this</span>;} <a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="keywordtype">bool</span> unique()<span class="keyword"> const </span>{<span class="keywordflow">return</span> _refcount == 1;} <a name="l00478"></a>00478 DataType* makeUnique() <a name="l00479"></a>00479 { <a name="l00480"></a>00480 <span class="keywordflow">if</span>(unique()) <a name="l00481"></a>00481 <span class="keywordflow">return</span> <span class="keyword">this</span>; <a name="l00482"></a>00482 unref(); <span class="comment">// _refcount > 1, so this is fine</span> <a name="l00483"></a>00483 <span class="keywordflow">return</span> <span class="keyword">new</span> DataType(_data); <a name="l00484"></a>00484 } <a name="l00485"></a>00485 <a name="l00486"></a>00486 operator C&() {<span class="keywordflow">return</span> _data;} <a name="l00487"></a>00487 <span class="comment">// operator const C&() const {return _data;}</span> <a name="l00488"></a>00488 <a name="l00489"></a>00489 <span class="keyword">private</span>: <a name="l00490"></a>00490 DataType(<span class="keyword">const</span> DataType&); <span class="comment">// unimplemented</span> <a name="l00491"></a>00491 DataType& operator=(<span class="keyword">const</span> DataType&); <span class="comment">// unimplemented</span> <a name="l00492"></a>00492 <a name="l00493"></a>00493 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _refcount; <a name="l00494"></a>00494 C _data; <a name="l00495"></a>00495 }; <a name="l00496"></a>00496 <a name="l00497"></a>00497 Type t; <a name="l00498"></a>00498 <span class="keyword">union </span>{ <a name="l00499"></a>00499 IntType i; <a name="l00500"></a>00500 FloatType f; <a name="l00501"></a>00501 <span class="keywordtype">void</span>* p; <a name="l00502"></a>00502 DataType<StringType>* s; <a name="l00503"></a>00503 DataType<MapType>* m; <a name="l00504"></a>00504 DataType<ListType>* l; <a name="l00505"></a>00505 }; <a name="l00506"></a>00506 }; <a name="l00507"></a>00507 <a name="l00508"></a>00508 } } <span class="comment">// namespace Atlas::Message</span> <a name="l00509"></a>00509 <a name="l00510"></a>00510 <a name="l00511"></a>00511 <span class="preprocessor">#endif // ATLAS_MESSAGE_ELEMENT_H</span> </pre></div></div> <HR> <P>Copyright 2000-2004 the respective authors.</P> <P>This document can be licensed under the terms of the GNU Free Documentation License or the GNU General Public License and may be freely distributed under the terms given by one of these licenses.</P>