Main Page Class Hierarchy Compound List File List Compound Members File Members

Register.cc

Go to the documentation of this file.
00001 #include "cl/Register.h"
00002 #include <string.h>
00003 
00004 
00005 BaseTable *Register::table = 0;
00006 
00007  Void PrintClassID(ostream &s, ClassID &id)
00008 {
00009 char *t = (char*) &id;
00010 s << '<' << t[0] << t[1] << t[2] << t[3] << '>';
00011 }
00012 
00013 
00014 // --- Register methods ----------------------------------
00015 
00016 
00017  Void Register::RegisterClass(
00018 ClassID baseID, 
00019 ClassID id, 
00020 ObjectCreator creator, 
00021 const Char *name, 
00022 const Char *description 
00023 )
00024 {
00025 Int i = 0;
00026 ClassTable *ctable;
00027 
00028 if (!table)
00029 table = new BaseTable;
00030 else
00031 while (i < table->NumItems())
00032 {
00033 if ((*table)[i].baseID == baseID)
00034 break;
00035 else
00036 i++;
00037 }
00038 
00039 if (i == table->NumItems())
00040 {
00041 table->Add(1);
00042 table->Last().baseID = baseID;
00043 }
00044 
00045 ctable = &((*table)[i].table);
00046 ctable->Add(1);
00047 ctable->Last().id = id;
00048 ctable->Last().creator = creator;
00049 ctable->Last().name = name;
00050 ctable->Last().description = description;
00051 }
00052 
00053  ClassTable *Register::FindClassTable(ClassID baseID)
00054 {
00055 Int i = 0;
00056 
00057 if (!table)
00058 table = new BaseTable;
00059 else
00060 while (i < table->NumItems())
00061 {
00062 if ((*table)[i].baseID == baseID)
00063 break;
00064 else
00065 i++;
00066 } 
00067 
00068 if (i < table->NumItems())
00069 return(&((*table)[i].table));
00070 else
00071 return(0);
00072 }
00073 
00074  Void Register::ListObjects(ClassID baseID)
00075 {
00076 Int i;
00077 ClassTable *ctable = FindClassTable(baseID);
00078 
00079 if (!ctable)
00080 return;
00081 
00082 for (i = 0; i < ctable->NumItems(); i++)
00083 {
00084 cout << " ";
00085 PrintClassID(cout, (*ctable)[i].id);
00086 cout << " " << (*ctable)[i].name;
00087 if ((*ctable)[i].description)
00088 cout << ", " << (*ctable)[i].description;
00089 cout << endl;
00090 }
00091 }
00092 
00093  Void Register::ListObjects()
00094 {
00095 Int i, j;
00096 ClassTable *ctable;
00097 
00098 if (!table) return;
00099 
00100 for (j = 0; j < table->NumItems(); j++)
00101 {
00102 PrintClassID(cout, (*table)[j].baseID);
00103 cout << endl;
00104 ctable = &((*table)[j].table);
00105 for (i = 0; i < ctable->NumItems(); i++)
00106 {
00107 cout << " ";
00108 PrintClassID(cout, (*ctable)[i].id);
00109 cout << " " << (*ctable)[i].name;
00110 if ((*ctable)[i].description)
00111 cout << ", " << (*ctable)[i].description;
00112 cout << endl;
00113 }
00114 }
00115 }
00116 
00117  Void *Register::MakeObject(ClassID id)
00118 {
00119 return(MakeObject('none', id));
00120 }
00121 
00122  Void *Register::MakeObject(ClassID baseID, ClassID id)
00123 {
00124 ClassTable *ctable;
00125 Int i = 0;
00126 
00127 if (!(ctable = FindClassTable(baseID)))
00128 return(0);
00129 
00130 while (i < ctable->NumItems())
00131 {
00132 if ((*ctable)[i].id == id)
00133 break;
00134 else
00135 i++;
00136 }
00137 
00138 if (i == ctable->NumItems())
00139 {
00140 Assert(false, "(Register::MakeObject) Can't find class ID");
00141 return(0);
00142 }
00143 return((*(*ctable)[i].creator)());
00144 }
00145 
00146  Void *Register::MakeObject(const Char *name)
00147 {
00148 return(MakeObject('none', name)); 
00149 }
00150 
00151  Void *Register::MakeObject(ClassID baseID, const Char *name)
00152 {
00153 ClassTable *ctable;
00154 Int i = 0;
00155 
00156 if (!(ctable = FindClassTable(baseID)))
00157 return(0);
00158 
00159 while (i < ctable->NumItems())
00160 {
00161 if (strcmp((*ctable)[i].name, name) == 0)
00162 break;
00163 else
00164 i++;
00165 }
00166 
00167 if (i == ctable->NumItems())
00168 {
00169 Assert(false, "(Register::MakeObject) Can't find name");
00170 return(0);
00171 }
00172 return((*(*ctable)[i].creator)());
00173 }
00174 
00175 #include "cl/CLConfig.h"
00176 
00177 #ifdef CL_TMPL_INST
00178 template class Array<RegistryEntry>;
00179 template class Array<BaseEntry>;
00180 #endif
00181 
00182 #ifdef CL_SGI_INST
00183 #pragma instantiate Array<RegistryEntry>
00184 #pragma instantiate Array<BaseEntry>
00185 #endif
00186 
00187 #ifdef TEST
00188 Int main(Int argc, Char *argv[])
00189 {
00190 
00191 return(0);
00192 }
00193 #endif

Generated at Sat Aug 5 00:16:33 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /