<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>ref.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.5 on Mon Oct 14 14:16:38 2002 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>ref.h</h1><div class="fragment"><pre>00001 <font class="comment">//</font> 00002 <font class="comment">// ref.h --- definitions of the reference counting classes</font> 00003 <font class="comment">//</font> 00004 <font class="comment">// Copyright (C) 1996 Limit Point Systems, Inc.</font> 00005 <font class="comment">//</font> 00006 <font class="comment">// Author: Curtis Janssen <cljanss@limitpt.com></font> 00007 <font class="comment">// Maintainer: LPS</font> 00008 <font class="comment">//</font> 00009 <font class="comment">// This file is part of the SC Toolkit.</font> 00010 <font class="comment">//</font> 00011 <font class="comment">// The SC Toolkit is free software; you can redistribute it and/or modify</font> 00012 <font class="comment">// it under the terms of the GNU Library General Public License as published by</font> 00013 <font class="comment">// the Free Software Foundation; either version 2, or (at your option)</font> 00014 <font class="comment">// any later version.</font> 00015 <font class="comment">//</font> 00016 <font class="comment">// The SC Toolkit is distributed in the hope that it will be useful,</font> 00017 <font class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00018 <font class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00019 <font class="comment">// GNU Library General Public License for more details.</font> 00020 <font class="comment">//</font> 00021 <font class="comment">// You should have received a copy of the GNU Library General Public License</font> 00022 <font class="comment">// along with the SC Toolkit; see the file COPYING.LIB. If not, write to</font> 00023 <font class="comment">// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.</font> 00024 <font class="comment">//</font> 00025 <font class="comment">// The U.S. Government is granted a limited license as per AL 91-7.</font> 00026 <font class="comment">//</font> 00027 00028 <font class="comment">// This is the main include file for the reference counting classes.</font> 00029 <font class="comment">// This includes two other files: reftmpl.h and refmacr.h. The</font> 00030 <font class="comment">// former is a template declaration for the reference counted classes</font> 00031 <font class="comment">// and the latter is generated from the former by a perl script and</font> 00032 <font class="comment">// provides CPP macros that declare reference counting classes.</font> 00033 <font class="comment">//</font> 00034 <font class="comment">// The behaviour of the package can be modified with the following five</font> 00035 <font class="comment">// macros, each of which should be undefined, 0, or 1:</font> 00036 <font class="comment">//</font> 00037 <font class="comment">// REF_CHECK_STACK: If this is 1 referenced objects are checked to see if they</font> 00038 <font class="comment">// reside on the stack, in which case storage for the object is not managed,</font> 00039 <font class="comment">// if management is enabled. This feature can be confused by multiple threads</font> 00040 <font class="comment">// and memory checking libraries.</font> 00041 <font class="comment">//</font> 00042 <font class="comment">// REF_MANAGE: If this is 1 the manage and unmanage members are enabled.</font> 00043 <font class="comment">//</font> 00044 <font class="comment">// REF_CHECK_MAX_NREF: If this is 1 the reference count is checked before</font> 00045 <font class="comment">// it is incremented to make sure it isn't too big.</font> 00046 <font class="comment">//</font> 00047 <font class="comment">// REF_CHECK_MIN_NREF: If this is 1 the reference count is checked before</font> 00048 <font class="comment">// it is decremented to make sure it isn't already zero.</font> 00049 <font class="comment">//</font> 00050 <font class="comment">// REF_USE_LOCKS: If this is 1 then critical regions are locked before they</font> 00051 <font class="comment">// are entered. This prevents erroneous behavior when multiple threads</font> 00052 <font class="comment">// share reference counted objects. This will slow down certain operations,</font> 00053 <font class="comment">// so it should be set to 0 if your application does not need to be thread</font> 00054 <font class="comment">// safe.</font> 00055 <font class="comment">//</font> 00056 <font class="comment">// If a macro is undefined, then the behaviour is architecture</font> 00057 <font class="comment">// dependent--usually, the macro will be set to 1 in this case.</font> 00058 <font class="comment">// For maximum efficiency and for normal operation after the program is</font> 00059 <font class="comment">// debugged, compile with all of the above macros defined to zero.</font> 00060 <font class="comment">// This can also be done with -DREF_OPTIMIZE.</font> 00061 <font class="comment">//</font> 00062 <font class="comment">// An include file can be used to set these options as well. This has</font> 00063 <font class="comment">// the advantage that dependency checking will force an automatic</font> 00064 <font class="comment">// recompile of all affected files if the options change. The file</font> 00065 <font class="comment">// <scconfig.h> will be include if -DHAVE_CONFIG_H is specified.</font> 00066 <font class="comment">//</font> 00067 <font class="comment">// Note that all source code that uses references must be compiled with</font> 00068 <font class="comment">// the same value REF_MANAGE. Changing this can change the storage layout</font> 00069 <font class="comment">// and the interpretation of the reference count data.</font> 00070 00071 00072 <font class="preprocessor">#ifdef __GNUC__</font> 00073 <font class="preprocessor"></font><font class="preprocessor">#pragma interface</font> 00074 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00075 <font class="preprocessor"></font> 00076 <font class="preprocessor">#ifndef _util_ref_ref_h</font> 00077 <font class="preprocessor"></font><font class="preprocessor">#define _util_ref_ref_h</font> 00078 <font class="preprocessor"></font> 00079 <font class="preprocessor">#include <iostream></font> 00080 <font class="preprocessor">#include <stdlib.h></font> 00081 <font class="preprocessor">#include <limits.h></font> 00082 00083 <font class="preprocessor">#include <util/ref/identity.h></font> 00084 00085 <font class="preprocessor">#ifdef HAVE_CONFIG_H</font> 00086 <font class="preprocessor"></font><font class="preprocessor">#include <scconfig.h></font> 00087 <font class="preprocessor">#endif</font> 00088 <font class="preprocessor"></font> 00089 <font class="preprocessor">#ifdef REF_OPTIMIZE</font> 00090 <font class="preprocessor"></font><font class="preprocessor">#ifndef REF_CHECK_STACK</font> 00091 <font class="preprocessor"></font><font class="preprocessor"># define REF_CHECK_STACK 0</font> 00092 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00093 <font class="preprocessor"></font><font class="preprocessor">#ifndef REF_MANAGE</font> 00094 <font class="preprocessor"></font><font class="preprocessor"># define REF_MANAGE 0</font> 00095 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00096 <font class="preprocessor"></font><font class="preprocessor">#ifndef REF_CHECK_MAX_NREF</font> 00097 <font class="preprocessor"></font><font class="preprocessor"># define REF_CHECK_MAX_NREF 0</font> 00098 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00099 <font class="preprocessor"></font><font class="preprocessor">#ifndef REF_CHECK_MIN_NREF</font> 00100 <font class="preprocessor"></font><font class="preprocessor"># define REF_CHECK_MIN_NREF 0</font> 00101 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00102 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00103 <font class="preprocessor"></font> 00104 <font class="preprocessor">#ifdef SUNMOS</font> 00105 <font class="preprocessor"></font><font class="preprocessor">#ifndef REF_CHECK_STACK</font> 00106 <font class="preprocessor"></font><font class="preprocessor">#define REF_CHECK_STACK 0</font> 00107 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00108 <font class="preprocessor"></font><font class="preprocessor">#else</font> 00109 <font class="preprocessor"></font><font class="preprocessor">#ifndef REF_CHECK_STACK</font> 00110 <font class="preprocessor"></font><font class="preprocessor">#define REF_CHECK_STACK 0</font> 00111 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00112 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00113 <font class="preprocessor"></font> 00114 <font class="preprocessor">#ifndef REF_MANAGE</font> 00115 <font class="preprocessor"></font><font class="preprocessor">#define REF_MANAGE 1</font> 00116 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00117 <font class="preprocessor"></font> 00118 <font class="preprocessor">#ifndef REF_CHECK_MAX_NREF</font> 00119 <font class="preprocessor"></font><font class="preprocessor">#define REF_CHECK_MAX_NREF 1</font> 00120 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00121 <font class="preprocessor"></font> 00122 <font class="preprocessor">#ifndef REF_CHECK_MIN_NREF</font> 00123 <font class="preprocessor"></font><font class="preprocessor">#define REF_CHECK_MIN_NREF 1</font> 00124 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00125 <font class="preprocessor"></font> 00126 <font class="preprocessor">#ifndef REF_USE_LOCKS</font> 00127 <font class="preprocessor"></font><font class="preprocessor"># if HAVE_STHREAD || HAVE_CREATETHREAD || HAVE_PTHREAD</font> 00128 <font class="preprocessor"></font><font class="preprocessor"># define REF_USE_LOCKS 1</font> 00129 <font class="preprocessor"></font><font class="preprocessor"># endif</font> 00130 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00131 <font class="preprocessor"></font> 00132 <font class="preprocessor">#if REF_CHECK_STACK</font> 00133 <font class="preprocessor"></font><font class="preprocessor">#include <unistd.h></font> 00134 <font class="preprocessor">#ifndef HAVE_SBRK_DEC</font> 00135 <font class="preprocessor"></font><font class="keyword">extern</font> <font class="stringliteral">"C"</font> <font class="keywordtype">void</font> * sbrk(ssize_t); 00136 <font class="preprocessor">#endif</font> 00137 <font class="preprocessor"></font><font class="preprocessor">#define DO_REF_CHECK_STACK(p) (((void*) (p) > sbrk(0)) && (p)->managed())</font> 00138 <font class="preprocessor"></font><font class="preprocessor">#else // REF_CHECK_STACK</font> 00139 <font class="preprocessor"></font><font class="preprocessor">#define DO_REF_CHECK_STACK(p) (0)</font> 00140 <font class="preprocessor"></font><font class="preprocessor">#endif // REF_CHECK_STACK</font> 00141 <font class="preprocessor"></font> 00142 <font class="preprocessor">#if REF_MANAGE</font> 00143 <font class="preprocessor"></font><font class="preprocessor">#define DO_REF_UNMANAGE(p) ((p)->unmanage())</font> 00144 <font class="preprocessor"></font><font class="preprocessor">#else // REF_MANAGE</font> 00145 <font class="preprocessor"></font><font class="preprocessor">#define DO_REF_UNMANAGE(p)</font> 00146 <font class="preprocessor"></font><font class="preprocessor">#endif // REF_MANAGE</font> 00147 <font class="preprocessor"></font> 00148 <font class="preprocessor">#if REF_USE_LOCKS</font> 00149 <font class="preprocessor"></font><font class="preprocessor">#define __REF_LOCK__(p) p->lock_ptr()</font> 00150 <font class="preprocessor"></font><font class="preprocessor">#define __REF_UNLOCK__(p) p->unlock_ptr()</font> 00151 <font class="preprocessor"></font><font class="preprocessor">#define __REF_INITLOCK__() ref_lock_ = 0xff</font> 00152 <font class="preprocessor"></font><font class="preprocessor">#else</font> 00153 <font class="preprocessor"></font><font class="preprocessor">#define __REF_LOCK__(p)</font> 00154 <font class="preprocessor"></font><font class="preprocessor">#define __REF_UNLOCK__(p)</font> 00155 <font class="preprocessor"></font><font class="preprocessor">#define __REF_INITLOCK__()</font> 00156 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00157 <font class="preprocessor"></font> 00158 <font class="keyword">namespace </font>sc { 00159 00160 <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> refcount_t; 00161 <a name="l00186"></a><a class="code" href="class_sc__RefCount.html">00186</a> <font class="keyword">class </font>RefCount: <font class="keyword">public</font> Identity { 00187 <font class="keyword">private</font>: 00188 <font class="preprocessor">#if REF_MANAGE</font> 00189 <font class="preprocessor"></font><font class="preprocessor"># define REF_MAX_NREF (UINT_MAX - 1)</font> 00190 <font class="preprocessor"></font><font class="preprocessor"># define REF_MANAGED_CODE UINT_MAX</font> 00191 <font class="preprocessor"></font><font class="preprocessor">#else</font> 00192 <font class="preprocessor"></font><font class="preprocessor"># define REF_MAX_NREF UINT_MAX</font> 00193 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00194 <font class="preprocessor"></font> <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> _reference_count_; 00195 <font class="preprocessor">#if REF_USE_LOCKS</font> 00196 <font class="preprocessor"></font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> ref_lock_; 00197 <font class="preprocessor">#endif</font> 00198 <font class="preprocessor"></font> 00199 <font class="keywordtype">void</font> error(<font class="keyword">const</font> <font class="keywordtype">char</font>*) <font class="keyword">const</font>; 00200 <font class="keywordtype">void</font> too_many_refs() <font class="keyword">const</font>; 00201 <font class="keywordtype">void</font> not_enough_refs() <font class="keyword">const</font>; 00202 <font class="keyword">protected</font>: 00203 RefCount(): _reference_count_(0)<font class="keyword"> </font>{ 00204 __REF_INITLOCK__(); 00205 <font class="comment">//std::cout << "ref_lock_ = " << (int) ref_lock_ << std::endl;</font> 00206 } 00207 RefCount(<font class="keyword">const</font> RefCount&): _reference_count_(0)<font class="keyword"> </font>{ 00208 __REF_INITLOCK__(); 00209 <font class="comment">//std::cout << "ref_lock_ = " << (int) ref_lock_ << std::endl;</font> 00210 } 00211 00212 <font class="comment">// Assigment should not overwrite the reference count.</font> 00213 RefCount& operator=(<font class="keyword">const</font> RefCount&)<font class="keyword"> </font>{ <font class="keywordflow">return</font> *<font class="keyword">this</font>; } 00214 <font class="keyword">public</font>: 00215 <font class="keyword">virtual</font> ~RefCount(); 00216 00218 <font class="keywordtype">int</font> <a class="code" href="class_sc__RefCount.html#a1">lock_ptr</a>() <font class="keyword">const</font>; 00220 <font class="keywordtype">int</font> <a class="code" href="class_sc__RefCount.html#a2">unlock_ptr</a>() <font class="keyword">const</font>; 00221 00223 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefCount.html#a3">use_locks</a>(<font class="keywordtype">bool</font> inVal); 00224 <a name="l00226"></a><a class="code" href="class_sc__RefCount.html#a4">00226</a> refcount_t <a class="code" href="class_sc__RefCount.html#a4">nreference</a>()<font class="keyword"> const </font>{ 00227 <font class="preprocessor"># if REF_MANAGE</font> 00228 <font class="preprocessor"></font> <font class="keywordflow">if</font> (!<a class="code" href="class_sc__RefCount.html#a7">managed</a>()) <font class="keywordflow">return</font> 1; 00229 <font class="preprocessor"># endif</font> 00230 <font class="preprocessor"></font> <font class="keywordflow">return</font> _reference_count_; 00231 } 00232 <a name="l00234"></a><a class="code" href="class_sc__RefCount.html#a5">00234</a> refcount_t <a class="code" href="class_sc__RefCount.html#a5">reference</a>()<font class="keyword"> </font>{ 00235 <font class="preprocessor"># if REF_MANAGE</font> 00236 <font class="preprocessor"></font> <font class="keywordflow">if</font> (!<a class="code" href="class_sc__RefCount.html#a7">managed</a>()) <font class="keywordflow">return</font> 1; 00237 <font class="preprocessor"># endif</font> 00238 <font class="preprocessor"></font> __REF_LOCK__(<font class="keyword">this</font>); 00239 <font class="preprocessor"># if REF_CHECK_MAX_NREF</font> 00240 <font class="preprocessor"></font> <font class="keywordflow">if</font> (_reference_count_ >= REF_MAX_NREF) too_many_refs(); 00241 <font class="preprocessor"># endif</font> 00242 <font class="preprocessor"></font> _reference_count_++; 00243 refcount_t r = _reference_count_; 00244 __REF_UNLOCK__(<font class="keyword">this</font>); 00245 <font class="keywordflow">return</font> r; 00246 } 00247 <a name="l00249"></a><a class="code" href="class_sc__RefCount.html#a6">00249</a> refcount_t <a class="code" href="class_sc__RefCount.html#a6">dereference</a>()<font class="keyword"> </font>{ 00250 <font class="preprocessor"># if REF_MANAGE</font> 00251 <font class="preprocessor"></font> <font class="keywordflow">if</font> (!<a class="code" href="class_sc__RefCount.html#a7">managed</a>()) <font class="keywordflow">return</font> 1; 00252 <font class="preprocessor"># endif</font> 00253 <font class="preprocessor"></font> __REF_LOCK__(<font class="keyword">this</font>); 00254 <font class="preprocessor"># if REF_CHECK_MIN_NREF</font> 00255 <font class="preprocessor"></font> <font class="keywordflow">if</font> (_reference_count_ == 0) not_enough_refs(); 00256 <font class="preprocessor"># endif</font> 00257 <font class="preprocessor"></font> _reference_count_--; 00258 refcount_t r = _reference_count_; 00259 __REF_UNLOCK__(<font class="keyword">this</font>); 00260 <font class="keywordflow">return</font> r; 00261 } 00262 00263 <font class="preprocessor">#if REF_MANAGE</font> <a name="l00264"></a><a class="code" href="class_sc__RefCount.html#a7">00264</a> <font class="preprocessor"></font> <font class="keywordtype">int</font> <a class="code" href="class_sc__RefCount.html#a7">managed</a>()<font class="keyword"> const </font>{ 00265 <font class="keywordflow">return</font> _reference_count_ != REF_MANAGED_CODE; 00266 } <a name="l00272"></a><a class="code" href="class_sc__RefCount.html#a8">00272</a> <font class="keywordtype">void</font> <a class="code" href="class_sc__RefCount.html#a8">unmanage</a>()<font class="keyword"> </font>{ 00273 _reference_count_ = REF_MANAGED_CODE; 00274 } 00275 <font class="preprocessor">#else // REF_MANAGE</font> 00276 <font class="preprocessor"></font> <a name="l00277"></a><a class="code" href="class_sc__RefCount.html#a9">00277</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__RefCount.html#a7">managed</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> 1; } 00278 <font class="preprocessor">#endif // REF_MANAGE</font> 00279 <font class="preprocessor"></font>}; 00280 <a name="l00284"></a><a class="code" href="class_sc__RefBase.html">00284</a> <font class="keyword">class </font>RefBase { 00285 <font class="keyword">protected</font>: 00287 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#b0">warn</a> ( <font class="keyword">const</font> <font class="keywordtype">char</font> * msg) <font class="keyword">const</font>; 00289 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#b1">warn_ref_to_stack</a>() <font class="keyword">const</font>; 00291 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#b2">warn_skip_stack_delete</a>() <font class="keyword">const</font>; 00293 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#b3">warn_bad_ref_count</a>() <font class="keyword">const</font>; 00295 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#b4">ref_info</a>(RefCount*p,std::ostream& os) <font class="keyword">const</font>; 00296 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#b4">ref_info</a>(std::ostream& os) <font class="keyword">const</font>; 00297 <font class="keywordtype">void</font> check_pointer() <font class="keyword">const</font>; 00298 <font class="keywordtype">void</font> reference(RefCount *); 00299 <font class="keywordtype">int</font> dereference(RefCount *); 00300 <font class="keyword">public</font>: 00301 <font class="keyword">virtual</font> ~RefBase(); 00303 <font class="keyword">virtual</font> RefCount* <a class="code" href="class_sc__RefBase.html#a1">parentpointer</a>() <font class="keyword">const</font> = 0; 00306 <font class="keywordtype">void</font> <a class="code" href="class_sc__RefBase.html#a2">require_nonnull</a>() <font class="keyword">const</font>; 00307 }; 00308 00322 template <class T> <a name="l00323"></a><a class="code" href="class_sc__Ref.html">00323</a> <font class="keyword">class </font>Ref : <font class="keyword">public</font> RefBase { 00324 <font class="keyword">private</font>: 00325 T* p; 00326 <font class="keyword">public</font>: <a name="l00328"></a><a class="code" href="class_sc__Ref.html#a0">00328</a> <a class="code" href="class_sc__Ref.html#a0">Ref</a>(): p(0) {} <a name="l00330"></a><a class="code" href="class_sc__Ref.html#a1">00330</a> <a class="code" href="class_sc__Ref.html#a0">Ref</a>(T*a) : p(0) 00331 { 00332 <font class="keywordflow">if</font> (a) { 00333 p = a; 00334 reference(p); 00335 } 00336 } <a name="l00338"></a><a class="code" href="class_sc__Ref.html#a2">00338</a> <a class="code" href="class_sc__Ref.html#a0">Ref</a>(<font class="keyword">const</font> Ref<T> &a) : p(0) 00339 { 00340 <font class="keywordflow">if</font> (a.pointer()) { 00341 p = a.pointer(); 00342 reference(p); 00343 } 00344 } <a name="l00346"></a><a class="code" href="class_sc__Ref.html#a3">00346</a> template <class A> <a class="code" href="class_sc__Ref.html#a0">Ref</a>(<font class="keyword">const</font> Ref<A> &a): p(0) 00347 { 00348 <font class="keywordflow">if</font> (a.pointer()) { 00349 p = a.pointer(); 00350 reference(p); 00351 } 00352 } 00353 <font class="comment">// /** Create a reference to the object a. Do a</font> 00354 <font class="comment">// dynamic_cast to convert a to the appropiate type. */</font> 00355 <font class="comment">// Ref(const RefBase&a) {</font> 00356 <font class="comment">// p = dynamic_cast<T*>(a.parentpointer());</font> 00357 <font class="comment">// reference(p);</font> 00358 <font class="comment">// }</font> 00359 <font class="comment">// /** Create a reference to the object a. Do a</font> 00360 <font class="comment">// dynamic_cast to convert a to the appropiate type. */</font> 00361 <font class="comment">// Ref(RefCount*a): p(0) {</font> 00362 <font class="comment">// operator<<(a);</font> 00363 <font class="comment">// }</font> <a name="l00366"></a><a class="code" href="class_sc__Ref.html#a4">00366</a> <font class="comment"></font> <a class="code" href="class_sc__Ref.html#a4">~Ref</a>()<font class="keyword"></font> 00367 <font class="keyword"> </font>{ 00368 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00369 } <a name="l00372"></a><a class="code" href="class_sc__Ref.html#a5">00372</a> T* <a class="code" href="class_sc__Ref.html#a5">operator-></a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> p; } <a name="l00374"></a><a class="code" href="class_sc__Ref.html#a6">00374</a> T* <a class="code" href="class_sc__Ref.html#a6">pointer</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> p; } <a name="l00376"></a><a class="code" href="class_sc__Ref.html#a7">00376</a> RefCount *<a class="code" href="class_sc__Ref.html#a7">parentpointer</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> p; } 00377 00378 operator T*()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> p; } <a name="l00381"></a><a class="code" href="class_sc__Ref.html#a9">00381</a> T& <a class="code" href="class_sc__Ref.html#a9">operator *</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> *p; }; <a name="l00384"></a><a class="code" href="class_sc__Ref.html#a10">00384</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__Ref.html#a10">null</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> p == 0; } <a name="l00386"></a><a class="code" href="class_sc__Ref.html#a11">00386</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__Ref.html#a11">nonnull</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> p != 0; } <a name="l00389"></a><a class="code" href="class_sc__Ref.html#a12">00389</a> template <class A> <font class="keywordtype">int</font> <a class="code" href="class_sc__Ref.html#a12">operator==</a>(<font class="keyword">const</font> Ref<A>&a)<font class="keyword"> const</font> 00390 <font class="keyword"> </font>{ <font class="keywordflow">return</font> eq(p,a.pointer()); } 00391 template <class A> <font class="keywordtype">int</font> operator>=(<font class="keyword">const</font> Ref<A>&a)<font class="keyword"> const</font> 00392 <font class="keyword"> </font>{ <font class="keywordflow">return</font> ge(p,a.pointer()); } 00393 template <class A> <font class="keywordtype">int</font> operator<=(const Ref<A>&a) <font class="keyword">const</font> 00394 { <font class="keywordflow">return</font> le(p,a.pointer()); } 00395 template <class A> <font class="keywordtype">int</font> operator>(<font class="keyword">const</font> Ref<A>&a)<font class="keyword"> const</font> 00396 <font class="keyword"> </font>{ <font class="keywordflow">return</font> gt(p,a.pointer()); } 00397 template <class A> <font class="keywordtype">int</font> operator<(const Ref<A>&a) <font class="keyword">const</font> 00398 { <font class="keywordflow">return</font> lt(p,a.pointer()); } 00399 template <class A> <font class="keywordtype">int</font> operator!=(<font class="keyword">const</font> Ref<A>&a)<font class="keyword"> const</font> 00400 <font class="keyword"> </font>{ <font class="keywordflow">return</font> ne(p,a.pointer()); } <a name="l00403"></a><a class="code" href="class_sc__Ref.html#a18">00403</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__Ref.html#a18">compare</a>(<font class="keyword">const</font> Ref<T> &a)<font class="keyword"> const </font>{ 00404 <font class="keywordflow">return</font> eq(p,a.p)?0:((lt(p,a.p)?-1:1)); 00405 } <a name="l00407"></a><a class="code" href="class_sc__Ref.html#a19">00407</a> <font class="keywordtype">void</font> <a class="code" href="class_sc__Ref.html#a19">clear</a>()<font class="keyword"></font> 00408 <font class="keyword"> </font>{ 00409 <font class="keywordflow">if</font> (p) { 00410 <font class="keywordtype">int</font> ref = dereference(p); 00411 <font class="keywordflow">if</font> (ref == 0) 00412 <font class="keyword">delete</font> p; 00413 p = 0; 00414 } 00415 } <a name="l00417"></a><a class="code" href="class_sc__Ref.html#a20">00417</a> Ref<T>& <a class="code" href="class_sc__Ref.html#a20">operator=</a>(<font class="keyword">const</font> Ref<T> & c)<font class="keyword"></font> 00418 <font class="keyword"> </font>{ 00419 T *cp = c.pointer(); 00420 <font class="keywordflow">if</font> (cp) { 00421 cp->reference(); 00422 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00423 p=cp; 00424 } 00425 <font class="keywordflow">else</font> { 00426 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00427 } 00428 <font class="keywordflow">return</font> *<font class="keyword">this</font>; 00429 } <a name="l00431"></a><a class="code" href="class_sc__Ref.html#a21">00431</a> template <class A> Ref<T>& <a class="code" href="class_sc__Ref.html#a20">operator=</a>(<font class="keyword">const</font> Ref<A> & c)<font class="keyword"></font> 00432 <font class="keyword"> </font>{ 00433 A *cp = c.pointer(); 00434 <font class="keywordflow">if</font> (cp) { 00435 cp->reference(); 00436 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00437 p=cp; 00438 } 00439 <font class="keywordflow">else</font> { 00440 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00441 } 00442 <font class="keywordflow">return</font> *<font class="keyword">this</font>; 00443 } <a name="l00445"></a><a class="code" href="class_sc__Ref.html#a22">00445</a> Ref<T>& <a class="code" href="class_sc__Ref.html#a22">operator<<</a>(<font class="keyword">const</font> RefBase&a)<font class="keyword"> </font>{ 00446 T* cr = dynamic_cast<T*>(a.parentpointer()); 00447 <font class="keywordflow">if</font> (cr) { 00448 reference(cr); 00449 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00450 } 00451 p = cr; 00452 <font class="keywordflow">return</font> *<font class="keyword">this</font>; 00453 } <a name="l00457"></a><a class="code" href="class_sc__Ref.html#a23">00457</a> Ref<T>& <a class="code" href="class_sc__Ref.html#a22">operator<<</a>(RefCount *a)<font class="keyword"> </font>{ 00458 T* cr = dynamic_cast<T*>(a); 00459 <font class="keywordflow">if</font> (cr) <a class="code" href="class_sc__Ref.html#a25">assign_pointer</a>(cr); 00460 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (a && a->nreference() <= 0) <font class="keyword">delete</font> a; 00461 <font class="keywordflow">return</font> *<font class="keyword">this</font>; 00462 } <a name="l00464"></a><a class="code" href="class_sc__Ref.html#a24">00464</a> Ref<T>& <a class="code" href="class_sc__Ref.html#a20">operator=</a>(T* cr)<font class="keyword"></font> 00465 <font class="keyword"> </font>{ 00466 <a class="code" href="class_sc__Ref.html#a25">assign_pointer</a>(cr); 00467 <font class="keywordflow">return</font> *<font class="keyword">this</font>; 00468 } <a name="l00470"></a><a class="code" href="class_sc__Ref.html#a25">00470</a> <font class="keywordtype">void</font> <a class="code" href="class_sc__Ref.html#a25">assign_pointer</a>(T* cr)<font class="keyword"></font> 00471 <font class="keyword"> </font>{ 00472 <font class="keywordflow">if</font> (cr) { 00473 <font class="keywordflow">if</font> (DO_REF_CHECK_STACK(cr)) { 00474 DO_REF_UNMANAGE(cr); 00475 <a class="code" href="class_sc__RefBase.html#b1">warn_ref_to_stack</a>(); 00476 } 00477 cr->reference(); 00478 } 00479 <a class="code" href="class_sc__Ref.html#a19">clear</a>(); 00480 p = cr; 00481 } <a name="l00483"></a><a class="code" href="class_sc__Ref.html#a26">00483</a> <font class="keywordtype">void</font> <a class="code" href="class_sc__Ref.html#a26">check_pointer</a>()<font class="keyword"> const</font> 00484 <font class="keyword"> </font>{ 00485 <font class="keywordflow">if</font> (p && p->nreference() <= 0) { 00486 <a class="code" href="class_sc__RefBase.html#b3">warn_bad_ref_count</a>(); 00487 } 00488 } <a name="l00490"></a><a class="code" href="class_sc__Ref.html#a27">00490</a> <font class="keywordtype">void</font> <a class="code" href="class_sc__Ref.html#a27">ref_info</a>(std::ostream& os)<font class="keyword"> const</font> 00491 <font class="keyword"> </font>{ 00492 RefBase::ref_info(p,os); 00493 } <a name="l00495"></a><a class="code" href="class_sc__Ref.html#a28">00495</a> <font class="keywordtype">void</font> <a class="code" href="class_sc__Ref.html#a28">warn</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>*s)<font class="keyword"> const </font>{ RefBase::warn(s); } 00496 }; 00497 00498 } 00499 00500 <font class="preprocessor">#endif</font> 00501 <font class="preprocessor"></font> 00502 <font class="comment">// ///////////////////////////////////////////////////////////////////////////</font> 00503 00504 <font class="comment">// Local Variables:</font> 00505 <font class="comment">// mode: c++</font> 00506 <font class="comment">// c-file-style: "CLJ"</font> 00507 <font class="comment">// End:</font> </div></pre><hr> <address> <small> Generated at Mon Oct 14 14:16:38 2002 for <a href="http://aros.ca.sandia.gov/~cljanss/mpqc">MPQC</a> 2.1.2 using the documentation package <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a> 1.2.5. </small> </address> </body> </html>