nidas v1.2.3
|
#include <nidas/util/InvalidParameterException.h>
#include "DOMObjectFactory.h"
#include "XDOM.h"
#include "XMLStringConverter.h"
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMNode.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMException.hpp>
#include <xercesc/dom/DOMNamedNodeMap.hpp>
Go to the source code of this file.
Classes | |
class | nidas::core::DOMable |
Interface of an object that can be instantiated from a DOM element, via the fromDOMElement method, or that can be serialized into a DOM, via the toDOMParent/toDOMElement method. More... | |
Namespaces | |
namespace | nidas |
Root namespace for the NCAR In-Situ Data Acquisition Software. | |
namespace | nidas::core |
The essential core classes of nidas. | |
Macros | |
#define | NIDAS_CREATOR_FUNCTION(CLASSNAME) |
Define a "creator" function, an extern "C" function that invokes a public no-arg constructor for a class. | |
#define | NIDAS_CREATOR_FUNCTION_NS(NS, CLASSNAME) |
Same as NIDAS_CREATOR_FUNCTION(CLASSNAME), but with a namespace argument, indicating a namespace under nidas::dynld. | |
#define NIDAS_CREATOR_FUNCTION | ( | CLASSNAME | ) |
Define a "creator" function, an extern "C" function that invokes a public no-arg constructor for a class.
CLASSNAME | Name of class, without quotes. |
The idea here is to define a function that we can lookup by name with DynamicLoader::lookup(string). Since we don't want to know how C++ mangles namespace names, this C function must not be in a namespace. The class is in a namespace though, so we do our own crude name mangling in order to keep creator functions for separate namespaces distinct, by substituting underscores for "::".
Example: nidas::dynld::MyClass is derived from nidas::core::DOMable so that a pointer to DOMable can be returned by DOMObjectFactory::createObject("MyClass"):
namespace nidas { namespace dynld { class MyClass : public nidas::core::DOMable { public: MyClass() { ... } // no-arg ctor }; }}
Define an extern "C" creator function:
NIDAS_CREATOR_FUNCTION(MyClass)
This defines a C function called create_nidas_dynld_MyClass() which invokes the nidas::dynld::MyClass() no arg constructor.
To create a pointer to a new instance of nidas::dynld::MyClass from a name in a string, do:
DOMable* newobj = DOMObjectFactory::createObject("MyClass");
Then one can cast it to a pointer to MyClass:
nidas::dynld::MyClass* classobj = dynamic_cast<nidas::dynld::MyClass*>(newobj);
DOMObjectFactory::createObject does the name mangling by prepending "create_nidas_dynld_" to the string argument, converting all "::" to '_' in the class name string and then does a lookup:
nidas::core::DOMable* (*ctor)() = DynamicLoader::lookup("create_nidas_dynld_MyClass");
Then it executes the creator function to get a pointer to the object:
nidas::core::DOMable* obj = ctor();
#define NIDAS_CREATOR_FUNCTION_NS | ( | NS, | |
CLASSNAME ) |
Same as NIDAS_CREATOR_FUNCTION(CLASSNAME), but with a namespace argument, indicating a namespace under nidas::dynld.
NS | namespace of class. |
CLASSNAME | Name of class. |