ChimeraTK-ApplicationCore 04.08.00
Loading...
Searching...
No Matches
AccessorVariant.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3#pragma once
4
5#include "ArrayAccessor.h"
6#include "ScalarAccessor.h"
7
8#include <ChimeraTK/VariantUserTypes.h>
9
10#include <variant>
11
12namespace ChimeraTK {
13
14 /********************************************************************************************************************/
15 // Helper to nest std::variant types.
16 /********************************************************************************************************************/
17
18 namespace detail {
19
20 template<typename... Variants>
21 struct NestedVariant;
22
23 template<typename V>
24 struct NestedVariant<V> {
25 using type = V;
26 };
27
28 template<typename... Ts, typename... Us, typename... Rest>
29 struct NestedVariant<std::variant<Ts...>, std::variant<Us...>, Rest...> {
30 using type = typename NestedVariant<std::variant<Ts..., Us...>, Rest...>::type;
31 };
32
33 } // namespace detail
34
35 /********************************************************************************************************************/
36 // Combined variant types that include all derived accessor types alongside the base accessor type.
37 //
38 // This avoids object slicing: when the variant stores (e.g.) a ScalarPollInput<UserType> instead of slicing
39 // it to ScalarAccessor<UserType>, std::visit dispatches to ScalarPollInput::read() (which calls readLatest())
40 // rather than the base ScalarAccessor::read(). The same applies to ArrayPollInput and the NoInitialValue
41 // variants.
42 //
43 // All types the factory functions might create must be included as alternatives in the variant.
44 /********************************************************************************************************************/
45
47 using ScalarAccessorVariant = typename detail::NestedVariant<UserTypeTemplateVariantNoVoid<ScalarAccessor>,
48 UserTypeTemplateVariantNoVoid<ScalarPollInput>, UserTypeTemplateVariantNoVoid<ScalarPushInput>,
49 UserTypeTemplateVariantNoVoid<ScalarOutput>, UserTypeTemplateVariantNoVoid<ScalarPushInputWB>,
50 UserTypeTemplateVariantNoVoid<ScalarOutputPushRB>, UserTypeTemplateVariantNoVoid<ScalarOutputReverseRecovery>,
51 UserTypeTemplateVariantNoVoid<ScalarPushInputNoInitialValue>,
52 UserTypeTemplateVariantNoVoid<ScalarPollInputNoInitialValue>>::type;
53
55 using ArrayAccessorVariant = typename detail::NestedVariant<UserTypeTemplateVariantNoVoid<ArrayAccessor>,
56 UserTypeTemplateVariantNoVoid<ArrayPollInput>, UserTypeTemplateVariantNoVoid<ArrayPushInput>,
57 UserTypeTemplateVariantNoVoid<ArrayOutput>, UserTypeTemplateVariantNoVoid<ArrayPushInputWB>,
58 UserTypeTemplateVariantNoVoid<ArrayOutputPushRB>, UserTypeTemplateVariantNoVoid<ArrayOutputReverseRecovery>,
59 UserTypeTemplateVariantNoVoid<ArrayPushInputNoInitialValue>,
60 UserTypeTemplateVariantNoVoid<ArrayPollInputNoInitialValue>>::type;
61
62 /********************************************************************************************************************/
63
64} // namespace ChimeraTK
InvalidityTracer application module.
typename detail::NestedVariant< UserTypeTemplateVariantNoVoid< ScalarAccessor >, UserTypeTemplateVariantNoVoid< ScalarPollInput >, UserTypeTemplateVariantNoVoid< ScalarPushInput >, UserTypeTemplateVariantNoVoid< ScalarOutput >, UserTypeTemplateVariantNoVoid< ScalarPushInputWB >, UserTypeTemplateVariantNoVoid< ScalarOutputPushRB >, UserTypeTemplateVariantNoVoid< ScalarOutputReverseRecovery >, UserTypeTemplateVariantNoVoid< ScalarPushInputNoInitialValue >, UserTypeTemplateVariantNoVoid< ScalarPollInputNoInitialValue > >::type ScalarAccessorVariant
All concrete scalar accessor types used by the Python bindings.
typename detail::NestedVariant< UserTypeTemplateVariantNoVoid< ArrayAccessor >, UserTypeTemplateVariantNoVoid< ArrayPollInput >, UserTypeTemplateVariantNoVoid< ArrayPushInput >, UserTypeTemplateVariantNoVoid< ArrayOutput >, UserTypeTemplateVariantNoVoid< ArrayPushInputWB >, UserTypeTemplateVariantNoVoid< ArrayOutputPushRB >, UserTypeTemplateVariantNoVoid< ArrayOutputReverseRecovery >, UserTypeTemplateVariantNoVoid< ArrayPushInputNoInitialValue >, UserTypeTemplateVariantNoVoid< ArrayPollInputNoInitialValue > >::type ArrayAccessorVariant
All concrete array accessor types used by the Python bindings.