Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > c200d180bc1063a7706e0da42a546b51 > files > 69

atlascpp-devel-0.6.1-7.fc12.x86_64.rpm

<!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&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;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&nbsp;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 &lt;Atlas/Exception.h&gt;</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;string&gt;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;map&gt;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;vector&gt;</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&lt;std::string, Element&gt; MapType;
<a name="l00030"></a>00030 <span class="keyword">typedef</span> std::vector&lt;Element&gt; 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&amp; 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&lt;StringType&gt;(v);
<a name="l00141"></a>00141       <span class="keywordflow">else</span>
<a name="l00142"></a>00142         s = <span class="keyword">new</span> DataType&lt;StringType&gt;();
<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&amp; 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&lt;StringType&gt;(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&amp; 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&lt;MapType&gt;(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&amp; 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&lt;ListType&gt;(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>&amp; 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>&amp; 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>&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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-&gt;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&lt;StringType&gt;(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&amp; operator=(<span class="keyword">const</span> StringType &amp; v) 
<a name="l00240"></a>00240     {
<a name="l00241"></a>00241       <span class="keywordflow">if</span> (TYPE_STRING != t || !s-&gt;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&lt;StringType&gt;(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&amp; operator=(<span class="keyword">const</span> MapType &amp; v) 
<a name="l00252"></a>00252     {
<a name="l00253"></a>00253       <span class="keywordflow">if</span> (TYPE_MAP != t || !m-&gt;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&lt;MapType&gt;(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&amp; operator=(<span class="keyword">const</span> ListType &amp; v) 
<a name="l00264"></a>00264     {
<a name="l00265"></a>00265       <span class="keywordflow">if</span> (TYPE_LIST != t || !l-&gt;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&lt;ListType&gt;(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&amp; o) <span class="keyword">const</span>;
<a name="l00277"></a>00277 
<a name="l00278"></a>00278 <span class="preprocessor">#if defined(__GNUC__) &amp;&amp; __GNUC__ &lt; 3</span>
<a name="l00279"></a>00279 <span class="preprocessor"></span>    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> Element&amp; 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__) &amp;&amp; __GNUC__ &lt; 3</span>
<a name="l00284"></a>00284 <span class="preprocessor"></span>    
<a name="l00286"></a>00286     <span class="keyword">template</span>&lt;<span class="keyword">class</span> C&gt;
<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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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&amp; 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-&gt;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&amp; 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&amp; String()
<a name="l00415"></a>00415     {
<a name="l00416"></a>00416         <span class="keywordflow">return</span> *(s = s-&gt;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&amp; 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&amp; 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-&gt;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&amp; 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&amp; Map()
<a name="l00435"></a>00435     {
<a name="l00436"></a>00436         <span class="keywordflow">return</span> *(m = m-&gt;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&amp; 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&amp; 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-&gt;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&amp; 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&amp; List()
<a name="l00455"></a>00455     {
<a name="l00456"></a>00456         <span class="keywordflow">return</span> *(l = l-&gt;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>&lt;<span class="keyword">class</span> C&gt;
<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&amp; c) : _refcount(1), _data(c) {}
<a name="l00469"></a>00469 
<a name="l00470"></a>00470         DataType&amp; operator=(<span class="keyword">const</span> C&amp; 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&amp; 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 &gt; 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&amp;() {<span class="keywordflow">return</span> _data;}
<a name="l00487"></a>00487 <span class="comment">//        operator const C&amp;() 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&amp;); <span class="comment">// unimplemented</span>
<a name="l00491"></a>00491         DataType&amp; operator=(<span class="keyword">const</span> DataType&amp;); <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&lt;StringType&gt;* s;
<a name="l00503"></a>00503       DataType&lt;MapType&gt;* m;
<a name="l00504"></a>00504       DataType&lt;ListType&gt;* 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>