00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00030 #ifndef __vtkTypeTemplate_h
00031 #define __vtkTypeTemplate_h
00032
00033 #include "vtkObjectBase.h"
00034 #include <typeinfo>
00035
00036 template<class ThisT, class BaseT>
00037 class vtkTypeTemplate :
00038 public BaseT
00039 {
00040 public:
00041 typedef BaseT Superclass;
00042
00043 ThisT* NewInstance() const
00044 {
00045 return ThisT::SafeDownCast(this->NewInstanceInternal());
00046 }
00047
00048 static ThisT* SafeDownCast(vtkObjectBase* o)
00049 {
00050 if(o && o->IsA(typeid(ThisT).name()))
00051 {
00052 return static_cast<ThisT*>(o);
00053 }
00054
00055 return 0;
00056 }
00057
00058 protected:
00059 virtual vtkObjectBase* NewInstanceInternal() const
00060 {
00061 return ThisT::New();
00062 }
00063
00064
00065
00066
00067 static int IsTypeOf(const char* type)
00068 {
00069 if(!strcmp(typeid(ThisT).name(), type))
00070 {
00071 return 1;
00072 }
00073 return BaseT::IsTypeOf(type);
00074 }
00075
00076
00077
00078
00079 virtual int IsA(const char *type)
00080 {
00081 return this->IsTypeOf(type);
00082 }
00083
00084 private:
00085 virtual const char* GetClassNameInternal() const
00086 {
00087 return typeid(ThisT).name();
00088 }
00089 };
00090
00091 #endif
00092