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

Register.h

Go to the documentation of this file.
00001 /*
00002     File:       Register.h
00003 
00004     Function:   Class registry
00005 
00006     Author:     Andrew Willmott
00007 */
00008 
00009 #ifndef __Register__
00010 #define __Register__
00011 
00012 #include "cl/Basics.h"
00013 #include "cl/Array.h"
00014 
00015 typedef UInt32 ClassID;
00016 typedef Void *(*ObjectCreator)();
00017 
00018 struct RegistryEntry
00019 {
00020     ClassID         baseID;
00021     ClassID         id;
00022     ObjectCreator   creator;
00023     const Char      *name;
00024     const Char      *description;
00025 };
00026 
00027 typedef Array<RegistryEntry>    ClassTable;
00028 
00029 struct BaseEntry
00030 {
00031     ClassID     baseID;
00032     ClassTable  table;
00033 };
00034 
00035 typedef Array<BaseEntry>        BaseTable;
00036 
00037 class Register
00038 {
00039 public:
00040     Register(
00041         ClassID         id,       
00042         ObjectCreator   creator,       
00043         const           Char *name = "untitled",    
00044         const           Char *description = 0
00045     ) { RegisterClass('none', id, creator, name, description); };
00046     
00047     Register(
00048         ClassID         baseID, 
00049         ClassID         id,       
00050         ObjectCreator   creator,       
00051         const           Char *name = "untitled",    
00052         const           Char *description = 0
00053     ) { RegisterClass(baseID, id, creator, name, description); };
00054 
00055 
00056     static Void     RegisterClass(
00057         ClassID         baseID, 
00058         ClassID         id,       
00059         ObjectCreator   creator,       
00060         const           Char *name = "untitled",    
00061         const           Char *description = 0
00062     );
00063 
00064     static Void     *MakeObject(ClassID id);
00065     static Void     *MakeObject(const Char *name);
00066     static Void     *MakeObject(ClassID baseID, ClassID id);
00067     static Void     *MakeObject(ClassID baseID, const Char *name);
00068     static Void     ListObjects();
00069     static Void     ListObjects(ClassID baseID);
00070     
00071 protected:
00072     static ClassTable   *FindClassTable(ClassID baseID);
00073     static BaseTable    *table;
00074 };
00075 
00076 #define MAKE_REGISTRAR(REGISTRAR, BASE_ID)                              \
00077     class REGISTRAR : public Register                                   \
00078     {                                                                   \
00079     public:                                                             \
00080         REGISTRAR(                                                      \
00081             ClassID         id,                                         \
00082             ObjectCreator   creator,                                    \
00083             const           Char *name = "untitled",                    \
00084             const           Char *description = 0                       \
00085         ) : Register(BASE_ID, id, creator, name, description) {};       \
00086     }
00087 
00088 #endif
00089 

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