vecmem 1.21.0
Loading...
Searching...
No Matches
proxy.ipp
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
9namespace vecmem {
10namespace edm {
11
12template <typename... VARTYPES, details::proxy_domain PDOMAIN,
13 details::proxy_access PACCESS, details::proxy_type PTYPE>
14template <details::proxy_type OPTYPE,
15 std::enable_if_t<OPTYPE == details::proxy_type::standalone, bool>>
16VECMEM_HOST_AND_DEVICE
18 : m_data() {}
19
20template <typename... VARTYPES, details::proxy_domain PDOMAIN,
21 details::proxy_access PACCESS, details::proxy_type PTYPE>
22template <typename PARENT>
23VECMEM_HOST_AND_DEVICE proxy<schema<VARTYPES...>, PDOMAIN, PACCESS,
24 PTYPE>::proxy(PARENT& parent,
25 typename PARENT::size_type index)
26 : m_data{details::proxy_data_creator<schema<VARTYPES...>, PDOMAIN, PACCESS,
27 PTYPE>::make(index, parent)} {
28
29 static_assert(PACCESS == details::proxy_access::non_constant,
30 "This constructor is meant for non-const proxies.");
31}
32
33template <typename... VARTYPES, details::proxy_domain PDOMAIN,
34 details::proxy_access PACCESS, details::proxy_type PTYPE>
35template <typename PARENT>
36VECMEM_HOST_AND_DEVICE proxy<schema<VARTYPES...>, PDOMAIN, PACCESS,
37 PTYPE>::proxy(const PARENT& parent,
38 typename PARENT::size_type index)
39 : m_data{details::proxy_data_creator<schema<VARTYPES...>, PDOMAIN, PACCESS,
40 PTYPE>::make(index, parent)} {
41
42 static_assert(PACCESS == details::proxy_access::constant,
43 "This constructor is meant for constant proxies.");
44}
45
46template <typename... VARTYPES, details::proxy_domain PDOMAIN,
47 details::proxy_access PACCESS, details::proxy_type PTYPE>
48template <typename... OVARTYPES, details::proxy_domain OPDOMAIN,
49 details::proxy_access OPACCESS, details::proxy_type OPTYPE>
50VECMEM_HOST_AND_DEVICE
53 : m_data(other.variables()) {}
54
55template <typename... VARTYPES, details::proxy_domain PDOMAIN,
56 details::proxy_access PACCESS, details::proxy_type PTYPE>
57VECMEM_HOST_AND_DEVICE
59 typename details::proxy_var_type<VARTYPES, proxy_domain, access_type,
60 proxy_type>::type... data)
61 : m_data(data...) {}
62
63template <typename... VARTYPES, details::proxy_domain PDOMAIN,
64 details::proxy_access PACCESS, details::proxy_type PTYPE>
65VECMEM_HOST_AND_DEVICE proxy<schema<VARTYPES...>, PDOMAIN, PACCESS, PTYPE>&
67 const proxy& other) {
68
69 if (this != &other) {
70 details::proxy_tuple_copy(m_data, other.m_data);
71 }
72 return *this;
73}
74
75template <typename... VARTYPES, details::proxy_domain PDOMAIN,
76 details::proxy_access PACCESS, details::proxy_type PTYPE>
77template <typename... OVARTYPES, details::proxy_domain OPDOMAIN,
78 details::proxy_access OPACCESS, details::proxy_type OPTYPE>
79VECMEM_HOST_AND_DEVICE proxy<schema<VARTYPES...>, PDOMAIN, PACCESS, PTYPE>&
82
83 m_data = other.variables();
84 return *this;
85}
86
87template <typename... VARTYPES, details::proxy_domain PDOMAIN,
88 details::proxy_access PACCESS, details::proxy_type PTYPE>
89template <std::size_t INDEX>
90VECMEM_HOST_AND_DEVICE
92 VARTYPES...>::return_type
94
95 return vecmem::get<INDEX>(m_data);
96}
97
98template <typename... VARTYPES, details::proxy_domain PDOMAIN,
99 details::proxy_access PACCESS, details::proxy_type PTYPE>
100template <std::size_t INDEX>
101VECMEM_HOST_AND_DEVICE
103 VARTYPES...>::const_return_type
105
106 return vecmem::get<INDEX>(m_data);
107}
108
109template <typename... VARTYPES, details::proxy_domain PDOMAIN,
110 details::proxy_access PACCESS, details::proxy_type PTYPE>
111VECMEM_HOST_AND_DEVICE auto
113 -> const tuple_type& {
114
115 return m_data;
116}
117
118template <typename... VARTYPES, details::proxy_domain PDOMAIN,
119 details::proxy_access PACCESS, details::proxy_type PTYPE>
120VECMEM_HOST_AND_DEVICE auto
122 -> tuple_type& {
123
124 return m_data;
125}
126
127} // namespace edm
128} // namespace vecmem
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
Technical base type for data<schema<VARTYPES...>>
Definition data.hpp:25
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
Proxy types for one element of a type pack.
Definition proxy_traits.hpp:301
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