Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > media > contrib > by-pkgid > 263386785cefb9ae5d63b926d214d809 > files > 1326

mpqc-2.1.2-4mdk.ppc.rpm

<!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> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </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 &lt;cljanss@limitpt.com&gt;</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">// &lt;scconfig.h&gt; 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 &lt;iostream&gt;</font>
00080 <font class="preprocessor">#include &lt;stdlib.h&gt;</font>
00081 <font class="preprocessor">#include &lt;limits.h&gt;</font>
00082 
00083 <font class="preprocessor">#include &lt;util/ref/identity.h&gt;</font>
00084 
00085 <font class="preprocessor">#ifdef HAVE_CONFIG_H</font>
00086 <font class="preprocessor"></font><font class="preprocessor">#include &lt;scconfig.h&gt;</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 &lt;unistd.h&gt;</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) &gt; sbrk(0)) &amp;&amp; (p)-&gt;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)-&gt;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-&gt;lock_ptr()</font>
00150 <font class="preprocessor"></font><font class="preprocessor">#define __REF_UNLOCK__(p) p-&gt;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 &lt;&lt; "ref_lock_ = " &lt;&lt; (int) ref_lock_ &lt;&lt; std::endl;</font>
00206       }
00207     RefCount(<font class="keyword">const</font> RefCount&amp;): _reference_count_(0)<font class="keyword"> </font>{
00208         __REF_INITLOCK__();
00209         <font class="comment">//std::cout &lt;&lt; "ref_lock_ = " &lt;&lt; (int) ref_lock_ &lt;&lt; std::endl;</font>
00210       }
00211 
00212     <font class="comment">// Assigment should not overwrite the reference count.</font>
00213     RefCount&amp; operator=(<font class="keyword">const</font> RefCount&amp;)<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_ &gt;= 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&amp; 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&amp; 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 &lt;class T&gt;
<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&lt;T&gt; &amp;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 &lt;class A&gt; <a class="code" href="class_sc__Ref.html#a0">Ref</a>(<font class="keyword">const</font> Ref&lt;A&gt; &amp;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&amp;a) {</font>
00356 <font class="comment">//          p = dynamic_cast&lt;T*&gt;(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&lt;&lt;(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-&gt;</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&amp; <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 &lt;class A&gt; <font class="keywordtype">int</font> <a class="code" href="class_sc__Ref.html#a12">operator==</a>(<font class="keyword">const</font> Ref&lt;A&gt;&amp;a)<font class="keyword"> const</font>
00390 <font class="keyword">        </font>{ <font class="keywordflow">return</font> eq(p,a.pointer()); }
00391     template &lt;class A&gt; <font class="keywordtype">int</font> operator&gt;=(<font class="keyword">const</font> Ref&lt;A&gt;&amp;a)<font class="keyword"> const</font>
00392 <font class="keyword">        </font>{ <font class="keywordflow">return</font> ge(p,a.pointer()); }
00393     template &lt;class A&gt; <font class="keywordtype">int</font> operator&lt;=(const Ref&lt;A&gt;&amp;a) <font class="keyword">const</font>
00394         { <font class="keywordflow">return</font> le(p,a.pointer()); }
00395     template &lt;class A&gt; <font class="keywordtype">int</font> operator&gt;(<font class="keyword">const</font> Ref&lt;A&gt;&amp;a)<font class="keyword"> const</font>
00396 <font class="keyword">        </font>{ <font class="keywordflow">return</font> gt(p,a.pointer()); }
00397     template &lt;class A&gt; <font class="keywordtype">int</font> operator&lt;(const Ref&lt;A&gt;&amp;a) <font class="keyword">const</font>
00398         { <font class="keywordflow">return</font> lt(p,a.pointer()); }
00399     template &lt;class A&gt; <font class="keywordtype">int</font> operator!=(<font class="keyword">const</font> Ref&lt;A&gt;&amp;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&lt;T&gt; &amp;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&lt;T&gt;&amp; <a class="code" href="class_sc__Ref.html#a20">operator=</a>(<font class="keyword">const</font> Ref&lt;T&gt; &amp; c)<font class="keyword"></font>
00418 <font class="keyword">    </font>{
00419       T *cp = c.pointer();
00420       <font class="keywordflow">if</font> (cp) {
00421           cp-&gt;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 &lt;class A&gt; Ref&lt;T&gt;&amp; <a class="code" href="class_sc__Ref.html#a20">operator=</a>(<font class="keyword">const</font> Ref&lt;A&gt; &amp; c)<font class="keyword"></font>
00432 <font class="keyword">    </font>{
00433       A *cp = c.pointer();
00434       <font class="keywordflow">if</font> (cp) {
00435           cp-&gt;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&lt;T&gt;&amp; <a class="code" href="class_sc__Ref.html#a22">operator&lt;&lt;</a>(<font class="keyword">const</font> RefBase&amp;a)<font class="keyword"> </font>{
00446         T* cr = dynamic_cast&lt;T*&gt;(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&lt;T&gt;&amp; <a class="code" href="class_sc__Ref.html#a22">operator&lt;&lt;</a>(RefCount *a)<font class="keyword"> </font>{
00458         T* cr = dynamic_cast&lt;T*&gt;(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 &amp;&amp; a-&gt;nreference() &lt;= 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&lt;T&gt;&amp; <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-&gt;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 &amp;&amp; p-&gt;nreference() &lt;= 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&amp; 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>