vecmem 1.21.0
Loading...
Searching...
No Matches
proxy.hpp
1/* VecMem project, part of the ACTS project (R&D line)
2 *
3 * (c) 2024-2025 CERN for the benefit of the ACTS project
4 *
5 * Mozilla Public License Version 2.0
6 */
7#pragma once
8
9// Local include(s).
10#include "vecmem/edm/details/proxy_traits.hpp"
11#include "vecmem/edm/schema.hpp"
12#include "vecmem/utils/tuple.hpp"
13#include "vecmem/utils/types.hpp"
14
15namespace vecmem {
16namespace edm {
17
19template <typename T, details::proxy_domain PDOMAIN,
20 details::proxy_access PACCESS, details::proxy_type PTYPE>
21class proxy;
22
32template <typename... VARTYPES, details::proxy_domain PDOMAIN,
33 details::proxy_access PACCESS, details::proxy_type PTYPE>
35
36public:
40 static constexpr details::proxy_domain proxy_domain = PDOMAIN;
42 static constexpr details::proxy_access access_type = PACCESS;
44 static constexpr details::proxy_type proxy_type = PTYPE;
47 VARTYPES, proxy_domain, access_type, proxy_type>::type...>;
48
51
53 template <details::proxy_type OPTYPE = proxy_type,
54 std::enable_if_t<OPTYPE == details::proxy_type::standalone,
55 bool> = true>
56 VECMEM_HOST_AND_DEVICE proxy();
57
64 template <typename PARENT>
65 VECMEM_HOST_AND_DEVICE proxy(PARENT& parent,
66 typename PARENT::size_type index);
67
74 template <typename PARENT>
75 VECMEM_HOST_AND_DEVICE proxy(const PARENT& parent,
76 typename PARENT::size_type index);
77
79 proxy(const proxy&) = default;
80
83
92 template <typename... OVARTYPES, details::proxy_domain OPDOMAIN,
93 details::proxy_access OPACCESS, details::proxy_type OPTYPE>
94 VECMEM_HOST_AND_DEVICE proxy(
96
104 VECMEM_HOST_AND_DEVICE proxy(
105 typename details::proxy_var_type<VARTYPES, proxy_domain, access_type,
106 proxy_type>::type... data);
107
114 VECMEM_HOST_AND_DEVICE
116
128 template <typename... OVARTYPES, details::proxy_domain OPDOMAIN,
129 details::proxy_access OPACCESS, details::proxy_type OPTYPE>
130 VECMEM_HOST_AND_DEVICE proxy<schema<VARTYPES...>, PDOMAIN, PACCESS, PTYPE>&
131 operator=(
133
135
138
140 template <std::size_t INDEX>
141 VECMEM_HOST_AND_DEVICE
142 typename details::proxy_var_type_at<INDEX, PDOMAIN, PACCESS, PTYPE,
143 VARTYPES...>::return_type
144 get();
146 template <std::size_t INDEX>
147 VECMEM_HOST_AND_DEVICE
148 typename details::proxy_var_type_at<INDEX, PDOMAIN, PACCESS, PTYPE,
149 VARTYPES...>::const_return_type
150 get() const;
151
153
156
158 VECMEM_HOST_AND_DEVICE
159 tuple_type& variables();
161 VECMEM_HOST_AND_DEVICE
162 const tuple_type& variables() const;
163
165
166private:
168 tuple_type m_data;
169
170}; // class proxy
171
172} // namespace edm
173} // namespace vecmem
174
175// Include the implementation.
176#include "vecmem/edm/impl/proxy.ipp"
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
Technical base type for data<schema<VARTYPES...>>
Definition data.hpp:25
proxy(const proxy &)=default
Default copy constructor.
proxy(proxy &&) noexcept=default
Default move constructor.
Technical base type for proxy<schema<VARTYPES...>,PDOMAIN,PACCESS,PTYPE>
Definition proxy.hpp:21
Main namespace for the vecmem classes/functions.
Definition atomic_ref.hpp:16
VECMEM_HOST_AND_DEVICE constexpr const auto & get(const tuple< Ts... > &t) noexcept
Get a constant element out of a tuple.
Definition tuple.ipp:58
Technical base class for the proxy_var_type traits.
Definition proxy_traits.hpp:57
Meta type describing the "schema" of an SoA container.
Definition schema.hpp:46