cobjectfactory.h Source File

API: cobjectfactory.h Source File
API
cobjectfactory.h
1//==========================================================================
2// COBJECTFACTORY.H - part of
3// OMNeT++/OMNEST
4// Discrete System Simulation in C++
5//
6//==========================================================================
7
8/*--------------------------------------------------------------*
9 Copyright (C) 1992-2017 Andras Varga
10 Copyright (C) 2006-2017 OpenSim Ltd.
11
12 This file is distributed WITHOUT ANY WARRANTY. See the file
13 `license' for details on this and other legal matters.
14*--------------------------------------------------------------*/
15
16#ifndef __OMNETPP_COBJECTFACTORY_H
17#define __OMNETPP_COBJECTFACTORY_H
18
19#include "simkerneldefs.h"
20#include "globals.h"
21#include "cownedobject.h"
22
23namespace omnetpp {
24
25
35class SIM_API cObjectFactory : public cNoncopyableOwnedObject
36{
37 private:
38 cObject *(*creatorFunc)();
39 void *(*castFunc)(cObject *);
40 std::string description;
41
42 public:
45
48 cObjectFactory(const char *name, cObject *(*creatorfunc)(), void *(*castfunc)(cObject *), const char *description=nullptr);
50
53
57 virtual std::string str() const override;
59
62
66 virtual bool isAbstract() const {return creatorFunc==nullptr;}
67
74 virtual cObject *createOne() const;
75
80 virtual bool isInstance(cObject *obj) const {return castFunc(obj)!=nullptr;}
81
85 const char *getDescription() const {return description.c_str();}
87
90
95 static cObjectFactory *find(const char *className, const char *contextNamespace=nullptr, bool fallbackToOmnetpp=true);
96
100 static cObjectFactory *get(const char *className, const char *contextNamespace=nullptr, bool fallbackToOmnetpp=true);
101
123 static cObject *createOne(const char *classname);
124
132 static cObject *createOneIfClassIsKnown(const char *classname);
134};
135
136
141inline cObject *createOne(const char *classname) {
142 return cObjectFactory::createOne(classname);
143}
144
149inline cObject *createOneIfClassIsKnown(const char *classname) {
151}
152
156template<class T>
157T *createByClassName(const char *className, const char *what) {
158 cObject *obj = createOneIfClassIsKnown(className);
159 if (obj == nullptr)
160 throw cRuntimeError("Cannot create %s: class \"%s\" not found", what, className);
161 T *result = dynamic_cast<T *>(obj);
162 if (result == nullptr)
163 throw cRuntimeError("Cannot create %s: class \"%s\" is not subclassed from %s", what, className, opp_typename(typeid(T)));
164 return result;
165}
166
167} // namespace omnetpp
168
169
170#endif
171
172
static cObject * createOne(const char *classname)
static cObject * createOneIfClassIsKnown(const char *classname)
static cObjectFactory * get(const char *className, const char *contextNamespace=nullptr, bool fallbackToOmnetpp=true)
virtual bool isInstance(cObject *obj) const
Definition cobjectfactory.h:80
virtual bool isAbstract() const
Definition cobjectfactory.h:66
virtual cObject * createOne() const
const char * getDescription() const
Definition cobjectfactory.h:85
static cObjectFactory * find(const char *className, const char *contextNamespace=nullptr, bool fallbackToOmnetpp=true)
virtual std::string str() const override
cObjectFactory(const char *name, cObject *(*creatorfunc)(), void *(*castfunc)(cObject *), const char *description=nullptr)
cObject is a lightweight class which serves as the root of the OMNeT++ class hierarchy....
Definition cobject.h:93
cObject * createOne(const char *classname)
Shortcut to cObjectFactory::createOne().
Definition cobjectfactory.h:141
cObject * createOneIfClassIsKnown(const char *classname)
Shortcut to cObjectFactory::createOneIfClassIsKnown().
Definition cobjectfactory.h:149
SIM_API const char * opp_typename(const std::type_info &t)
Returns the name of a C++ type, correcting the quirks of various compilers.