You need to sign in or sign up before continuing.
Newer
Older
Martin Christoph Hierholzer
committed
/*
* VirtualModule.h
*
* Created on: Apr 4, 2017
* Author: Martin Hierholzer
*/
#ifndef CHIMERATK_VIRTUAL_MODULE_H
#define CHIMERATK_VIRTUAL_MODULE_H
#include <list>
#include <boost/thread.hpp>
#include "Module.h"
Martin Christoph Hierholzer
committed
namespace ChimeraTK {
/** A virtual module generated by EntityOwner::findTag(). */
class VirtualModule : public Module {
public:
/** Constructor */
VirtualModule(const std::string& name, const std::string& description, ModuleType moduleType)
: Module(nullptr, name, description), _moduleType(moduleType) {
if(name.find_first_of("/") != std::string::npos) {
throw ChimeraTK::logic_error("Module names must not contain slashes: '" + name + "'.");
}
Martin Christoph Hierholzer
committed
/** Copy constructor */
VirtualModule(const VirtualModule& other);
Martin Christoph Hierholzer
committed
/** Assignment operator */
VirtualModule& operator=(const VirtualModule& other);
Martin Christoph Hierholzer
committed
/** Destructor */
virtual ~VirtualModule();
Martin Christoph Hierholzer
committed
VariableNetworkNode operator()(const std::string& variableName) const override;
Module& operator[](const std::string& moduleName) const override;
Martin Christoph Hierholzer
committed
void connectTo(const Module& target, VariableNetworkNode trigger = {}) const override;
/** Add an accessor. The accessor instance will be added to an internal list.
*/
void addAccessor(VariableNetworkNode accessor);
Martin Christoph Hierholzer
committed
/** Add a virtual sub-module. The module instance will be added to an internal
* list. */
void addSubModule(VirtualModule module);
Martin Christoph Hierholzer
committed
/** Return the submodule with the given name. If it doesn't exist, create it
* first. */
VirtualModule& createAndGetSubmodule(const RegisterPath& moduleName);
Martin Christoph Hierholzer
committed
/** Like createAndGetSubmodule(), but recursively create a hierarchy of
* submodules separated by "/" in the moduleName. */
VirtualModule& createAndGetSubmoduleRecursive(const RegisterPath& moduleName);
ModuleType getModuleType() const override { return _moduleType; }
const Module& virtualise() const override;
Martin Christoph Hierholzer
committed
protected:
std::list<VirtualModule> submodules;
ModuleType _moduleType;
};
Martin Christoph Hierholzer
committed
} /* namespace ChimeraTK */
#endif /* CHIMERATK_VIRTUAL_MODULE_H */