13namespace ChimeraTK::detail {
15 using SharedAccessorKey = std::pair<DeviceBackend*, RegisterPath>;
20 class SharedAccessors {
22 static SharedAccessors& getInstance();
29 struct TargetSharedState {
33 using UserBuffer = NDRegisterAccessor<T>::Buffer;
35 detail::CountedRecursiveMutex mutex;
36 UserTypeTemplateVariant<UserBuffer> dataBuffer;
41 struct TransferSharedState {
52 template<
typename UserType>
53 std::shared_ptr<TargetSharedState> getTargetSharedState(SharedAccessorKey
const& key);
55 void combineTransferSharedStates(TransferElementID oldId, TransferElementID newId);
56 void addTransferElement(TransferElementID
id);
57 void removeTransferElement(TransferElementID
id);
58 size_t instanceCount(TransferElementID
id);
64 std::map<SharedAccessorKey, std::shared_ptr<TargetSharedState>> _targetSharedStates;
65 std::map<TransferElementID, TransferSharedState> _transferSharedStates;
68 SharedAccessors() =
default;
73 template<
typename UserType>
74 std::shared_ptr<SharedAccessors::TargetSharedState> SharedAccessors::getTargetSharedState(
75 SharedAccessorKey
const& key) {
76 std::lock_guard<std::mutex> l(_mapMutex);
77 auto& tss = _targetSharedStates[key];
79 tss = std::make_shared<TargetSharedState>();
81 auto registerInfo = key.first->getRegisterCatalogue().getRegister(key.second);
82 tss->dataBuffer =
typename NDRegisterAccessor<UserType>::Buffer(
83 registerInfo.getNumberOfChannels(), registerInfo.getNumberOfElements());
87 auto _sharedBuffer = std::get_if<typename NDRegisterAccessor<UserType>::Buffer>(&(tss->dataBuffer));
88 if(_sharedBuffer ==
nullptr) {
89 auto print_variant_type = [](
auto&& value) {
90 using T = std::decay_t<
decltype(value)>;
91 return boost::core::demangle(
typeid(T).name());
94 throw ChimeraTK::logic_error(
"SubArrayAccessorDecorator for " + key.second +
": Requested TargetUserType '" +
95 boost::core::demangle(
typeid(UserType).name()) +
96 "' does not match already existing type. Variant type is '" +
97 std::visit(print_variant_type, tss->dataBuffer) +
"'");
Exception thrown when a logic error has occured.