Class ClassLoader
Defined in File class_loader.hpp
Class Documentation
-
class ClassLoader
This class allows loading and unloading of dynamically linked libraries which contain class definitions from which objects can be created/destroyed during runtime (i.e. class_loader). Libraries loaded by a ClassLoader are only accessible within scope of that ClassLoader object.
A base class for all class_loader exceptions that inherits from std::runtime_exception.
Public Types
-
template<typename Base>
using UniquePtr = std::unique_ptr<Base, DeleterType<Base>>
Public Functions
-
explicit ClassLoader(const std::string &library_path, bool ondemand_load_unload = false)
Constructor for ClassLoader.
- Parameters:
library_path – - The path of the runtime library to load
ondemand_load_unload – - Indicates if on-demand (lazy) unloading/loading of libraries occurs as plugins are created/destroyed.
-
virtual ~ClassLoader()
Destructor for ClassLoader. All libraries opened by this ClassLoader are unloaded automatically.
-
template<class Base>
inline std::vector<std::string> getAvailableClasses() const Indicates which classes (i.e. class_loader) that can be loaded by this object.
- Returns:
vector of strings indicating names of instantiable classes derived from <Base>
Generates an instance of loadable classes (i.e. class_loader).
It is not necessary for the user to call loadLibrary() as it will be invoked automatically if the library is not yet loaded (which typically happens when in “On Demand Load/Unload” mode).
See also
- Parameters:
derived_class_name – The name of the class we want to create (
- Returns:
A std::shared_ptr<Base> to newly created plugin object
-
template<class Base>
inline UniquePtr<Base> createUniqueInstance(const std::string &derived_class_name) Generates an instance of loadable classes (i.e. class_loader).
It is not necessary for the user to call loadLibrary() as it will be invoked automatically if the library is not yet loaded (which typically happens when in “On Demand Load/Unload” mode).
If you release the wrapped pointer you must manually call the original deleter when you want to destroy the released pointer.
See also
- Parameters:
derived_class_name – The name of the class we want to create (
- Returns:
A std::unique_ptr<Base> to newly created plugin object.
-
template<class Base>
inline Base *createUnmanagedInstance(const std::string &derived_class_name) Generates an instance of loadable classes (i.e. class_loader).
It is not necessary for the user to call loadLibrary() as it will be invoked automatically if the library is not yet loaded (which typically happens when in “On Demand Load/Unload” mode).
Creating an unmanaged instance disables dynamically unloading libraries when managed pointers go out of scope for all class loaders in this process.
See also
- Parameters:
derived_class_name – The name of the class we want to create (
- Returns:
An unmanaged (i.e. not a shared_ptr) Base* to newly created plugin object.
-
template<class Base>
inline bool isClassAvailable(const std::string &class_name) const Indicates if a plugin class is available.
- Parameters:
Base – - polymorphic type indicating base class
class_name – - the name of the plugin class
- Returns:
true if yes it is available, false otherwise
-
const std::string &getLibraryPath() const
Gets the full-qualified path and name of the library associated with this class loader.
- Returns:
the full-qualified path and name of the library
-
bool isLibraryLoaded() const
Indicates if a library is loaded within the scope of this ClassLoader.
Note that the library may already be loaded internally through another ClassLoader, but until loadLibrary() method is called, the ClassLoader cannot create objects from said library. If we want to see if the library has been opened by somebody else,
See also
- Parameters:
library_path – The path to the library to load
- Returns:
true if library is loaded within this ClassLoader object’s scope, otherwise false
-
bool isLibraryLoadedByAnyClassloader() const
Indicates if a library is loaded by some entity in the plugin system (another ClassLoader), but not necessarily loaded by this ClassLoader.
- Returns:
true if library is loaded within the scope of the plugin system, otherwise false
-
bool isOnDemandLoadUnloadEnabled() const
Indicates if the library is to be loaded/unloaded on demand…meaning that only to load a lib when the first plugin is created and automatically shut it down when last active plugin is destroyed.
- Returns:
true if ondemand load and unload is active, otherwise false
-
void loadLibrary()
Attempts to load a library on behalf of the ClassLoader. If the library is already opened, this method has no effect. If the library has been already opened by some other entity (i.e. another ClassLoader or global interface), this object is given permissions to access any plugin classes loaded by that other entity.
-
int unloadLibrary()
Attempts to unload a library loaded within scope of the ClassLoader. If the library is not opened, this method has no effect. If the library is opened by other another ClassLoader, the library will NOT be unloaded internally — however this ClassLoader will no longer be able to instantiate class_loader bound to that library. If there are plugin objects that exist in memory created by this classloader, a warning message will appear and the library will not be unloaded. If loadLibrary() was called multiple times (e.g. in the case of multiple threads or purposefully in a single thread), the user is responsible for calling unloadLibrary() the same number of times. The library will not be unloaded within the context of this classloader until the number of unload calls matches the number of loads.
- Returns:
The number of times more unloadLibrary() has to be called for it to be unbound from this ClassLoader
-
template<typename Base>