<!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 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>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 <Atlas/Exception.h></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 <class T> <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<T>& 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><<span class="keyword">class</span> oldType> <a name="l00039"></a>00039 <span class="keyword">explicit</span> SmartPtr(<span class="keyword">const</span> SmartPtr<oldType>& 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& operator=(<span class="keyword">const</span> SmartPtr<T>& a) { <a name="l00045"></a>00045 <span class="keywordflow">if</span> (a.get() != this-><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><<span class="keyword">class</span> newType> <a name="l00053"></a>00053 operator SmartPtr<newType>()<span class="keyword"> const </span>{ <a name="l00054"></a>00054 <span class="keywordflow">return</span> SmartPtr<newType>(ptr); <a name="l00055"></a>00055 } <a name="l00056"></a>00056 <span class="keyword">template</span><<span class="keyword">class</span> newType> <a name="l00057"></a>00057 operator SmartPtr<const newType>()<span class="keyword"> const </span>{ <a name="l00058"></a>00058 <span class="keywordflow">return</span> SmartPtr<const newType>(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& 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->()<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<T> copy()<span class="keyword"> const</span> <a name="l00079"></a>00079 <span class="keyword"> </span>{ <a name="l00080"></a>00080 SmartPtr<T> ret = SmartPtr(ptr->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<T> 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->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->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->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><<span class="keyword">typename</span> returnPtrType, <span class="keyword">class</span> fromType> <a name="l00106"></a>00106 returnPtrType smart_dynamic_cast(<span class="keyword">const</span> SmartPtr<fromType> & o) <a name="l00107"></a>00107 { <a name="l00108"></a>00108 <span class="keywordflow">return</span> returnPtrType(dynamic_cast<typename returnPtrType::DataT*>(o.get())); <a name="l00109"></a>00109 } <a name="l00110"></a>00110 <a name="l00111"></a>00111 <span class="keyword">template</span><<span class="keyword">typename</span> returnPtrType, <span class="keyword">class</span> fromType> <a name="l00112"></a>00112 returnPtrType smart_static_cast(<span class="keyword">const</span> SmartPtr<fromType> & 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>