diff --git a/include/MetaDataPropagatingRegisterDecorator.h b/include/MetaDataPropagatingRegisterDecorator.h index 8a56a57c9049a3a811248b9ba76eabd934c24926..4ab371e3510e8bca59369741951ff310d577ea32 100644 --- a/include/MetaDataPropagatingRegisterDecorator.h +++ b/include/MetaDataPropagatingRegisterDecorator.h @@ -30,6 +30,10 @@ namespace ChimeraTK { /** value of validity flag from last read operation */ DataValidity lastValidity{DataValidity::ok}; + + using TransferElement::_dataValidity; + using NDRegisterAccessorDecorator<T>::_target; + using NDRegisterAccessorDecorator<T>::buffer_2D; }; DECLARE_TEMPLATE_FOR_CHIMERATK_USER_TYPES(MetaDataPropagatingRegisterDecorator); diff --git a/src/MetaDataPropagatingRegisterDecorator.cc b/src/MetaDataPropagatingRegisterDecorator.cc index b79fbb68e5f1d5b7b28b4a47d5d94579b95f7929..e283826beecd013b6bb9059348458b925647ff65 100644 --- a/src/MetaDataPropagatingRegisterDecorator.cc +++ b/src/MetaDataPropagatingRegisterDecorator.cc @@ -13,26 +13,30 @@ namespace ChimeraTK { } // Check if the data validity flag changed. If yes, propagate this information to the owning module. - auto valid = ChimeraTK::NDRegisterAccessorDecorator<T>::dataValidity(); - if(valid != lastValidity) { - if(valid == DataValidity::faulty) + if(_dataValidity != lastValidity) { + if(_dataValidity == DataValidity::faulty) _owner->incrementDataFaultCounter(); else _owner->decrementDataFaultCounter(); - lastValidity = valid; + lastValidity = _dataValidity; } } template<typename T> void MetaDataPropagatingRegisterDecorator<T>::doPreWrite(TransferType type, VersionNumber versionNumber) { - if(TransferElement::_dataValidity == DataValidity::faulty) { // the application has manualy set the validity to faulty - ChimeraTK::NDRegisterAccessorDecorator<T>::setDataValidity(DataValidity::faulty); + // We cannot use NDRegisterAccessorDecorator<T> here because we need a different implementation of setting the target data validity. + // So we have a complete implemetation here. + if(_dataValidity == DataValidity::faulty) { // the application has manualy set the validity to faulty + _target->setDataValidity(DataValidity::faulty); } else { // automatic propagation of the owner validity - ChimeraTK::NDRegisterAccessorDecorator<T>::setDataValidity(_owner->getDataValidity()); + _target->setDataValidity(_owner->getDataValidity()); } - NDRegisterAccessorDecorator<T, T>::doPreWrite(type, versionNumber); + for(unsigned int i = 0; i < _target->getNumberOfChannels(); ++i) { + buffer_2D[i].swap(_target->accessChannel(i)); + } + _target->preWrite(type, versionNumber); } } // namespace ChimeraTK