10#include "vecmem/edm/details/host_traits.hpp"
11#include "vecmem/edm/details/schema_traits.hpp"
21template <
typename... VARTYPES,
template <
typename>
class INTERFACE>
23 memory_resource& resource)
24 : m_data{details::host_alloc<
VARTYPES>::make(resource)...},
25 m_resource{resource} {}
33 std::disjunction_v<type::details::is_vector<VARTYPES>...>,
34 "This function requires at least one (jagged) vector variable.");
37 return details::get_host_size<
VARTYPES...>(
38 m_data, std::index_sequence_for<
VARTYPES...>{});
47 std::disjunction_v<type::details::is_vector<VARTYPES>...>,
48 "This function requires at least one (jagged) vector variable.");
51 return details::get_host_capacity<
VARTYPES...>(
52 m_data, std::index_sequence_for<
VARTYPES...>{});
60 std::disjunction_v<type::details::is_vector<VARTYPES>...>,
61 "This function requires at least one (jagged) vector variable.");
64 details::host_resize<
VARTYPES...>(m_data, size,
65 std::index_sequence_for<
VARTYPES...>{});
73 std::disjunction_v<type::details::is_vector<VARTYPES>...>,
74 "This function requires at least one (jagged) vector variable.");
77 details::host_reserve<
VARTYPES...>(m_data, size,
78 std::index_sequence_for<
VARTYPES...>{});
87 std::disjunction_v<type::details::is_vector<VARTYPES>...>,
88 "This function requires at least one (jagged) vector variable.");
98template <std::
size_t INDEX>
104 if constexpr (type::details::is_scalar_v<
typename std::tuple_element<
106 return std::get<INDEX>(m_data)[0];
108 return std::get<INDEX>(m_data);
113template <std::
size_t INDEX>
120 if constexpr (type::details::is_scalar_v<
typename std::tuple_element<
122 return std::get<INDEX>(m_data)[0];
124 return std::get<INDEX>(m_data);
133 if (index >= size()) {
134 throw std::out_of_range(
"index (" + std::to_string(index) +
135 ") >= size (" + std::to_string(size()) +
")");
139 return this->operator[](index);
147 if (index >= size()) {
148 throw std::out_of_range(
"index (" + std::to_string(index) +
149 ") >= size (" + std::to_string(size()) +
")");
153 return this->operator[](index);
199 memory_resource&, std::index_sequence<>) {
204template <
typename... VARTYPES,
template <
typename>
class INTERFACE,
205 std::size_t I, std::size_t... Is>
209 std::index_sequence<I, Is...>) {
211 if constexpr (edm::type::details::is_jagged_vector_v<
212 typename std::tuple_element<
217 std::get<I>(data.variables()) =
224 typename std::tuple_element<
225 I, std::tuple<
VARTYPES...>>::type>::value) {
238template <
typename... VARTYPES,
template <
typename>
class INTERFACE>
241 memory_resource* resource) {
246 memory_resource&
mr = (resource !=
nullptr ? *resource : host.resource());
250 if constexpr (std::disjunction_v<
259 std::index_sequence_for<
VARTYPES...>{});
265template <
typename... VARTYPES,
template <
typename>
class INTERFACE>
269 memory_resource&, std::index_sequence<>) {
274template <
typename... VARTYPES,
template <
typename>
class INTERFACE,
275 std::size_t I, std::size_t... Is>
279 memory_resource&
mr, std::index_sequence<I, Is...>) {
282 typename std::tuple_element<
283 I, std::tuple<
VARTYPES...>>::type>::value) {
287 std::get<I>(data.variables()) =
294 typename std::tuple_element<
295 I, std::tuple<
VARTYPES...>>::type>::value) {
308template <
typename... VARTYPES,
template <
typename>
class INTERFACE>
309VECMEM_HOST edm::data<edm::details::add_const_t<edm::schema<VARTYPES...>>>
311 memory_resource* resource) {
316 memory_resource&
mr = (resource !=
nullptr ? *resource : host.resource());
320 if constexpr (std::disjunction_v<
329 std::index_sequence_for<
VARTYPES...>{});
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
Technical base type for data<schema<VARTYPES...>>
Definition data.hpp:25
interface_type< proxy< schema_type, details::proxy_domain::host, details::proxy_access::non_constant, details::proxy_type::standalone > > object_type
Type type of standalone proxy objects for the container.
Definition host.hpp:66
std::size_t size_type
Size type used for the container.
Definition host.hpp:46
Technical base type for host<schema<VARTYPES...>,INTERFACE>
Definition host.hpp:28
Technical base type for view<schema<VARTYPES...>>
Definition view.hpp:29
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
VECMEM_HOST void get_data_impl(edm::host< edm::schema< VARTYPES... >, INTERFACE > &, edm::data< edm::schema< VARTYPES... > > &, memory_resource &, std::index_sequence<>)
Helper function terminal node.
Definition host.ipp:197
VECMEM_HOST data::vector_view< T > get_data(array< T, N > &a)
Helper function creating a vecmem::data::vector_view object.
Definition array.ipp:217
Definition host_traits.hpp:58
Meta type describing the "schema" of an SoA container.
Definition schema.hpp:46
Definition schema_traits.hpp:108
Definition schema_traits.hpp:77
Definition schema_traits.hpp:90