<!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> <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>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 <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="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 <stdio.h></font> 00036 <font class="preprocessor">#include <string.h></font> 00037 <font class="preprocessor">#include <stdarg.h></font> 00038 <font class="preprocessor">#include <iostream></font> 00039 <font class="preprocessor">#include <iomanip></font> 00040 <font class="preprocessor">#include <typeinfo></font> 00041 <font class="preprocessor">#include <util/ref/ref.h></font> 00042 <font class="preprocessor">#include <util/container/avlset.h></font> 00043 <font class="preprocessor">#include <util/container/avlmap.h></font> 00044 <font class="preprocessor">#include <util/misc/exenv.h></font> 00045 00046 <font class="keyword">namespace </font>sc { 00047 00048 template <class T, class C> 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 &member(C *c) { return c->*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&); 00070 ~ClassKey(); 00071 ClassKey& operator=(<font class="keyword">const</font> ClassKey&); 00072 <font class="keywordtype">int</font> operator==(<font class="keyword">const</font> ClassKey& ck) <font class="keyword">const</font>; 00073 <font class="keywordtype">int</font> operator<(<font class="keyword">const</font> ClassKey& 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&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&); 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&); 00109 <font class="keywordtype">void</font> operator=(<font class="keyword">const</font> ParentClasses&); 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& 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& parent(<font class="keywordtype">int</font> i)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> *_classes[i]; } 00116 ParentClass& 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& 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 <class T> 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 <class T> 00137 DescribedClass* create(<font class="keyword">const</font> Ref<KeyVal>& 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 <class T> 00145 DescribedClass* create(StateIn& 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& operator=(<font class="keyword">const</font> type_info_key&); 00157 <font class="keywordtype">int</font> operator==(<font class="keyword">const</font> type_info_key&) <font class="keyword">const</font>; 00158 <font class="keywordtype">int</font> operator<(<font class="keyword">const</font> type_info_key&) <font class="keyword">const</font>; 00159 <font class="keywordtype">int</font> cmp(<font class="keyword">const</font> type_info_key&) <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<ClassKey,ClassDescP> *all_; 00177 <font class="keyword">static</font> AVLMap<type_info_key,ClassDescP> *type_info_all_; 00178 <font class="keyword">static</font> <font class="keywordtype">char</font> * classlib_search_path_; 00179 <font class="keyword">static</font> AVLSet<ClassKey> *unresolved_parents_; 00180 00181 <font class="keywordtype">char</font>* classname_; 00182 <font class="keywordtype">int</font> version_; 00183 ParentClasses parents_; 00184 AVLSet<ClassKey> *children_; 00185 DescribedClass* (*ctor_)(); 00186 DescribedClass* (*keyvalctor_)(<font class="keyword">const</font> Ref<KeyVal>&); 00187 DescribedClass* (*stateinctor_)(StateIn&); 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&); 00193 <font class="keywordtype">void</font> operator=(<font class="keyword">const</font> ClassDesc&); 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<KeyVal>&)=0, 00200 DescribedClass* (*stateinctor)(StateIn&)=0); 00201 <font class="keyword">public</font>: 00202 ClassDesc(<font class="keyword">const</font> std::type_info&, <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<KeyVal>&)=0, 00205 DescribedClass* (*stateinctor)(StateIn&)=0); 00206 ~ClassDesc(); 00207 00208 <font class="keyword">static</font> AVLMap<ClassKey,ClassDescP>& all(); 00209 <font class="keyword">const</font> ParentClasses& 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 &); <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<KeyVal>&) <font class="keyword">const</font>; 00243 <font class="keyword">virtual</font> DescribedClass* <a class="code" href="class_sc__ClassDesc.html#a6">create</a>(StateIn&) <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&); 00261 DescribedClass& operator=(<font class="keyword">const</font> DescribedClass&); 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& = ExEnv::out0()) <font class="keyword">const</font>; 00272 }; 00273 00275 template <class T> 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<class T> 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<T>(p); 00297 <font class="keywordflow">if</font> (p && !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->class_desc()->name()); 00304 fflush(stderr); 00305 va_end(args); 00306 abort(); 00307 } 00308 <font class="keywordflow">return</font> t; 00309 } 00310 00313 template<class T> 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<T>(p); 00318 <font class="keywordflow">if</font> (p && !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->class_desc()->name()); 00325 fflush(stderr); 00326 va_end(args); 00327 abort(); 00328 } 00329 <font class="keywordflow">return</font> t; 00330 } 00331 00334 template <class A> <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 <class T, class A = const Ref<KeyVal> &> <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<A> { 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>