13namespace ChimeraTK::detail {
15 using SharedAccessorKey = std::pair<DeviceBackend*, RegisterPath>;
20 class SharedAccessors {
27 struct TargetSharedState {
31 using UserBuffer = NDRegisterAccessor<T>::Buffer;
33 detail::CountedRecursiveMutex mutex;
34 UserTypeTemplateVariant<UserBuffer> dataBuffer;
43 struct TransferSharedState {
54 template<
typename UserType>
55 std::shared_ptr<TargetSharedState> getTargetSharedState(SharedAccessorKey
const& key);
57 void combineTransferSharedStates(TransferElementID oldId, TransferElementID newId);
58 void addTransferElement(TransferElementID
id);
59 void removeTransferElement(TransferElementID
id);
60 size_t instanceCount(TransferElementID
id);
66 std::map<SharedAccessorKey, std::shared_ptr<TargetSharedState>> _targetSharedStates;
67 std::map<TransferElementID, TransferSharedState> _transferSharedStates;
72 template<
typename UserType>
73 std::shared_ptr<SharedAccessors::TargetSharedState> SharedAccessors::getTargetSharedState(
74 SharedAccessorKey
const& key) {
75 std::lock_guard<std::mutex> l(_mapMutex);
76 auto& tss = _targetSharedStates[key];
78 tss = std::make_shared<TargetSharedState>();
80 auto registerInfo = key.first->getRegisterCatalogue().getRegister(key.second);
81 tss->dataBuffer =
typename NDRegisterAccessor<UserType>::Buffer(
82 registerInfo.getNumberOfChannels(), registerInfo.getNumberOfElements());
86 auto _sharedBuffer = std::get_if<typename NDRegisterAccessor<UserType>::Buffer>(&(tss->dataBuffer));
87 if(_sharedBuffer ==
nullptr) {
88 auto print_variant_type = [](
auto&& value) {
89 using T = std::decay_t<
decltype(value)>;
90 return boost::core::demangle(
typeid(T).name());
93 throw ChimeraTK::logic_error(
"SubArrayAccessorDecorator for " + key.second +
": Requested TargetUserType '" +
94 boost::core::demangle(
typeid(UserType).name()) +
95 "' does not match already existing type. Variant type is '" +
96 std::visit(print_variant_type, tss->dataBuffer) +
"'");
Exception thrown when a logic error has occured.