8#include <boost/make_shared.hpp>
9#include <boost/range/adaptors.hpp>
13 template<
typename BackendRegisterInfo>
14 class const_BackendRegisterCatalogueImplIterator;
16 template<
typename BackendRegisterInfo>
17 class BackendRegisterCatalogueImplIterator;
56 [[nodiscard]]
virtual std::unique_ptr<const_RegisterCatalogueImplIterator>
getConstIteratorEnd()
const = 0;
66 [[nodiscard]]
virtual std::unique_ptr<BackendRegisterCatalogueBase>
clone()
const = 0;
73 const std::vector<size_t>& qualifiedAsyncDomainId)
const;
81 const std::vector<size_t>& qualifiedAsyncDomainId)
const;
95 template<
typename BackendRegisterInfo>
114 [[nodiscard]] std::unique_ptr<BackendRegisterCatalogueBase>
clone()
const override;
172 auto filtered = _catalogue | boost::adaptors::filtered([](
auto const& kv) {
return kv.second.isHidden(); }) |
175 return HiddenRange(filtered.begin(), filtered.end());
196 std::map<RegisterPath, BackendRegisterInfo> _catalogue;
200 std::vector<BackendRegisterInfo*> _iteratedCatalogue;
225 template<
typename BackendRegisterInfo>
237 const std::unique_ptr<const_RegisterCatalogueImplIterator>& rightHandSide)
const override;
239 [[nodiscard]] std::unique_ptr<const_RegisterCatalogueImplIterator>
clone()
const override;
249 const BackendRegisterInfo&
operator*()
const;
251 const BackendRegisterInfo*
operator->()
const;
260 typename std::vector<BackendRegisterInfo*>::const_iterator
theIterator;
266 template<
typename BackendRegisterInfo>
302 template<
typename BackendRegisterInfo>
304 return RegisterInfo(std::make_unique<BackendRegisterInfo>(getBackendRegister(name)));
309 template<
typename BackendRegisterInfo>
313 return _catalogue.at(name);
315 catch(std::out_of_range&) {
316 throw ChimeraTK::logic_error(
"BackendRegisterCatalogue::getRegister(): Register '" + name +
"' does not exist.");
322 template<
typename BackendRegisterInfo>
324 return _catalogue.find(registerPathName) != _catalogue.end();
329 template<
typename BackendRegisterInfo>
331 return _iteratedCatalogue.size();
336 template<
typename BackendRegisterInfo>
338 BackendRegisterInfo>::getConstIteratorBegin()
const {
340 std::make_unique<const_BackendRegisterCatalogueImplIterator<BackendRegisterInfo>>(_iteratedCatalogue.cbegin());
346 template<
typename BackendRegisterInfo>
348 BackendRegisterInfo>::getConstIteratorEnd()
const {
350 std::make_unique<const_BackendRegisterCatalogueImplIterator<BackendRegisterInfo>>(_iteratedCatalogue.cend());
356 template<
typename BackendRegisterInfo>
365 std::unique_ptr<BackendRegisterCatalogueBase> c = std::make_unique<BackendRegisterCatalogue<BackendRegisterInfo>>();
376 template<
typename BackendRegisterInfo>
380 for(
auto& p : _catalogue) {
381 target->_catalogue[p.first] = getBackendRegister(p.first);
384 for(
auto& ptr : _iteratedCatalogue) {
385 target->_iteratedCatalogue.push_back(&target->_catalogue[ptr->getRegisterName()]);
391 template<
typename BackendRegisterInfo>
393 if(hasRegister(registerInfo.getRegisterName())) {
395 registerInfo.getRegisterName() +
" already exists!");
397 _catalogue[registerInfo.getRegisterName()] = registerInfo;
398 if(!registerInfo.isHidden()) {
399 _iteratedCatalogue.push_back(&_catalogue[registerInfo.getRegisterName()]);
405 template<
typename BackendRegisterInfo>
408 if(!hasRegister(name)) {
410 "BackendRegisterCatalogue::removeRegister(): Register '" + name +
"' does not exist.");
414 auto it = std::find_if(
415 _iteratedCatalogue.begin(), _iteratedCatalogue.end(), [&](
auto reg) { return reg->getRegisterName() == name; });
416 assert(it != _iteratedCatalogue.end());
417 _iteratedCatalogue.erase(it);
420 auto removed = _catalogue.erase(name);
421 assert(removed == 1);
426 template<
typename BackendRegisterInfo>
428 if(!hasRegister(registerInfo.getRegisterName())) {
430 registerInfo.getRegisterName() +
"' cannot be modified because it does not exist!");
432 _catalogue[registerInfo.getRegisterName()] = registerInfo;
440 template<
typename BackendRegisterInfo>
442 typename std::vector<BackendRegisterInfo*>::const_iterator it)
447 template<
typename BackendRegisterInfo>
454 template<
typename BackendRegisterInfo>
461 template<
typename BackendRegisterInfo>
468 template<
typename BackendRegisterInfo>
470 const std::unique_ptr<const_RegisterCatalogueImplIterator>& rightHandSide)
const {
472 return rhs_casted && rhs_casted->
theIterator == theIterator;
477 template<
typename BackendRegisterInfo>
479 BackendRegisterInfo>::clone()
const {
480 return {std::make_unique<const_BackendRegisterCatalogueImplIterator>(*
this)};
485 template<
typename BackendRegisterInfo>
487 BackendRegisterInfo>::operator++() {
494 template<
typename BackendRegisterInfo>
496 BackendRegisterInfo>::operator++(int) {
504 template<
typename BackendRegisterInfo>
506 BackendRegisterInfo>::operator--() {
513 template<
typename BackendRegisterInfo>
515 BackendRegisterInfo>::operator--(int) {
523 template<
typename BackendRegisterInfo>
525 return *(*theIterator);
530 template<
typename BackendRegisterInfo>
537 template<
typename BackendRegisterInfo>
545 template<
typename BackendRegisterInfo>
554 template<
typename BackendRegisterInfo>
556 typename std::vector<BackendRegisterInfo*>::iterator theIterator_)
557 : theIterator(theIterator_) {}
561 template<
typename BackendRegisterInfo>
563 BackendRegisterInfo>::operator++() {
570 template<
typename BackendRegisterInfo>
572 BackendRegisterInfo>::operator++(int) {
580 template<
typename BackendRegisterInfo>
582 BackendRegisterInfo>::operator--() {
589 template<
typename BackendRegisterInfo>
591 BackendRegisterInfo>::operator--(int) {
599 template<
typename BackendRegisterInfo>
601 return *(*theIterator);
606 template<
typename BackendRegisterInfo>
613 template<
typename BackendRegisterInfo>
616 boost::make_shared<const_BackendRegisterCatalogueImplIterator<BackendRegisterInfo>>(theIterator)};
621 template<
typename BackendRegisterInfo>
629 template<
typename BackendRegisterInfo>
Pure virtual implementation base class for the register catalogue.
virtual ~BackendRegisterCatalogueBase()=default
virtual std::shared_ptr< async::DataConsistencyRealm > getDataConsistencyRealm(const std::vector< size_t > &qualifiedAsyncDomainId) const
Return DataConsistencyRealm for the given qualified AsyncDomainId.
BackendRegisterCatalogueBase & operator=(const BackendRegisterCatalogueBase &other)=delete
BackendRegisterCatalogueBase(BackendRegisterCatalogueBase &&other)=default
BackendRegisterCatalogueBase(const BackendRegisterCatalogueBase &other)=delete
virtual std::unique_ptr< const_RegisterCatalogueImplIterator > getConstIteratorBegin() const =0
Return begin iterator for iterating through the registers in the catalogue.
virtual std::unique_ptr< BackendRegisterCatalogueBase > clone() const =0
Create deep copy of the catalogue.
virtual RegisterInfo getRegister(const RegisterPath ®isterPathName) const =0
Get register information for a given full path name.
virtual size_t getNumberOfRegisters() const =0
Get number of registers in the catalogue.
virtual HiddenRange hiddenRegisters() const =0
virtual bool hasRegister(const RegisterPath ®isterPathName) const =0
Check if register with the given path name exists.
virtual RegisterPath getDataConsistencyKeyRegisterPath(const std::vector< size_t > &qualifiedAsyncDomainId) const
Return RegisterPath for the register containing the DataConsistencyKey value for the given qualified ...
BackendRegisterCatalogueBase & operator=(BackendRegisterCatalogueBase &&other)=default
BackendRegisterCatalogueBase()=default
virtual std::unique_ptr< const_RegisterCatalogueImplIterator > getConstIteratorEnd() const =0
Return end iterator for iterating through the registers in the catalogue.
Interface for backends to the register catalogue.
std::unique_ptr< const_RegisterCatalogueImplIterator > getConstIteratorEnd() const override
Return end iterator for iterating through the registers in the catalogue.
void modifyRegister(const BackendRegisterInfo ®isterInfo)
Replaces the register information for the matching register.
void addRegister(const BackendRegisterInfo ®isterInfo)
Add register information to the catalogue.
void removeRegister(const RegisterPath &name)
Remove register as identified by the given name from the catalogue.
void fillFromThis(BackendRegisterCatalogue< BackendRegisterInfo > *target) const
Helper function for clone functions.
RegisterInfo getRegister(const RegisterPath ®isterPathName) const final
Note: Implementation internally uses getBackendRegister(), so no need to override.
size_t getNumberOfRegisters() const override
Get number of registers in the catalogue.
const_BackendRegisterCatalogueImplIterator< BackendRegisterInfo > cbegin() const
Return const begin iterators for iterating through the registers in the catalogue.
const_BackendRegisterCatalogueImplIterator< BackendRegisterInfo > end() const
Return const end iterators for iterating through the registers in the catalogue.
std::unique_ptr< BackendRegisterCatalogueBase > clone() const override
Create deep copy of the catalogue.
virtual BackendRegisterInfo getBackendRegister(const RegisterPath ®isterPathName) const
Note: Override this function if backend has "hidden" registers which are not added to the map and hen...
bool hasRegister(const RegisterPath ®isterPathName) const override
Check if register with the given path name exists.
const_BackendRegisterCatalogueImplIterator< BackendRegisterInfo > begin() const
Return const begin iterators for iterating through the registers in the catalogue.
const_BackendRegisterCatalogueImplIterator< BackendRegisterInfo > cend() const
Return const end iterators for iterating through the registers in the catalogue.
BackendRegisterCatalogueImplIterator< BackendRegisterInfo > end()
Return end iterator for iterating through the registers in the catalogue.
HiddenRange hiddenRegisters() const override
Returns non-owning range of all hidden registers in the catalogue.
std::unique_ptr< const_RegisterCatalogueImplIterator > getConstIteratorBegin() const override
Return begin iterator for iterating through the registers in the catalogue.
BackendRegisterCatalogueImplIterator< BackendRegisterInfo > begin()
Return begin iterator for iterating through the registers in the catalogue.
Non-const iterator for iterating through the registers in the catalogue, used by backend implementati...
BackendRegisterInfo & operator*() const
BackendRegisterCatalogueImplIterator & operator--()
BackendRegisterCatalogueImplIterator & operator++()
BackendRegisterInfo * operator->() const
std::vector< BackendRegisterInfo * >::iterator theIterator
bool operator==(const BackendRegisterCatalogueImplIterator &rightHandSide) const
bool operator!=(const BackendRegisterCatalogueImplIterator &rightHandSide) const
BackendRegisterCatalogueImplIterator()=default
DeviceBackend-independent register description.
Const iterator for iterating through the registers in the catalogue.
Class to store a register path name.
Implementation of the catalogue const iterator which is templated to the actual BackendRegisterInfo i...
const BackendRegisterInfo & operator*() const
bool isEqual(const std::unique_ptr< const_RegisterCatalogueImplIterator > &rightHandSide) const override
const_BackendRegisterCatalogueImplIterator & operator++()
const BackendRegisterInfo * operator->() const
const_BackendRegisterCatalogueImplIterator(typename std::vector< BackendRegisterInfo * >::const_iterator it)
std::unique_ptr< const_RegisterCatalogueImplIterator > clone() const override
Create copy of the iterator.
std::vector< BackendRegisterInfo * >::const_iterator theIterator
const_BackendRegisterCatalogueImplIterator & operator--()
bool operator==(const const_BackendRegisterCatalogueImplIterator &rightHandSide) const
bool operator!=(const const_BackendRegisterCatalogueImplIterator &rightHandSide) const
const BackendRegisterInfoBase * get() override
void increment() override
void decrement() override
Virtual base class for the catalogue const iterator.
Exception thrown when a logic error has occured.
boost::any_range< BackendRegisterInfoBase, boost::forward_traversal_tag, const BackendRegisterInfoBase &, std::ptrdiff_t > HiddenRange
Forward range with type-erasure, used to get a range of hidden registers.