VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkObjectFactory.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00040 #ifndef __vtkObjectFactory_h 00041 #define __vtkObjectFactory_h 00042 00043 #include "vtkCommonCoreModule.h" // For export macro 00044 #include "vtkObject.h" 00045 00046 class vtkObjectFactoryCollection; 00047 class vtkOverrideInformationCollection; 00048 class vtkCollection; 00049 00050 class VTKCOMMONCORE_EXPORT vtkObjectFactory : public vtkObject 00051 { 00052 public: 00053 // Class Methods used to interface with the registered factories 00054 00059 static vtkObject* CreateInstance(const char* vtkclassname); 00060 00063 static void ConstructInstance(const char* vtkclassname); 00064 00066 00069 static void CreateAllInstance(const char* vtkclassname, 00070 vtkCollection* retList); 00072 00074 static void ReHash(); 00076 static void RegisterFactory(vtkObjectFactory* ); 00078 static void UnRegisterFactory(vtkObjectFactory*); 00080 static void UnRegisterAllFactories(); 00081 00084 static vtkObjectFactoryCollection* GetRegisteredFactories(); 00085 00088 static int HasOverrideAny(const char* className); 00089 00091 00093 static void GetOverrideInformation(const char* name, 00094 vtkOverrideInformationCollection*); 00096 00098 00100 static void SetAllEnableFlags(int flag, 00101 const char* className); 00103 00104 00106 static void SetAllEnableFlags(int flag, 00107 const char* className, 00108 const char* subclassName); 00110 00111 // Instance methods to be used on individual instances of vtkObjectFactory 00112 00113 // Methods from vtkObject 00114 vtkTypeMacro(vtkObjectFactory,vtkObject); 00116 virtual void PrintSelf(ostream& os, vtkIndent indent); 00117 00124 virtual const char* GetVTKSourceVersion() = 0; 00125 00127 virtual const char* GetDescription() = 0; 00128 00130 virtual int GetNumberOfOverrides(); 00131 00133 virtual const char* GetClassOverrideName(int index); 00134 00137 virtual const char* GetClassOverrideWithName(int index); 00138 00140 virtual int GetEnableFlag(int index); 00141 00143 virtual const char* GetOverrideDescription(int index); 00144 00146 00148 virtual void SetEnableFlag(int flag, 00149 const char* className, 00150 const char* subclassName); 00151 virtual int GetEnableFlag(const char* className, 00152 const char* subclassName); 00154 00156 virtual int HasOverride(const char* className); 00158 virtual int HasOverride(const char* className, const char* subclassName); 00159 00162 virtual void Disable(const char* className); 00163 00165 00166 vtkGetStringMacro(LibraryPath); 00168 00169 //BTX 00170 typedef vtkObject* (*CreateFunction)(); 00171 //ETX 00172 protected: 00173 //BTX 00174 00176 00177 void RegisterOverride(const char* classOverride, 00178 const char* overrideClassName, 00179 const char* description, 00180 int enableFlag, 00181 CreateFunction createFunction); 00183 00184 //ETX 00185 00186 00190 virtual vtkObject* CreateObject(const char* vtkclassname ); 00191 00192 vtkObjectFactory(); 00193 ~vtkObjectFactory(); 00194 //BTX 00195 struct OverrideInformation 00196 { 00197 char* Description; 00198 char* OverrideWithName; 00199 int EnabledFlag; 00200 CreateFunction CreateCallback; 00201 }; 00202 //ETX 00203 OverrideInformation* OverrideArray; 00204 char** OverrideClassNames; 00205 int SizeOverrideArray; 00206 int OverrideArrayLength; 00207 00208 private: 00209 void GrowOverrideArray(); 00210 00213 static void Init(); 00215 static void RegisterDefaults(); 00217 static void LoadDynamicFactories(); 00219 static void LoadLibrariesInPath( const char*); 00220 00221 // list of registered factories 00222 static vtkObjectFactoryCollection* RegisteredFactories; 00223 00224 // member variables for a factory set by the base class 00225 // at load or register time 00226 void* LibraryHandle; 00227 char* LibraryVTKVersion; 00228 char* LibraryCompilerUsed; 00229 char* LibraryPath; 00230 private: 00231 vtkObjectFactory(const vtkObjectFactory&); // Not implemented. 00232 void operator=(const vtkObjectFactory&); // Not implemented. 00233 }; 00234 00235 // Macro to create an object creation function. 00236 // The name of the function will by vtkObjectFactoryCreateclassname 00237 // where classname is the name of the class being created 00238 #define VTK_CREATE_CREATE_FUNCTION(classname) \ 00239 static vtkObject* vtkObjectFactoryCreate##classname() \ 00240 { return classname::New(); } 00241 00242 #endif 00243 00244 #define VTK_FACTORY_INTERFACE_EXPORT VTKCOMMONCORE_EXPORT 00245 00246 // Macro to create the interface "C" functions used in 00247 // a dll or shared library that contains a VTK object factory. 00248 // Put this function in the .cxx file of your object factory, 00249 // and pass in the name of the factory sub-class that you want 00250 // the dll to create. 00251 #define VTK_FACTORY_INTERFACE_IMPLEMENT(factoryName) \ 00252 extern "C" \ 00253 VTK_FACTORY_INTERFACE_EXPORT \ 00254 const char* vtkGetFactoryCompilerUsed() \ 00255 { \ 00256 return VTK_CXX_COMPILER; \ 00257 } \ 00258 extern "C" \ 00259 VTK_FACTORY_INTERFACE_EXPORT \ 00260 const char* vtkGetFactoryVersion() \ 00261 { \ 00262 return VTK_SOURCE_VERSION; \ 00263 } \ 00264 extern "C" \ 00265 VTK_FACTORY_INTERFACE_EXPORT \ 00266 vtkObjectFactory* vtkLoad() \ 00267 { \ 00268 return factoryName ::New(); \ 00269 } 00270 00271 // Macro to implement the body of the object factory form of the New() method. 00272 #define VTK_OBJECT_FACTORY_NEW_BODY(thisClass) \ 00273 vtkObject* ret = vtkObjectFactory::CreateInstance(#thisClass); \ 00274 if(ret) \ 00275 { \ 00276 return static_cast<thisClass*>(ret); \ 00277 } \ 00278 return new thisClass; 00279 00280 // Macro to implement the body of the abstract object factory form of the New() 00281 // method, i.e. an abstract base class that can only be instantiated if the 00282 // object factory overrides it. 00283 #define VTK_ABSTRACT_OBJECT_FACTORY_NEW_BODY(thisClass) \ 00284 vtkObject* ret = vtkObjectFactory::CreateInstance(#thisClass); \ 00285 if(ret) \ 00286 { \ 00287 return static_cast<thisClass*>(ret); \ 00288 } \ 00289 vtkGenericWarningMacro("Error: no override found for '" #thisClass "'."); \ 00290 return NULL; 00291 00292 // Macro to implement the body of the standard form of the New() method. 00293 #if defined(VTK_ALL_NEW_OBJECT_FACTORY) 00294 # define VTK_STANDARD_NEW_BODY(thisClass) \ 00295 VTK_OBJECT_FACTORY_NEW_BODY(thisClass) 00296 #elif defined(VTK_DEBUG_LEAKS) 00297 # define VTK_STANDARD_NEW_BODY(thisClass) \ 00298 thisClass *result = new thisClass; \ 00299 vtkObjectFactory::ConstructInstance(result->GetClassName()); \ 00300 return result; 00301 #else 00302 # define VTK_STANDARD_NEW_BODY(thisClass) \ 00303 return new thisClass; 00304 #endif 00305 00306 // Macro to implement the standard form of the New() method. 00307 #define vtkStandardNewMacro(thisClass) \ 00308 thisClass* thisClass::New() \ 00309 { \ 00310 VTK_STANDARD_NEW_BODY(thisClass) \ 00311 } \ 00312 vtkInstantiatorNewMacro(thisClass) 00313 00314 // Macro to implement the object factory form of the New() method. 00315 #define vtkObjectFactoryNewMacro(thisClass) \ 00316 thisClass* thisClass::New() \ 00317 { \ 00318 VTK_OBJECT_FACTORY_NEW_BODY(thisClass) \ 00319 } \ 00320 vtkInstantiatorNewMacro(thisClass) 00321 00322 // Macro to implement the abstract object factory form of the New() method. 00323 // That is an abstract base class that can only be instantiated if the 00324 // object factory overrides it. 00325 #define vtkAbstractObjectFactoryNewMacro(thisClass) \ 00326 thisClass* thisClass::New() \ 00327 { \ 00328 VTK_ABSTRACT_OBJECT_FACTORY_NEW_BODY(thisClass) \ 00329 } \ 00330 vtkInstantiatorNewMacro(thisClass)