00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __PI_ClassManager_H__
00021 #define __PI_ClassManager_H__
00022
00023 #include "PI_API.h"
00024 #include <UT/UT_PtrArray.h>
00025
00026 class PI_API PI_ClassManager
00027 {
00028 public:
00029 PI_ClassManager() {}
00030 ~PI_ClassManager() {}
00031
00032 void addPI(const char *name, void *cs);
00033 void addSelector(const char *name, void *data, void *cs);
00034
00035 int getNumPIs() const
00036 { return myPINames.entries(); }
00037 const char *getPIName(int i) const
00038 { return myPINames(i); }
00039 void *getPIConstructor(int i) const
00040 { return myPIConstructors(i); }
00041
00042 int getNumSelectors() const
00043 { return mySelectorNames.entries(); }
00044 const char *getSelectorName(int i) const
00045 { return mySelectorNames(i); }
00046 void *getSelectorData(int i) const
00047 { return mySelectorData(i); }
00048 void *getSelectorConstructor(int i) const
00049 { return mySelectorConstructors(i); }
00050
00051 protected:
00052 UT_PtrArray<const char *> myPINames;
00053 UT_PtrArray<void *> myPIConstructors;
00054 UT_PtrArray<const char *> mySelectorNames;
00055 UT_PtrArray<void *> mySelectorConstructors;
00056 UT_PtrArray<void *> mySelectorData;
00057 };
00058
00059 PI_API PI_ClassManager *PIgetClassManager();
00060
00061 #define PI_SETUP() \
00062 class init { public: init(); int dummy; }; \
00063 static init initializer;
00064
00065 #define PI_REGISTER(name, classname) \
00066 classname::init classname::initializer; \
00067 classname::init::init() \
00068 { PIgetClassManager()->addPI(name, (void *)classname::ourConstructor); }
00069
00070 class PI_API PI_SelectorTable
00071 {
00072 public:
00073 PI_SelectorTable(const char *name, void *data, void *constructor)
00074 : myName(name), myData(data), myConstructor(constructor) { }
00075 const char *myName;
00076 void *myData;
00077 void *myConstructor;
00078 };
00079
00080 #define SELECTOR_SETUP() \
00081 class init { public: init(); int dummy; }; \
00082 static init initializer;
00083
00084 #define SELECTOR_REGISTER(name, data, classname)\
00085 classname::init classname::initializer; \
00086 classname::init::init() \
00087 { PIgetClassManager()->addSelector(name, data, \
00088 (void *)classname::ourConstructor); }
00089
00090 #define SELECTOR_SETUP_TABLE() \
00091 class init { public: init(); int dummy; }; \
00092 static init initializer;
00093
00094 #define SELECTOR_REGISTER_TABLE_BEGIN(classname) \
00095 classname::init classname::initializer; \
00096 classname::init::init() \
00097 { PI_SelectorTable table[] = {
00098
00099 #define SELECTOR_REGISTER_TABLE_ENTRY(name, data, constructor) \
00100 PI_SelectorTable(name, (void *)data, (void *)constructor),
00101
00102 #define SELECTOR_REGISTER_TABLE_END() \
00103 PI_SelectorTable(0, 0, 0) }; \
00104 for( int i = 0; table[i].myName; i++ ) \
00105 PIgetClassManager()->addSelector(table[i].myName, \
00106 table[i].myData, \
00107 table[i].myConstructor); }
00108
00109 #endif