1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
#define REGISTER_DERIVED(ID, BASE, TYPE) \
inline BASE* create##ID() { \
return new TYPE(); \
}
#define REGISTER_TYPE(ID, BASE, TYPE) \
{ \
odfaeg::BaseFact<BASE>::register_type(typeid(TYPE).name(), &create##ID); \
}
#define REGISTER_FUNC(ID, funcName, FID, BASE, TYPE, args...) \
{ \
REGISTER_TYPE(ID, BASE, TYPE) \
odfaeg::FastDelegate<void> delegate##ID##funcName##FID (&TYPE::vt##funcName, args); \
odfaeg::BaseFact<BASE>::register_function(typeid(TYPE).name(), #funcName, #FID, delegate##ID##funcName##FID); \
}
#define CALL_FUNC(BASE, funcName, funcArgs, object, args...) \
{ \
odfaeg::BaseFact<BASE>::callFunction(typeid(*object).name(), funcName, funcArgs, object, args...); \
}
#define EXPORT_CLASS_GUID(ID, BASE, TYPE) \
REGISTER_TYPE(ID, BASE, TYPE) \
{ \
odfaeg::OTextArchive *outa##ID = nullptr; \
odfaeg::ITextArchive *ina##ID = nullptr; \
TYPE* derived##ID =nullptr; \
REGISTER_FUNC(ID, serialize, OTextArchive, BASE, TYPE, derived##ID, outa##ID) \
REGISTER_FUNC(ID, serialize, ITextArchive, BASE, TYPE, derived##ID, ina##ID) \
}
template <typename B>
class BaseFact {
public :
static void register_type(std::string typeName, B*(*func)()) {
typename std::map<std::string, B*(*)()>::iterator it = types.find(typeName);
if (it == types.end()) {
types[typeName] = func;
}
}
static void register_function(std::string typeName, std::string funcName, std::string funcArgs, FastDelegate<void> delegate) {
typename std::map<std::string, FastDelegate<void>>::iterator it = functions.find(typeName + funcName);
if (it == functions.end())
functions[typeName+funcName+funcArgs] = delegate;
}
template <typename... A>
static void callFunction(std::string typeName, std::string funcName, std::string funcArgs, A... args) {
typename std::map<std::string, FastDelegate<void>>::iterator it = functions.find(typeName+funcName+funcArgs);
if (it != functions.end()) {
it->second.setParams(args...);
(it->second)();
}
//throw Erreur(100, "Unregistered function exception!", 1);
}
static B* create (std::string typeName) {
typename std::map<std::string, B*(*)()>::iterator it = types.find(typeName);
if (it != types.end()) {
return (it->second)();
}
//throw Erreur(100, "Unregistered type exception!", 1);
}
static std::string getTypeName (B* type) {
typename std::map<std::string, B*(*)()>::iterator it = types.find(typeid(*type).name());
if (it != types.end())
return it->first;
}
private :
static std::map<std::string, B*(*)()> types;
static std::map<std::string, FastDelegate<void>> functions;
}; |
Partager