Open Babel
3.0
|
#include <openbabel/babelconfig.h>
#include <openbabel/dlhandler.h>
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <sstream>
#include <cstring>
Go to the source code of this file.
Classes | |
struct | CharPtrLess |
class | OBPlugin |
Namespaces | |
OpenBabel | |
Macros | |
#define | MAKE_PLUGIN(BaseClass) |
#define | OB_STATIC_PLUGIN(className, instanceName) |
Functions | |
std::vector< std::string > | EnableStaticPlugins () |
Simplify 'plugin' classes to be discovered and/or loaded at runtime.
The code in this file makes it easy to make 'plugin' classes. These classes are derived from a base class, like OBFingerprint. The derived classes ('sub-types' like fingerprint2) usually have a single instance. Plugin classes are only discovered at runtime, so no existing code needs to be changed when adding a new derived class. In some builds the new code can be added or removed by just moving a DLL or so file. The plugin classes derived from any base class (including new ones) type can be listed from the commandline.
1) In the header file for YourBaseClass (which handles whatsits). Make sure to include the plugin.h header , derive the class from OBPlugin and in its definition add the MAKE_PLUGIN macro and a function TypeID() containing a simple descriptor of the type
See below for what the macro contains.
2) Declare each sub-type in a class derived from the base class and give it a constructor which calls OBPlugin constructor as shown:
Only the first line of the description is used when the subclasses are listed.
3) Declare a global instance of the sub-type class which specifies its ID. and, optionally, whether it is to be regarded as the default type of YourBaseClass.
4) The following functions are available:
YourBaseClass* YourBaseClass::FindType(const char* ID); This returns the default type when ID is NULL or empty.
To list the sub-types of any plugin class use the List which sends to cout by default (or any other ostream if specified).
The ListAsString and ListAsVector functions are alternatives, usable with scripting.
It is also possible to iterate through each sub-type by the following code:
Since this is not the most beautiful code, it is probably better to use the List methods if possible.
YourBaseClass* MakeNewInstance();
MAKE_PLUGIN(YourBaseClass) inserts the following code into YourBaseClass: