32 #ifndef _util_class_class_h
33 #define _util_class_class_h
45 #include <util/ref/ref.h>
46 #include <util/misc/exenv.h>
50 template <
class T,
class C>
70 enum Access { Private, Protected, Public };
79 int is_virtual()
const;
80 Access access()
const {
return _access; }
97 void init(
const char*);
100 const ParentClass& parent(
int i)
const {
return *_classes[i]; }
101 ParentClass& operator[](
int i) {
return *_classes[i]; }
102 const ParentClass& operator[](
int i)
const {
return *_classes[i]; }
103 int n()
const {
return _n; }
122 DescribedClass* create(
const Ref<KeyVal>& keyval)
124 return new T(keyval);
130 DescribedClass* create(StateIn& statein)
132 return new T(statein);
137 const std::type_info *ti_;
161 static std::map<std::string,ClassDescP> *all_;
162 static std::map<type_info_key,ClassDescP> *type_info_all_;
163 static char * classlib_search_path_;
164 static std::set<std::string> *unresolved_parents_;
169 std::set<std::string> *children_;
173 const std::type_info *ti_;
183 void init(
const char*,
int=1,
const char* p=0,
184 const std::type_info *ti=0,
189 ClassDesc(
const std::type_info&,
const char*,
int=1,
const char* p=0,
195 static std::map<std::string,ClassDescP>& all();
206 const char*
name()
const {
return classname_; }
272 class_desc(DescribedClass *d)
281 require_dynamic_cast(DescribedClass*p,
const char * errmsg,...)
283 T t =
dynamic_cast<T
>(p);
286 va_start(args,errmsg);
287 fprintf(stderr,
"A required dynamic_cast failed in: ");
288 vfprintf(stderr,errmsg,args);
289 fprintf(stderr,
"\nwanted type \"%s\" but got \"%s\"\n",
290 typeid(T).name(),p->class_desc()->name());
302 require_dynamic_cast(
const DescribedClass*p,
const char * errmsg,...)
304 T t =
dynamic_cast<T
>(p);
307 va_start(args,errmsg);
308 fprintf(stderr,
"A required dynamic_cast failed in: ");
309 vfprintf(stderr,errmsg,args);
310 fprintf(stderr,
"\nwanted type \"%s\" but got \"%s\"\n",
311 typeid(T).name(),p->class_desc()->name());
338 template <
class T,
class A = const Ref<KeyVal> &>