File indexing completed on 2026-06-06 07:48:50
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/EventData/TrackProxy.hpp"
0012 #include "Acts/EventData/TrackStateProxy.hpp"
0013 #include "Acts/Utilities/HashedString.hpp"
0014
0015 #include <type_traits>
0016
0017 namespace Acts::detail {
0018
0019 template <typename T>
0020 concept MutableProxyType = requires(T t, HashedString key) {
0021 requires !T::ReadOnly;
0022
0023 {
0024 t.template component<int>(key)
0025 } -> std::same_as<std::conditional_t<T::ReadOnly, const int&, int&>>;
0026 };
0027
0028 template <typename T>
0029 concept ConstProxyType = requires(T t, HashedString key) {
0030 requires T::ReadOnly;
0031 { t.template component<int>(key) } -> std::same_as<const int&>;
0032 };
0033
0034 template <typename T>
0035 concept ProxyType = (MutableProxyType<T> || ConstProxyType<T>) &&
0036 requires(T t, HashedString key) {
0037 typename T::ConstProxyType;
0038
0039 requires ConstProxyType<typename T::ConstProxyType>;
0040
0041 { t.hasColumn(key) } -> std::same_as<bool>;
0042 };
0043
0044 template <typename T>
0045 concept TrackProxyLike =
0046 ProxyType<T> &&
0047 std::is_same_v<typename T::ConstProxyType, typename T::ConstProxyType>;
0048
0049 }
0050
0051 namespace Acts {
0052
0053
0054
0055
0056
0057 template <typename T, bool ReadOnly>
0058 struct ProxyAccessorBase {
0059
0060 HashedString key;
0061
0062
0063
0064 explicit constexpr ProxyAccessorBase(HashedString _key) : key{_key} {}
0065
0066
0067
0068 explicit constexpr ProxyAccessorBase(const std::string& _key)
0069 : key{hashStringDynamic(_key)} {}
0070
0071
0072
0073
0074
0075 template <detail::MutableProxyType proxy_t>
0076 T& operator()(proxy_t proxy) const
0077 requires(!ReadOnly)
0078 {
0079 static_assert(!proxy_t::ReadOnly,
0080 "Cannot get mutable ref for const track proxy");
0081 return proxy.template component<T>(key);
0082 }
0083
0084
0085
0086
0087
0088 template <detail::ProxyType proxy_t>
0089 const T& operator()(proxy_t proxy) const
0090 requires(ReadOnly)
0091 {
0092 if constexpr (proxy_t::ReadOnly) {
0093 return proxy.template component<T>(key);
0094
0095 } else {
0096 using const_proxy_t = typename proxy_t::ConstProxyType;
0097 const_proxy_t cproxy{proxy};
0098 return cproxy.template component<T>(key);
0099 }
0100 }
0101
0102
0103
0104
0105
0106 template <detail::ProxyType proxy_t>
0107 bool hasColumn(proxy_t proxy) const {
0108 return proxy.hasColumn(key);
0109 }
0110 };
0111
0112
0113
0114
0115 template <typename T>
0116 using ProxyAccessor = ProxyAccessorBase<T, false>;
0117
0118
0119
0120 template <typename T>
0121 using ConstProxyAccessor = ProxyAccessorBase<T, true>;
0122 }