Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 626e7b9df2c26f4a1ac4abc5819592a1 > files > 89

atlascpp-devel-0.6.2-1.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Atlas-C++: SmartPtr.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.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Atlas-C++</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;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 id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<div class="title">SmartPtr.h</div>  </div>
</div>
<div class="contents">
<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 Aloril</span>
<a name="l00004"></a>00004 <span class="comment">// Copyright (C) 2000-2005 Al Riddoch</span>
<a name="l00005"></a>00005 
<a name="l00006"></a>00006 <span class="comment">// $Id$</span>
<a name="l00007"></a>00007 
<a name="l00008"></a>00008 <span class="preprocessor">#ifndef ATLAS_OBJECTS_SMARTPTR_H</span>
<a name="l00009"></a>00009 <span class="preprocessor"></span><span class="preprocessor">#define ATLAS_OBJECTS_SMARTPTR_H</span>
<a name="l00010"></a>00010 <span class="preprocessor"></span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;Atlas/Exception.h&gt;</span>
<a name="l00012"></a>00012 
<a name="l00013"></a>00013 <span class="keyword">namespace </span>Atlas { <span class="keyword">namespace </span>Objects {
<a name="l00014"></a>00014 
<a name="l00015"></a><a class="code" href="class_atlas_1_1_objects_1_1_null_smart_ptr_dereference.html">00015</a> <span class="keyword">class </span><a class="code" href="class_atlas_1_1_objects_1_1_null_smart_ptr_dereference.html">NullSmartPtrDereference</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="l00016"></a>00016 {
<a name="l00017"></a>00017   <span class="keyword">public</span>:
<a name="l00018"></a>00018     <a class="code" href="class_atlas_1_1_objects_1_1_null_smart_ptr_dereference.html">NullSmartPtrDereference</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">&quot;Null SmartPtr dereferenced&quot;</span>) {}
<a name="l00019"></a>00019     <span class="keyword">virtual</span> ~<a class="code" href="class_atlas_1_1_objects_1_1_null_smart_ptr_dereference.html">NullSmartPtrDereference</a>() <span class="keywordflow">throw</span> ();
<a name="l00020"></a>00020 };
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; 
<a name="l00023"></a><a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">00023</a> <span class="keyword">class </span><a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>
<a name="l00024"></a>00024 {
<a name="l00025"></a>00025   <span class="keyword">public</span>:
<a name="l00026"></a>00026     <span class="keyword">typedef</span> T DataT;
<a name="l00027"></a>00027 
<a name="l00028"></a>00028     <span class="keyword">typedef</span> <span class="keyword">typename</span> T::iterator iterator;
<a name="l00029"></a>00029     <span class="keyword">typedef</span> <span class="keyword">typename</span> T::const_iterator const_iterator;
<a name="l00030"></a>00030 
<a name="l00031"></a>00031     <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>() : ptr(T::alloc()) { 
<a name="l00032"></a>00032     }
<a name="l00033"></a>00033     <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>(<span class="keyword">const</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;T&gt;</a>&amp; a) : ptr(a.get()) {
<a name="l00034"></a>00034         incRef();
<a name="l00035"></a>00035     }
<a name="l00036"></a>00036     <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>(T *a_ptr) : ptr(a_ptr)
<a name="l00037"></a>00037     {
<a name="l00038"></a>00038         incRef();
<a name="l00039"></a>00039     }
<a name="l00040"></a>00040     <span class="keyword">template</span>&lt;<span class="keyword">class</span> oldType&gt;
<a name="l00041"></a>00041     <span class="keyword">explicit</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>(<span class="keyword">const</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;oldType&gt;</a>&amp; a) : ptr(a.get()) {
<a name="l00042"></a>00042     }
<a name="l00043"></a>00043     ~<a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>() { 
<a name="l00044"></a>00044         decRef();
<a name="l00045"></a>00045     }
<a name="l00046"></a>00046     <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;T&gt;</a>&amp; a) {
<a name="l00047"></a>00047         <span class="keywordflow">if</span> (a.get() != this-&gt;<span class="keyword">get</span>()) {
<a name="l00048"></a>00048             decRef();
<a name="l00049"></a>00049             ptr = a.get();
<a name="l00050"></a>00050             incRef();
<a name="l00051"></a>00051         }
<a name="l00052"></a>00052         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00053"></a>00053     }
<a name="l00054"></a>00054     <span class="keyword">template</span>&lt;<span class="keyword">class</span> newType&gt;
<a name="l00055"></a>00055     operator SmartPtr&lt;newType&gt;()<span class="keyword"> const </span>{
<a name="l00056"></a>00056         <span class="keywordflow">return</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;newType&gt;</a>(ptr);
<a name="l00057"></a>00057     }
<a name="l00058"></a>00058     <span class="keyword">template</span>&lt;<span class="keyword">class</span> newType&gt;
<a name="l00059"></a>00059     operator SmartPtr&lt;const newType&gt;()<span class="keyword"> const </span>{
<a name="l00060"></a>00060         <span class="keywordflow">return</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;const newType&gt;</a>(ptr);
<a name="l00061"></a>00061     }
<a name="l00062"></a>00062     <span class="keywordtype">bool</span> isValid()<span class="keyword"> const </span>{
<a name="l00063"></a>00063         <span class="keywordflow">return</span> ptr != 0;
<a name="l00064"></a>00064     }
<a name="l00065"></a>00065     T&amp; operator*()<span class="keyword"> const </span>{ 
<a name="l00066"></a>00066         <span class="keywordflow">if</span> (ptr == 0) {
<a name="l00067"></a>00067             <span class="keywordflow">throw</span> <a class="code" href="class_atlas_1_1_objects_1_1_null_smart_ptr_dereference.html">NullSmartPtrDereference</a>();
<a name="l00068"></a>00068         }
<a name="l00069"></a>00069         <span class="keywordflow">return</span> *ptr;
<a name="l00070"></a>00070     }
<a name="l00071"></a>00071     T* operator-&gt;()<span class="keyword"> const </span>{
<a name="l00072"></a>00072         <span class="keywordflow">if</span> (ptr == 0) {
<a name="l00073"></a>00073             <span class="keywordflow">throw</span> <a class="code" href="class_atlas_1_1_objects_1_1_null_smart_ptr_dereference.html">NullSmartPtrDereference</a>();
<a name="l00074"></a>00074         }
<a name="l00075"></a>00075         <span class="keywordflow">return</span> ptr;
<a name="l00076"></a>00076     }
<a name="l00077"></a>00077     T* <span class="keyword">get</span>() <span class="keyword">const</span> {
<a name="l00078"></a>00078         <span class="keywordflow">return</span> ptr;
<a name="l00079"></a>00079     }
<a name="l00080"></a>00080     <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;T&gt;</a> copy()<span class="keyword"> const</span>
<a name="l00081"></a>00081 <span class="keyword">    </span>{
<a name="l00082"></a>00082         <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;T&gt;</a> ret = <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>(ptr-&gt;copy());
<a name="l00083"></a>00083         ret.decRef();
<a name="l00084"></a>00084         <span class="keywordflow">return</span> ret;
<a name="l00085"></a>00085     }
<a name="l00086"></a>00086     <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;T&gt;</a> getDefaultObject()<span class="keyword"> const</span>
<a name="l00087"></a>00087 <span class="keyword">    </span>{
<a name="l00088"></a>00088         <span class="keywordflow">return</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr</a>(ptr-&gt;getDefaultObject());
<a name="l00089"></a>00089     }
<a name="l00090"></a>00090     <span class="comment">// If you want to make these protected, please ensure that the</span>
<a name="l00091"></a>00091     <span class="comment">// detructor is made virtual to ensure your new class bahaves</span>
<a name="l00092"></a>00092     <span class="comment">// correctly.</span>
<a name="l00093"></a>00093   <span class="keyword">private</span>:
<a name="l00094"></a>00094     <span class="keywordtype">void</span> decRef()<span class="keyword"> const </span>{
<a name="l00095"></a>00095         <span class="keywordflow">if</span> (ptr != 0) {
<a name="l00096"></a>00096             ptr-&gt;decRef();
<a name="l00097"></a>00097         }
<a name="l00098"></a>00098     }
<a name="l00099"></a>00099     <span class="keywordtype">void</span> incRef()<span class="keyword"> const </span>{
<a name="l00100"></a>00100         <span class="keywordflow">if</span> (ptr != 0) {
<a name="l00101"></a>00101             ptr-&gt;incRef();
<a name="l00102"></a>00102         }
<a name="l00103"></a>00103     }
<a name="l00104"></a>00104     T * ptr;
<a name="l00105"></a>00105 };
<a name="l00106"></a>00106 
<a name="l00107"></a>00107 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> returnPtrType, <span class="keyword">class</span> fromType&gt;
<a name="l00108"></a>00108 returnPtrType smart_dynamic_cast(<span class="keyword">const</span> <a class="code" href="class_atlas_1_1_objects_1_1_smart_ptr.html">SmartPtr&lt;fromType&gt;</a> &amp; o)
<a name="l00109"></a>00109 {
<a name="l00110"></a>00110     <span class="keywordflow">return</span> returnPtrType(dynamic_cast&lt;typename returnPtrType::DataT*&gt;(o.get()));
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112 
<a name="l00113"></a>00113 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> returnPtrType, <span class="keyword">class</span> fromType&gt;
<a name="l00114"></a>00114 returnPtrType smart_static_cast(<span class="keyword">const</span> SmartPtr&lt;fromType&gt; &amp; o)
<a name="l00115"></a>00115 {
<a name="l00116"></a>00116     <span class="keywordflow">return</span> returnPtrType((<span class="keyword">typename</span> returnPtrType::DataT *)o.get());
<a name="l00117"></a>00117 }
<a name="l00118"></a>00118 
<a name="l00119"></a>00119 } } <span class="comment">// namespace Atlas::Objects</span>
<a name="l00120"></a>00120 
<a name="l00121"></a>00121 <span class="preprocessor">#endif // ATLAS_OBJECTS_SMARTPTR_H</span>
</pre></div></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>