Sophie

Sophie

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

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>class.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:36 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>class.h</h1><div class="fragment"><pre>00001 <font class="comment">//</font>
00002 <font class="comment">// class.h</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="preprocessor">#ifdef __GNUG__</font>
00029 <font class="preprocessor"></font><font class="preprocessor">#pragma interface</font>
00030 <font class="preprocessor"></font><font class="preprocessor">#endif</font>
00031 <font class="preprocessor"></font>
00032 <font class="preprocessor">#ifndef _util_class_class_h</font>
00033 <font class="preprocessor"></font><font class="preprocessor">#define _util_class_class_h</font>
00034 <font class="preprocessor"></font>
00035 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
00036 <font class="preprocessor">#include &lt;string.h&gt;</font>
00037 <font class="preprocessor">#include &lt;stdarg.h&gt;</font>
00038 <font class="preprocessor">#include &lt;iostream&gt;</font>
00039 <font class="preprocessor">#include &lt;iomanip&gt;</font>
00040 <font class="preprocessor">#include &lt;typeinfo&gt;</font>
00041 <font class="preprocessor">#include &lt;util/ref/ref.h&gt;</font>
00042 <font class="preprocessor">#include &lt;util/container/avlset.h&gt;</font>
00043 <font class="preprocessor">#include &lt;util/container/avlmap.h&gt;</font>
00044 <font class="preprocessor">#include &lt;util/misc/exenv.h&gt;</font>
00045 
00046 <font class="keyword">namespace </font>sc {
00047 
00048 template &lt;class T, class C&gt;
00049 <font class="keyword">class </font>DescribedMemberDatum {
00050   <font class="keyword">private</font>:
00051     T C::*member_;
00052   <font class="keyword">public</font>:
00053     DescribedMemberDatum(T C::*member): member_(member) {}
00054     <font class="comment">//T &amp;member(C *c) { return c-&gt;*member_; }</font>
00055 };
00056 
00057 <font class="keyword">class </font>DescribedClass;
00058 <font class="keyword">class </font>ClassDesc;
00059 <font class="keyword">typedef</font> ClassDesc* ClassDescP;
00060 <font class="keyword">typedef</font> <font class="keyword">const</font> ClassDesc* CClassDescP;
00061 
<a name="l00063"></a><a class="code" href="class_sc__ClassKey.html">00063</a> <font class="keyword">class </font>ClassKey {
00064   <font class="keyword">private</font>:
00065     <font class="keywordtype">char</font>* classname_;
00066   <font class="keyword">public</font>:
00067     ClassKey();
00068     ClassKey(<font class="keyword">const</font> <font class="keywordtype">char</font>* name);
00069     ClassKey(<font class="keyword">const</font> ClassKey&amp;);
00070     ~ClassKey();
00071     ClassKey&amp; operator=(<font class="keyword">const</font> ClassKey&amp;);
00072     <font class="keywordtype">int</font> operator==(<font class="keyword">const</font> ClassKey&amp; ck) <font class="keyword">const</font>;
00073     <font class="keywordtype">int</font> operator&lt;(<font class="keyword">const</font> ClassKey&amp; ck) <font class="keyword">const</font>;
00074     <font class="keywordtype">int</font> hash() <font class="keyword">const</font>;
00075     <font class="keywordtype">int</font> cmp(<font class="keyword">const</font> ClassKey&amp;ck) <font class="keyword">const</font>;
00076     <font class="keywordtype">char</font>* name() <font class="keyword">const</font>;
00077   };
00078 
00079 <font class="keyword">class </font>ClassDesc;
00080 
<a name="l00082"></a><a class="code" href="class_sc__ParentClass.html">00082</a> <font class="keyword">class </font>ParentClass
00083 {
00084   <font class="keyword">public</font>:
00085     <font class="keyword">enum</font> Access { Private, Protected, Public };
00086   <font class="keyword">private</font>:
00087     Access _access;
00088     <font class="keywordtype">int</font> _is_virtual;
00089     ClassDesc* _classdesc;
00090   <font class="keyword">public</font>:
00091     ParentClass(ClassDesc*,Access access = Private,<font class="keywordtype">int</font> is_virtual = 0);
00092     ParentClass(<font class="keyword">const</font> ParentClass&amp;);
00093     ~ParentClass();
00094     <font class="keywordtype">int</font> is_virtual() <font class="keyword">const</font>;
00095     Access access()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _access; }
00096     <font class="keyword">const</font> ClassDesc* classdesc() <font class="keyword">const</font>;
00097     <font class="keywordtype">void</font> change_classdesc(ClassDesc*n);
00098 };
00099 
<a name="l00101"></a><a class="code" href="class_sc__ParentClasses.html">00101</a> <font class="keyword">class </font>ParentClasses
00102 {
00103   <font class="keyword">private</font>:
00104     <font class="keywordtype">int</font> _n;
00105     ParentClass** _classes;
00106     <font class="keywordtype">void</font> add(ParentClass*);
00107     <font class="comment">// do not allow copy constructor or assignment</font>
00108     ParentClasses(<font class="keyword">const</font> ParentClasses&amp;);
00109     <font class="keywordtype">void</font> operator=(<font class="keyword">const</font> ParentClasses&amp;);
00110   <font class="keyword">public</font>:
00111     ParentClasses();
00112     <font class="keywordtype">void</font> init(<font class="keyword">const</font> <font class="keywordtype">char</font>*);
00113     ~ParentClasses();
00114     ParentClass&amp; parent(<font class="keywordtype">int</font> i)<font class="keyword"> </font>{ <font class="keywordflow">return</font> *_classes[i]; }
00115     <font class="keyword">const</font> ParentClass&amp; parent(<font class="keywordtype">int</font> i)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> *_classes[i]; }
00116     ParentClass&amp; operator[](<font class="keywordtype">int</font> i)<font class="keyword"> </font>{ <font class="keywordflow">return</font> *_classes[i]; }
00117     <font class="keyword">const</font> ParentClass&amp; operator[](<font class="keywordtype">int</font> i)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> *_classes[i]; }
00118     <font class="keywordtype">int</font> n()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> _n; }
00119     <font class="keywordtype">void</font> change_parent(ClassDesc*oldcd,ClassDesc*newcd);
00120 };
00121     
00122 
00123 <font class="keyword">class </font>KeyVal;
00124 <font class="keyword">class </font>StateIn;
00125 
00128 template &lt;class T&gt;
00129 DescribedClass* create()<font class="keyword"></font>
00130 <font class="keyword"></font>{
00131   <font class="keywordflow">return</font> <font class="keyword">new</font> T;
00132 }
00133 
00136 template &lt;class T&gt;
00137 DescribedClass* create(<font class="keyword">const</font> Ref&lt;KeyVal&gt;&amp; keyval)<font class="keyword"></font>
00138 <font class="keyword"></font>{
00139   <font class="keywordflow">return</font> <font class="keyword">new</font> T(keyval);
00140 }
00141 
00144 template &lt;class T&gt;
00145 DescribedClass* create(StateIn&amp; statein)<font class="keyword"></font>
00146 <font class="keyword"></font>{
00147   <font class="keywordflow">return</font> <font class="keyword">new</font> T(statein);
00148 }
00149 
00150 <font class="keyword">class </font>type_info_key {
00151   <font class="keyword">private</font>:
00152     <font class="keyword">const</font> std::type_info *ti_;
00153   <font class="keyword">public</font>:
00154     type_info_key(): ti_(0) {}
00155     type_info_key(<font class="keyword">const</font> std::type_info *ti): ti_(ti) {}
00156     type_info_key&amp; operator=(<font class="keyword">const</font> type_info_key&amp;);
00157     <font class="keywordtype">int</font> operator==(<font class="keyword">const</font> type_info_key&amp;) <font class="keyword">const</font>;
00158     <font class="keywordtype">int</font> operator&lt;(<font class="keyword">const</font> type_info_key&amp;) <font class="keyword">const</font>;
00159     <font class="keywordtype">int</font> cmp(<font class="keyword">const</font> type_info_key&amp;) <font class="keyword">const</font>;
00160 };
00161 
<a name="l00173"></a><a class="code" href="class_sc__ClassDesc.html">00173</a> <font class="keyword">class </font>ClassDesc: <font class="keyword">public</font> Identity {
00174     <font class="keyword">friend</font> <font class="keyword">class </font>ParentClasses;
00175   <font class="keyword">private</font>:
00176     <font class="keyword">static</font> AVLMap&lt;ClassKey,ClassDescP&gt; *all_;
00177     <font class="keyword">static</font> AVLMap&lt;type_info_key,ClassDescP&gt; *type_info_all_;
00178     <font class="keyword">static</font> <font class="keywordtype">char</font> * classlib_search_path_;
00179     <font class="keyword">static</font> AVLSet&lt;ClassKey&gt; *unresolved_parents_;
00180 
00181     <font class="keywordtype">char</font>* classname_;
00182     <font class="keywordtype">int</font> version_;
00183     ParentClasses parents_;
00184     AVLSet&lt;ClassKey&gt; *children_;
00185     DescribedClass* (*ctor_)();
00186     DescribedClass* (*keyvalctor_)(<font class="keyword">const</font> Ref&lt;KeyVal&gt;&amp;);
00187     DescribedClass* (*stateinctor_)(StateIn&amp;);
00188 
00189     <font class="keywordtype">void</font> change_parent(ClassDesc*oldcd,ClassDesc*newcd);
00190 
00191     <font class="comment">// do not allow copy constructor or assignment</font>
00192     ClassDesc(<font class="keyword">const</font> ClassDesc&amp;);
00193     <font class="keywordtype">void</font> operator=(<font class="keyword">const</font> ClassDesc&amp;);
00194 
00195     <font class="comment">// this is used for temporary parent class descriptors</font>
00196     ClassDesc(<font class="keyword">const</font> <font class="keywordtype">char</font>*);
00197     <font class="keywordtype">void</font> init(<font class="keyword">const</font> <font class="keywordtype">char</font>*,<font class="keywordtype">int</font>=1,<font class="keyword">const</font> <font class="keywordtype">char</font>* p=0,
00198               DescribedClass* (*ctor)()=0,
00199               DescribedClass* (*keyvalctor)(<font class="keyword">const</font> Ref&lt;KeyVal&gt;&amp;)=0,
00200               DescribedClass* (*stateinctor)(StateIn&amp;)=0);
00201   <font class="keyword">public</font>:
00202     ClassDesc(<font class="keyword">const</font> std::type_info&amp;, <font class="keyword">const</font> <font class="keywordtype">char</font>*,<font class="keywordtype">int</font>=1,<font class="keyword">const</font> <font class="keywordtype">char</font>* p=0,
00203               DescribedClass* (*ctor)()=0,
00204               DescribedClass* (*keyvalctor)(<font class="keyword">const</font> Ref&lt;KeyVal&gt;&amp;)=0,
00205               DescribedClass* (*stateinctor)(StateIn&amp;)=0);
00206     ~ClassDesc();
00207 
00208     <font class="keyword">static</font> AVLMap&lt;ClassKey,ClassDescP&gt;&amp; all();
00209     <font class="keyword">const</font> ParentClasses&amp; parents()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> parents_; }
00210 
00212     <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__ClassDesc.html#d1">list_all_classes</a>();
00215     <font class="keyword">static</font> ClassDesc* <a class="code" href="class_sc__ClassDesc.html#d2">name_to_class_desc</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>*);
00217     <font class="keyword">static</font> ClassDesc *<a class="code" href="class_sc__ClassDesc.html#d3">class_desc</a>(<font class="keyword">const</font> std::type_info &amp;);
<a name="l00219"></a><a class="code" href="class_sc__ClassDesc.html#a3">00219</a>     <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="class_sc__ClassDesc.html#a3">name</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> classname_; }
<a name="l00221"></a><a class="code" href="class_sc__ClassDesc.html#a4">00221</a>     <font class="keywordtype">int</font> <a class="code" href="class_sc__ClassDesc.html#a4">version</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> version_; }
00223     DescribedClass* <a class="code" href="class_sc__ClassDesc.html#a5">create_described_class</a>() <font class="keyword">const</font>;
00231     <font class="keyword">virtual</font> DescribedClass* <a class="code" href="class_sc__ClassDesc.html#a6">create</a>() <font class="keyword">const</font>;
00237     <font class="keyword">virtual</font> DescribedClass* <a class="code" href="class_sc__ClassDesc.html#a6">create</a>(<font class="keyword">const</font> Ref&lt;KeyVal&gt;&amp;) <font class="keyword">const</font>;
00243     <font class="keyword">virtual</font> DescribedClass* <a class="code" href="class_sc__ClassDesc.html#a6">create</a>(StateIn&amp;) <font class="keyword">const</font>;
00244 
00247     <font class="keyword">static</font> <font class="keywordtype">int</font> <a class="code" href="class_sc__ClassDesc.html#d4">load_class</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* classname);
00248 };
00249 
<a name="l00257"></a><a class="code" href="class_sc__DescribedClass.html">00257</a> <font class="keyword">class </font>DescribedClass : <font class="keyword">public</font> RefCount {
00258   <font class="keyword">public</font>:
00259     DescribedClass();
00260     DescribedClass(<font class="keyword">const</font> DescribedClass&amp;);
00261     DescribedClass&amp; operator=(<font class="keyword">const</font> DescribedClass&amp;);
00262     <font class="keyword">virtual</font> ~DescribedClass();
00265     ClassDesc* <a class="code" href="class_sc__DescribedClass.html#a4">class_desc</a>() <font class="keyword">const</font>;
00267     <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="class_sc__DescribedClass.html#a5">class_name</a>() <font class="keyword">const</font>;
00269     <font class="keywordtype">int</font> <a class="code" href="class_sc__DescribedClass.html#a6">class_version</a>() <font class="keyword">const</font>;
00271     <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__DescribedClass.html#a7">print</a>(std::ostream&amp; = ExEnv::out0()) <font class="keyword">const</font>;
00272   };
00273 
00275 template &lt;class T&gt;
00276 <font class="keyword">inline</font> ClassDesc *
00277 class_desc()<font class="keyword"></font>
00278 <font class="keyword"></font>{
00279   <font class="keywordflow">return</font> ClassDesc::class_desc(<font class="keyword">typeid</font>(T));
00280 }
00281 
00284 <font class="keyword">inline</font> ClassDesc *
00285 class_desc(DescribedClass *d)<font class="keyword"></font>
00286 <font class="keyword"></font>{
00287   <font class="keywordflow">return</font> ClassDesc::class_desc(<font class="keyword">typeid</font>(*d));
00288 }
00289 
00292 template&lt;class T&gt;
00293 <font class="keyword">inline</font> T
00294 require_dynamic_cast(DescribedClass*p,<font class="keyword">const</font> <font class="keywordtype">char</font> * errmsg,...)<font class="keyword"></font>
00295 <font class="keyword"></font>{
00296   T t = dynamic_cast&lt;T&gt;(p);
00297   <font class="keywordflow">if</font> (p &amp;&amp; !t) {
00298       va_list args;
00299       va_start(args,errmsg);
00300       fprintf(stderr,<font class="stringliteral">"A required dynamic_cast failed in: "</font>);
00301       vfprintf(stderr,errmsg,args);
00302       fprintf(stderr,<font class="stringliteral">"\nwanted type \"%s\" but got \"%s\"\n"</font>,
00303               <font class="keyword">typeid</font>(T).name(),p-&gt;class_desc()-&gt;name());
00304       fflush(stderr);
00305       va_end(args);
00306       abort();
00307   }
00308   <font class="keywordflow">return</font> t;
00309 }
00310 
00313 template&lt;class T&gt;
00314 <font class="keyword">inline</font> T
00315 require_dynamic_cast(<font class="keyword">const</font> DescribedClass*p,<font class="keyword">const</font> <font class="keywordtype">char</font> * errmsg,...)<font class="keyword"></font>
00316 <font class="keyword"></font>{
00317   T t = dynamic_cast&lt;T&gt;(p);
00318   <font class="keywordflow">if</font> (p &amp;&amp; !t) {
00319       va_list args;
00320       va_start(args,errmsg);
00321       fprintf(stderr,<font class="stringliteral">"A required dynamic_cast failed in: "</font>);
00322       vfprintf(stderr,errmsg,args);
00323       fprintf(stderr,<font class="stringliteral">"\nwanted type \"%s\" but got \"%s\"\n"</font>,
00324               <font class="keyword">typeid</font>(T).name(),p-&gt;class_desc()-&gt;name());
00325       fflush(stderr);
00326       va_end(args);
00327       abort();
00328   }
00329   <font class="keywordflow">return</font> t;
00330 }
00331 
00334 template &lt;class A&gt;
<a name="l00335"></a><a class="code" href="class_sc__ForceLinkBase.html">00335</a> <font class="keyword">class </font>ForceLinkBase {
00336   <font class="keyword">public</font>:
00337     <font class="keyword">virtual</font> ~ForceLinkBase()<font class="keyword"> </font>{};
00338     <font class="keyword">virtual</font> DescribedClass *create(A) = 0;
00339 };
00340 
00350 template &lt;class T, class A = const Ref&lt;KeyVal&gt; &amp;&gt;
<a name="l00351"></a><a class="code" href="class_sc__ForceLink.html">00351</a> <font class="keyword">class </font>ForceLink: <font class="keyword">public</font> ForceLinkBase&lt;A&gt; {
00352   <font class="keyword">public</font>:
00353     DescribedClass *create(A a)<font class="keyword"> </font>{ <font class="keywordflow">return</font> <font class="keyword">new</font> T(a); }
00354 };
00355 
00356 }
00357 
00358 <font class="preprocessor">#endif</font>
00359 <font class="preprocessor"></font>
00360 <font class="comment">// Local Variables:</font>
00361 <font class="comment">// mode: c++</font>
00362 <font class="comment">// c-file-style: "CLJ"</font>
00363 <font class="comment">// End:</font>
</div></pre><hr>
<address>
<small>

Generated at Mon Oct 14 14:16:36 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>