regmacros.h Source File
API: regmacros.h Source File
16#ifndef __OMNETPP_REGMACROS_H
17#define __OMNETPP_REGMACROS_H
19#include "simkerneldefs.h"
42#define Define_NED_Math_Function(NAME,ARGCOUNT) \
43 EXECUTE_ON_STARTUP(omnetpp::internal::nedFunctions.getInstance()->add(new omnetpp::cNedMathFunction(#NAME,NAME,ARGCOUNT));)
52#define Define_NED_Math_Function2(NAME,FUNCTION,ARGCOUNT) \
53 EXECUTE_ON_STARTUP(omnetpp::internal::nedFunctions.getInstance()->add(new omnetpp::cNedMathFunction(#NAME,FUNCTION,ARGCOUNT));)
60#define Define_NED_Math_Function3(NAME,ARGCOUNT,CATEGORY,DESCRIPTION) \
61 EXECUTE_ON_STARTUP(omnetpp::internal::nedFunctions.getInstance()->add(new omnetpp::cNedMathFunction(#NAME,NAME,ARGCOUNT,CATEGORY,DESCRIPTION));)
68#define Define_NED_Math_Function4(NAME,FUNCTION,ARGCOUNT,CATEGORY,DESCRIPTION) \
69 EXECUTE_ON_STARTUP(omnetpp::internal::nedFunctions.getInstance()->add(new omnetpp::cNedMathFunction(#NAME,FUNCTION,ARGCOUNT,CATEGORY,DESCRIPTION));)
96#define Define_NED_Function(FUNCTION,SIGNATURE) \
97 EXECUTE_ON_STARTUP(omnetpp::internal::nedFunctions.getInstance()->add(new omnetpp::cNedFunction(FUNCTION,SIGNATURE));)
105#define Define_NED_Function2(FUNCTION,SIGNATURE,CATEGORY,DESCRIPTION) \
106 EXECUTE_ON_STARTUP(omnetpp::internal::nedFunctions.getInstance()->add(new omnetpp::cNedFunction(FUNCTION,SIGNATURE,CATEGORY,DESCRIPTION));)
117#define Register_Class(CLASSNAME) __REGISTER_CLASS(CLASSNAME, omnetpp::cObject, "class")
128#define Register_Abstract_Class(CLASSNAME) __REGISTER_ABSTRACT_CLASS(CLASSNAME, omnetpp::cObject, "class")
136#define Define_Module(CLASSNAME) __REGISTER_CLASS(CLASSNAME, omnetpp::cModule, "module")
144#define Define_Channel(CLASSNAME) __REGISTER_CLASS(CLASSNAME, omnetpp::cChannel, "channel")
147#define __REGISTER_CLASS(CLASSNAME, BASECLASS, DESC) \
148 __REGISTER_CLASS_X(CLASSNAME, BASECLASS, DESC, )
151#define __REGISTER_CLASS_X(CLASSNAME, BASECLASS, DESC, EXTRACODE) \
152 static omnetpp::cObject *MAKE_UNIQUE_WITHIN_FILE(__factoryfunc_)() {BASECLASS *ret = new CLASSNAME; return ret; } \
153 static void *MAKE_UNIQUE_WITHIN_FILE(__castfunc_)(omnetpp::cObject *obj) {return (void*)dynamic_cast<CLASSNAME*>(obj);} \
154 EXECUTE_ON_STARTUP(omnetpp::internal::classes.getInstance()->add(new omnetpp::cObjectFactory(omnetpp::opp_typename(typeid(CLASSNAME)), MAKE_UNIQUE_WITHIN_FILE(__factoryfunc_), MAKE_UNIQUE_WITHIN_FILE(__castfunc_), DESC)); EXTRACODE; )
157#define __REGISTER_ABSTRACT_CLASS(CLASSNAME, BASECLASS , DESC) \
158 static void *MAKE_UNIQUE_WITHIN_FILE(__castfunc_)(omnetpp::cObject *obj) {return (void*)dynamic_cast<CLASSNAME*>(obj);} \
159 EXECUTE_ON_STARTUP(omnetpp::internal::classes.getInstance()->add(new omnetpp::cObjectFactory(omnetpp::opp_typename(typeid(CLASSNAME)), nullptr, MAKE_UNIQUE_WITHIN_FILE(__castfunc_), DESC));)
166#define Register_ClassDescriptor(DESCRIPTORCLASS) \
167 EXECUTE_ON_STARTUP(omnetpp::internal::classDescriptors.getInstance()->add(new DESCRIPTORCLASS());)
170#define __REGISTER_CONFIGOPTION(ID, ARGLIST) \
171 OPP_DLLEXPORT omnetpp::cConfigOption *ID; \
172 EXECUTE_ON_STARTUP(omnetpp::internal::configOptions.getInstance()->add(ID = new omnetpp::cConfigOption ARGLIST);)
179#define Register_GlobalConfigOption(ID, NAME, TYPE, DEFAULTVALUE, DESCRIPTION) \
180 __REGISTER_CONFIGOPTION(ID, (NAME, true, omnetpp::cConfigOption::TYPE, nullptr, DEFAULTVALUE, DESCRIPTION))
187#define Register_PerRunConfigOption(ID, NAME, TYPE, DEFAULTVALUE, DESCRIPTION) \
188 __REGISTER_CONFIGOPTION(ID, (NAME, false, omnetpp::cConfigOption::TYPE, nullptr, DEFAULTVALUE, DESCRIPTION))
196#define Register_GlobalConfigOptionU(ID, NAME, UNIT, DEFAULTVALUE, DESCRIPTION) \
197 __REGISTER_CONFIGOPTION(ID, (NAME, true, omnetpp::cConfigOption::CFG_DOUBLE, UNIT, DEFAULTVALUE, DESCRIPTION))
205#define Register_PerRunConfigOptionU(ID, NAME, UNIT, DEFAULTVALUE, DESCRIPTION) \
206 __REGISTER_CONFIGOPTION(ID, (NAME, false, omnetpp::cConfigOption::CFG_DOUBLE, UNIT, DEFAULTVALUE, DESCRIPTION))
213#define Register_PerObjectConfigOption(ID, NAME, KIND, TYPE, DEFAULTVALUE, DESCRIPTION) \
214 __REGISTER_CONFIGOPTION(ID, (NAME, omnetpp::cConfigOption::KIND, omnetpp::cConfigOption::TYPE, nullptr, DEFAULTVALUE, DESCRIPTION))
222#define Register_PerObjectConfigOptionU(ID, NAME, KIND, UNIT, DEFAULTVALUE, DESCRIPTION) \
223 __REGISTER_CONFIGOPTION(ID, (NAME, omnetpp::cConfigOption::KIND, omnetpp::cConfigOption::CFG_DOUBLE, UNIT, DEFAULTVALUE, DESCRIPTION))
230#define Register_MessagePrinter(CLASSNAME) \
231 EXECUTE_ON_STARTUP(omnetpp::internal::messagePrinters.getInstance()->add(new CLASSNAME());)
234#define __OPP_IDENTITY(...) __VA_ARGS__
251#define Register_Enum(NAME, VALUES) \
252 EXECUTE_ON_STARTUP( \
253 omnetpp::cEnum *tmp = new omnetpp::cEnum(omnetpp::opp_typename(typeid(NAME))); \
254 tmp->registerNames(#VALUES); \
255 tmp->registerValues<NAME>( std::initializer_list<NAME> { __OPP_IDENTITY VALUES } ); \
256 omnetpp::internal::enums.getInstance()->add(tmp); \
278#define Register_Enum2(VAR, NAMESTR, VALUES) \
279 omnetpp::cEnum *VAR; \
280 EXECUTE_ON_STARTUP(VAR = new omnetpp::cEnum(NAMESTR); VAR->bulkInsert VALUES; omnetpp::internal::enums.getInstance()->add(VAR))
298#define Register_Enum_WithVar(VAR, NAME, VALUES) \
299 omnetpp::cEnum *VAR; \
300 EXECUTE_ON_STARTUP( \
301 omnetpp::cEnum *tmp = VAR = new omnetpp::cEnum(omnetpp::opp_typename(typeid(NAME))); \
302 tmp->registerNames(#VALUES); \
303 tmp->registerValues<NAME>( std::initializer_list<NAME> { __OPP_IDENTITY VALUES } ); \
304 omnetpp::internal::enums.getInstance()->add(tmp); \
325#define Register_Enum_Custom(VAR, NAME, NAME_VALUE_PAIRS) \
326 omnetpp::cEnum *VAR; \
327 EXECUTE_ON_STARTUP( \
328 omnetpp::cEnum *tmp = VAR = new omnetpp::cEnum(omnetpp::opp_typename(typeid(NAME))); \
329 tmp->addPairs(std::initializer_list<std::pair<const char*,NAME>> { __OPP_IDENTITY NAME_VALUE_PAIRS } ); \
330 omnetpp::internal::enums.getInstance()->add(tmp); \
347#define Register_Figure(NAME, CLASSNAME) \
348 __REGISTER_CLASS_X(CLASSNAME, omnetpp::cFigure, "figure", omnetpp::internal::figureTypes[NAME] = omnetpp::opp_typename(typeid(CLASSNAME)))