00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkInstantiator.h,v $ 00005 Language: C++ 00006 00007 Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 00008 All rights reserved. 00009 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00010 00011 This software is distributed WITHOUT ANY WARRANTY; without even 00012 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 PURPOSE. See the above copyright notice for more information. 00014 00015 =========================================================================*/ 00072 #ifndef __vtkInstantiator_h 00073 #define __vtkInstantiator_h 00074 00075 #include "vtkObject.h" 00076 00077 // The vtkDebugLeaks singleton must be initialized before and 00078 // destroyed after the vtkInstantiator singleton. 00079 #include "vtkDebugLeaksManager.h" // Needed for proper singleton initialization 00080 00081 class vtkInstantiatorInitialize; 00082 class vtkInstantiatorHashTable; 00083 00084 class VTK_COMMON_EXPORT vtkInstantiator : public vtkObject 00085 { 00086 public: 00087 static vtkInstantiator* New(); 00088 vtkTypeRevisionMacro(vtkInstantiator,vtkObject); 00089 void PrintSelf(ostream& os, vtkIndent indent); 00090 00093 static vtkObject* CreateInstance(const char* className); 00094 00095 //BTX 00096 typedef vtkObject* (*CreateFunction)(); 00097 00099 00103 static void RegisterInstantiator(const char* className, 00104 CreateFunction createFunction); 00106 00108 00111 static void UnRegisterInstantiator(const char* className, 00112 CreateFunction createFunction); 00113 //ETX 00115 00116 protected: 00117 vtkInstantiator(); 00118 ~vtkInstantiator(); 00119 00120 // Internal storage for registered creation functions. 00121 static vtkInstantiatorHashTable* CreatorTable; 00122 00123 static void ClassInitialize(); 00124 static void ClassFinalize(); 00125 00126 //BTX 00127 friend class vtkInstantiatorInitialize; 00128 //ETX 00129 00130 private: 00131 vtkInstantiator(const vtkInstantiator&); // Not implemented. 00132 void operator=(const vtkInstantiator&); // Not implemented. 00133 }; 00134 00135 //BTX 00136 // Utility class to make sure vtkInstantiator is initialized before it 00137 // is used. 00138 class VTK_COMMON_EXPORT vtkInstantiatorInitialize 00139 { 00140 public: 00141 vtkInstantiatorInitialize(); 00142 ~vtkInstantiatorInitialize(); 00143 private: 00144 static unsigned int Count; 00145 }; 00146 00147 // This instance will show up in any translation unit that uses 00148 // vtkInstantiator. It will make sure vtkInstantiator is initialized 00149 // before it is used. 00150 static vtkInstantiatorInitialize vtkInstantiatorInitializer; 00151 //ETX 00152 00153 #endif