9#include <boost/algorithm/string/predicate.hpp>
10#include <boost/make_shared.hpp>
17 const LNMBackendRegisterInfo& info,
size_t pluginIndex,
const std::map<std::string, std::string>& parameters)
20 for(
const auto& [param, value] : parameters) {
21 if(boost::starts_with(param,
"target")) {
22 _targets.push_back(value);
25 throw ChimeraTK::logic_error(
"LogicalNameMappingBackend FanOutPlugin: Unknown parameter '" + param +
"'.");
45 template<
typename UserType>
56 [[nodiscard]]
bool isReadOnly()
const override {
return false; }
57 [[nodiscard]]
bool isReadable()
const override {
return false; }
63 std::vector<boost::shared_ptr<NDRegisterAccessor<UserType>>> _accs;
68 template<
typename UserType>
70 std::exception_ptr firstException{
nullptr};
72 for(
auto& acc : _accs) {
73 for(
size_t i = 0; i < acc->getNumberOfChannels(); ++i) {
76 acc->setDataValidity(this->_dataValidity);
78 acc->preWrite(type, versionNumber);
82 firstException = std::current_exception();
94 firstException = std::current_exception();
100 std::rethrow_exception(firstException);
106 template<
typename UserType>
110 for(
auto& acc : _accs) {
111 rv |= acc->writeTransfer(versionNumber);
121 template<
typename UserType>
125 for(
auto& acc : _accs) {
126 rv |= acc->writeTransferDestructively(versionNumber);
136 template<
typename UserType>
138 for(
auto& acc : _accs) {
139 acc->postWrite(type, versionNumber);
148 template<
typename UserType,
typename TargetType>
152 if(!target->isWriteable()) {
154 "'{}' is not writeable.",
160 std::format(
"LogicalNameMappingBackend FanOutPlugin: AccessMode::raw is not supported in register '{}'.",
165 std::vector<boost::shared_ptr<NDRegisterAccessor<TargetType>>> accs;
166 accs.reserve(_targets.size());
167 for(
const auto& name : _targets) {
168 accs.push_back(backend->getRegisterAccessor<TargetType>(name, 0, 0, {}));
169 if(accs.back()->getNumberOfChannels() != target->getNumberOfChannels() ||
170 accs.back()->getNumberOfSamples() != target->getNumberOfSamples()) {
171 throw ChimeraTK::logic_error(std::format(
"LogicalNameMappingBackend FanOutPlugin: Shape of target register "
172 "'{}' does not match the shape of the main target {}.",
173 name, target->getName()));
175 if(!accs.back()->isWriteable()) {
177 "'{}' is not writeable (main target: {}).",
178 name, target->getName()));
182 if constexpr(std::is_same<TargetType, UserType>::value) {
183 return boost::make_shared<FanOutPluginDecorator<UserType>>(target, std::move(accs));
void remove(AccessMode flag)
Remove the given flag from the set.
void setRawDataType(const DataType &d)
Set the raw data type.
LNMBackendRegisterInfo _info
RegisterInfo describing the the target register for which this plugin instance should work.
Base class for plugins that modify the behaviour of accessors in the logical name mapping backend.
FanOutPlugin(const LNMBackendRegisterInfo &info, size_t pluginIndex, const std::map< std::string, std::string > ¶meters)
void doRegisterInfoUpdate() override
Implementation of the plugin specific register information update.
boost::shared_ptr< NDRegisterAccessor< UserType > > decorateAccessor(boost::shared_ptr< LogicalNameMappingBackend > &backend, boost::shared_ptr< NDRegisterAccessor< TargetType > > &target, const UndecoratedParams &accessorParams)
RegisterInfo structure for the LogicalNameMappingBackend.
RegisterPath getRegisterName() const override
Return full path name of the register (including modules)
DataDescriptor _dataDescriptor
AccessModeFlags supportedFlags
Supported AccessMode flags.
bool readable
Flag if the register is readable.
bool writeable
Flag if the register is writeable.
Base class for decorators of the NDRegisterAccessor.
bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransfer().
bool doWriteTransferDestructively(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransferDestructively().
N-dimensional register accessor.
std::vector< UserType > & accessChannel(unsigned int channel)
Get or set register accessor's channel vector.
std::vector< std::vector< UserType > > buffer_2D
Buffer of converted data elements.
Class for generating and holding version numbers without exposing a numeric representation.
Exception thrown when a logic error has occured.
@ raw
Raw access: disable any possible conversion from the original hardware data type into the given UserT...
TransferType
Used to indicate the applicable operation on a Transferelement.
void doPreWrite(TransferType type, VersionNumber) override
Backend specific implementation of preWrite().
bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransfer().
void doPostWrite(TransferType type, VersionNumber versionNumber) override
Backend specific implementation of postWrite().
bool isReadable() const override
Check if transfer element is readable.
FanOutPluginDecorator(const boost::shared_ptr< ChimeraTK::NDRegisterAccessor< UserType > > &target, std::vector< boost::shared_ptr< NDRegisterAccessor< UserType > > > accs)
bool isReadOnly() const override
Check if transfer element is read only, i.e.
bool doWriteTransferDestructively(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransferDestructively().
Helper struct to hold extra parameters needed by some plugins, used in decorateAccessor()