Sophie

Sophie

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

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++: 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.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>SmartPtr.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 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="preprocessor">#ifndef ATLAS_OBJECTS_SMARTPTR_H</span>
<a name="l00007"></a>00007 <span class="preprocessor"></span><span class="preprocessor">#define ATLAS_OBJECTS_SMARTPTR_H</span>
<a name="l00008"></a>00008 <span class="preprocessor"></span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &lt;Atlas/Exception.h&gt;</span>
<a name="l00010"></a>00010 
<a name="l00011"></a>00011 <span class="keyword">namespace </span>Atlas { <span class="keyword">namespace </span>Objects {
<a name="l00012"></a>00012 
<a name="l00013"></a>00013 <span class="keyword">class </span>NullSmartPtrDereference : <span class="keyword">public</span> Atlas::Exception
<a name="l00014"></a>00014 {
<a name="l00015"></a>00015   <span class="keyword">public</span>:
<a name="l00016"></a>00016     NullSmartPtrDereference() : Atlas::Exception(<span class="stringliteral">"Null SmartPtr dereferenced"</span>) {}
<a name="l00017"></a>00017     <span class="keyword">virtual</span> ~NullSmartPtrDereference() throw ();
<a name="l00018"></a>00018 };
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 template &lt;class T&gt; 
<a name="l00021"></a>00021 class SmartPtr
<a name="l00022"></a>00022 {
<a name="l00023"></a>00023   <span class="keyword">public</span>:
<a name="l00024"></a>00024     <span class="keyword">typedef</span> T DataT;
<a name="l00025"></a>00025 
<a name="l00026"></a>00026     <span class="keyword">typedef</span> <span class="keyword">typename</span> T::iterator iterator;
<a name="l00027"></a>00027     <span class="keyword">typedef</span> <span class="keyword">typename</span> T::const_iterator const_iterator;
<a name="l00028"></a>00028 
<a name="l00029"></a>00029     SmartPtr() : ptr(T::alloc()) { 
<a name="l00030"></a>00030     }
<a name="l00031"></a>00031     SmartPtr(<span class="keyword">const</span> SmartPtr&lt;T&gt;&amp; a) : ptr(a.get()) {
<a name="l00032"></a>00032         incRef();
<a name="l00033"></a>00033     }
<a name="l00034"></a>00034     SmartPtr(T *a_ptr) : ptr(a_ptr)
<a name="l00035"></a>00035     {
<a name="l00036"></a>00036         incRef();
<a name="l00037"></a>00037     }
<a name="l00038"></a>00038     <span class="keyword">template</span>&lt;<span class="keyword">class</span> oldType&gt;
<a name="l00039"></a>00039     <span class="keyword">explicit</span> SmartPtr(<span class="keyword">const</span> SmartPtr&lt;oldType&gt;&amp; a) : ptr(a.get()) {
<a name="l00040"></a>00040     }
<a name="l00041"></a>00041     ~SmartPtr() { 
<a name="l00042"></a>00042         decRef();
<a name="l00043"></a>00043     }
<a name="l00044"></a>00044     SmartPtr&amp; operator=(<span class="keyword">const</span> SmartPtr&lt;T&gt;&amp; a) {
<a name="l00045"></a>00045         <span class="keywordflow">if</span> (a.get() != this-&gt;<span class="keyword">get</span>()) {
<a name="l00046"></a>00046             decRef();
<a name="l00047"></a>00047             ptr = a.get();
<a name="l00048"></a>00048             incRef();
<a name="l00049"></a>00049         }
<a name="l00050"></a>00050         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00051"></a>00051     }
<a name="l00052"></a>00052     <span class="keyword">template</span>&lt;<span class="keyword">class</span> newType&gt;
<a name="l00053"></a>00053     operator SmartPtr&lt;newType&gt;()<span class="keyword"> const </span>{
<a name="l00054"></a>00054         <span class="keywordflow">return</span> SmartPtr&lt;newType&gt;(ptr);
<a name="l00055"></a>00055     }
<a name="l00056"></a>00056     <span class="keyword">template</span>&lt;<span class="keyword">class</span> newType&gt;
<a name="l00057"></a>00057     operator SmartPtr&lt;const newType&gt;()<span class="keyword"> const </span>{
<a name="l00058"></a>00058         <span class="keywordflow">return</span> SmartPtr&lt;const newType&gt;(ptr);
<a name="l00059"></a>00059     }
<a name="l00060"></a>00060     <span class="keywordtype">bool</span> isValid()<span class="keyword"> const </span>{
<a name="l00061"></a>00061         <span class="keywordflow">return</span> ptr != 0;
<a name="l00062"></a>00062     }
<a name="l00063"></a>00063     T&amp; operator*()<span class="keyword"> const </span>{ 
<a name="l00064"></a>00064         <span class="keywordflow">if</span> (ptr == 0) {
<a name="l00065"></a>00065             <span class="keywordflow">throw</span> NullSmartPtrDereference();
<a name="l00066"></a>00066         }
<a name="l00067"></a>00067         <span class="keywordflow">return</span> *ptr;
<a name="l00068"></a>00068     }
<a name="l00069"></a>00069     T* operator-&gt;()<span class="keyword"> const </span>{
<a name="l00070"></a>00070         <span class="keywordflow">if</span> (ptr == 0) {
<a name="l00071"></a>00071             <span class="keywordflow">throw</span> NullSmartPtrDereference();
<a name="l00072"></a>00072         }
<a name="l00073"></a>00073         <span class="keywordflow">return</span> ptr;
<a name="l00074"></a>00074     }
<a name="l00075"></a>00075     T* <span class="keyword">get</span>() <span class="keyword">const</span> {
<a name="l00076"></a>00076         <span class="keywordflow">return</span> ptr;
<a name="l00077"></a>00077     }
<a name="l00078"></a>00078     SmartPtr&lt;T&gt; copy()<span class="keyword"> const</span>
<a name="l00079"></a>00079 <span class="keyword">    </span>{
<a name="l00080"></a>00080         SmartPtr&lt;T&gt; ret = SmartPtr(ptr-&gt;copy());
<a name="l00081"></a>00081         ret.decRef();
<a name="l00082"></a>00082         <span class="keywordflow">return</span> ret;
<a name="l00083"></a>00083     }
<a name="l00084"></a>00084     SmartPtr&lt;T&gt; getDefaultObject()<span class="keyword"> const</span>
<a name="l00085"></a>00085 <span class="keyword">    </span>{
<a name="l00086"></a>00086         <span class="keywordflow">return</span> SmartPtr(ptr-&gt;getDefaultObject());
<a name="l00087"></a>00087     }
<a name="l00088"></a>00088     <span class="comment">// If you want to make these protected, please ensure that the</span>
<a name="l00089"></a>00089     <span class="comment">// detructor is made virtual to ensure your new class bahaves</span>
<a name="l00090"></a>00090     <span class="comment">// correctly.</span>
<a name="l00091"></a>00091   <span class="keyword">private</span>:
<a name="l00092"></a>00092     <span class="keywordtype">void</span> decRef()<span class="keyword"> const </span>{
<a name="l00093"></a>00093         <span class="keywordflow">if</span> (ptr != 0) {
<a name="l00094"></a>00094             ptr-&gt;decRef();
<a name="l00095"></a>00095         }
<a name="l00096"></a>00096     }
<a name="l00097"></a>00097     <span class="keywordtype">void</span> incRef()<span class="keyword"> const </span>{
<a name="l00098"></a>00098         <span class="keywordflow">if</span> (ptr != 0) {
<a name="l00099"></a>00099             ptr-&gt;incRef();
<a name="l00100"></a>00100         }
<a name="l00101"></a>00101     }
<a name="l00102"></a>00102     T * ptr;
<a name="l00103"></a>00103 };
<a name="l00104"></a>00104 
<a name="l00105"></a>00105 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> returnPtrType, <span class="keyword">class</span> fromType&gt;
<a name="l00106"></a>00106 returnPtrType smart_dynamic_cast(<span class="keyword">const</span> SmartPtr&lt;fromType&gt; &amp; o)
<a name="l00107"></a>00107 {
<a name="l00108"></a>00108     <span class="keywordflow">return</span> returnPtrType(dynamic_cast&lt;typename returnPtrType::DataT*&gt;(o.get()));
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110 
<a name="l00111"></a>00111 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> returnPtrType, <span class="keyword">class</span> fromType&gt;
<a name="l00112"></a>00112 returnPtrType smart_static_cast(<span class="keyword">const</span> SmartPtr&lt;fromType&gt; &amp; o)
<a name="l00113"></a>00113 {
<a name="l00114"></a>00114     <span class="keywordflow">return</span> returnPtrType((<span class="keyword">typename</span> returnPtrType::DataT *)o.get());
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116 
<a name="l00117"></a>00117 } } <span class="comment">// namespace Atlas::Objects</span>
<a name="l00118"></a>00118 
<a name="l00119"></a>00119 <span class="preprocessor">#endif // ATLAS_OBJECTS_SMARTPTR_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>