10#include "vecmem/edm/details/schema_traits.hpp"
11#include "vecmem/edm/details/view_traits.hpp"
12#include "vecmem/edm/schema.hpp"
13#include "vecmem/edm/view.hpp"
14#include "vecmem/memory/unique_ptr.hpp"
15#include "vecmem/utils/tuple.hpp"
16#include "vecmem/utils/types.hpp"
25namespace vecmem::edm::details {
30template <
typename TYPE>
33template <
typename TYPE>
36 template <
typename SIZE_TYPE = std::size_t,
37 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
39 const std::vector<SIZE_TYPE, SIZE_ALLOC>&) {
43 template <
typename SIZE_TYPE = std::size_t,
44 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
46 const std::vector<SIZE_TYPE, SIZE_ALLOC>&) {
50 template <
typename SIZE_TYPE = std::size_t,
51 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
53 const std::vector<SIZE_TYPE, SIZE_ALLOC>&,
unsigned int*,
61template <
typename TYPE>
64 template <
typename SIZE_TYPE = std::size_t,
65 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
67 const std::vector<SIZE_TYPE, SIZE_ALLOC>&
sizes) {
71 template <
typename SIZE_TYPE = std::size_t,
72 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
74 const std::vector<SIZE_TYPE, SIZE_ALLOC>&) {
78 template <
typename SIZE_TYPE = std::size_t,
79 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
81 const std::vector<SIZE_TYPE, SIZE_ALLOC>& capacity,
unsigned int* size,
92template <
typename TYPE>
95 template <
typename SIZE_TYPE = std::size_t,
96 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
98 const std::vector<SIZE_TYPE, SIZE_ALLOC>&
sizes) {
99 return std::accumulate(
sizes.begin(),
sizes.end(),
100 static_cast<std::size_t
>(0));
103 template <
typename SIZE_TYPE = std::size_t,
104 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
106 const std::vector<SIZE_TYPE, SIZE_ALLOC>&
sizes) {
110 template <
typename SIZE_TYPE = std::size_t,
111 typename SIZE_ALLOC = std::allocator<SIZE_TYPE>>
114 const std::vector<SIZE_TYPE, SIZE_ALLOC>&
capacities,
122 (host_layout !=
nullptr ? host_layout : layout);
138 layout, host_layout};
147VECMEM_HOST
auto make_buffer_views(
148 const std::vector<SIZE_TYPE, SIZE_ALLOC>&
sizes,
149 const std::tuple<
typename view_type<TYPES>::layout_ptr...>&
layouts,
150 const std::tuple<
typename view_type<TYPES>::layout_ptr...>&
host_layouts,
151 const std::tuple<
typename view_type<TYPES>::payload_ptr...>&
payloads,
152 std::index_sequence<INDICES...>) {
162VECMEM_HOST
auto make_buffer_views(
163 const std::vector<SIZE_TYPE, SIZE_ALLOC>&
capacities,
164 const std::tuple<
typename view_type<TYPES>::size_ptr...>&
sizes,
165 const std::tuple<
typename view_type<TYPES>::layout_ptr...>&
layouts,
166 const std::tuple<
typename view_type<TYPES>::layout_ptr...>&
host_layouts,
167 const std::tuple<
typename view_type<TYPES>::payload_ptr...>&
payloads,
168 const std::index_sequence<INDICES...>) {
171 constexpr auto is_jagged_vector =
172 std::make_tuple(type::details::is_jagged_vector<TYPES>::value...);
173 constexpr bool has_jagged_vector =
174 std::disjunction_v<type::details::is_jagged_vector<TYPES>...>;
182 ((has_jagged_vector && (!std::get<INDICES>(is_jagged_vector)))
190template <
typename... TYPES, std::size_t INDEX, std::size_t... INDICES>
191VECMEM_HOST
constexpr void* find_first_pointer(
192 const std::tuple<TYPES...>& pointers,
193 std::index_sequence<INDEX, INDICES...>) {
195 auto ptr = std::get<INDEX>(pointers);
196 if (ptr !=
nullptr) {
199 if constexpr (
sizeof...(INDICES) > 0) {
200 return find_first_pointer<TYPES...>(
201 pointers, std::index_sequence<INDICES...>());
209template <
typename... TYPES, std::size_t INDEX, std::size_t... INDICES>
210VECMEM_HOST
constexpr void* find_last_pointer(
211 const std::tuple<TYPES...>& pointers,
212 const std::array<std::size_t,
sizeof...(TYPES)>& sizes,
213 std::index_sequence<INDEX, INDICES...>) {
215 auto ptr = std::get<
sizeof...(TYPES) - 1 - INDEX>(pointers);
216 if (ptr !=
nullptr) {
217 return ptr + std::get<
sizeof...(TYPES) - 1 - INDEX>(sizes);
219 if constexpr (
sizeof...(INDICES) > 0) {
220 return find_last_pointer<TYPES...>(
221 pointers, sizes, std::index_sequence<INDICES...>());
229template <
typename... TYPES>
230VECMEM_HOST
constexpr typename view<schema<TYPES...>>::memory_view_type
232 const std::tuple<
typename view_type<TYPES>::layout_ptr...>& layouts,
233 const std::array<std::size_t,
sizeof...(TYPES)>& sizes) {
236 using result_type =
typename view<schema<TYPES...>>::memory_view_type;
239 auto ptr =
static_cast<typename result_type::pointer
>(
240 find_first_pointer(layouts, std::index_sequence_for<TYPES...>()));
242 auto end_ptr =
static_cast<typename result_type::pointer
>(
243 find_last_pointer(layouts, sizes, std::index_sequence_for<TYPES...>()));
246 return {
static_cast<typename result_type::size_type
>(end_ptr - ptr), ptr};
250template <
typename... TYPES>
251VECMEM_HOST
constexpr typename view<schema<TYPES...>>::memory_view_type
253 const std::tuple<
typename view_type<TYPES>::payload_ptr...>& payloads,
254 const std::array<std::size_t,
sizeof...(TYPES)>& sizes) {
257 using result_type =
typename view<schema<TYPES...>>::memory_view_type;
260 auto ptr =
static_cast<typename result_type::pointer
>(
261 find_first_pointer(payloads, std::index_sequence_for<TYPES...>()));
263 auto end_ptr =
static_cast<typename result_type::pointer
>(find_last_pointer(
264 payloads, sizes, std::index_sequence_for<TYPES...>()));
267 return {
static_cast<typename result_type::size_type
>(end_ptr - ptr), ptr};
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
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_AND_DEVICE constexpr tuple< std::decay_t< Ts >... > make_tuple(Ts &&... args)
Make a tuple with automatic type deduction.
Definition tuple.ipp:87
std::vector< T, vecmem::polymorphic_allocator< T > > vector
Alias type for vectors with our polymorphic allocator.
Definition vector.hpp:35
static VECMEM_HOST view_type< type::jagged_vector< TYPE > >::type make_view(const std::vector< SIZE_TYPE, SIZE_ALLOC > &capacities, unsigned int *sizes, typename view_type< type::jagged_vector< TYPE > >::layout_ptr layout, typename view_type< type::jagged_vector< TYPE > >::layout_ptr host_layout, typename view_type< type::jagged_vector< TYPE > >::payload_ptr ptr)
Construct a view for a jagged vector variable.
Definition buffer_traits.hpp:113
static VECMEM_HOST std::size_t layout_size(const std::vector< SIZE_TYPE, SIZE_ALLOC > &sizes)
The number of "layout meta-objects" to allocate for the payload.
Definition buffer_traits.hpp:105
static VECMEM_HOST std::size_t payload_size(const std::vector< SIZE_TYPE, SIZE_ALLOC > &sizes)
The number of TYPE elements to allocate for the payload.
Definition buffer_traits.hpp:97
static VECMEM_HOST view_type< type::scalar< TYPE > >::type make_view(const std::vector< SIZE_TYPE, SIZE_ALLOC > &, unsigned int *, typename view_type< type::scalar< TYPE > >::layout_ptr, typename view_type< type::scalar< TYPE > >::layout_ptr, typename view_type< type::scalar< TYPE > >::payload_ptr ptr)
Construct a view for a scalar variable.
Definition buffer_traits.hpp:52
static VECMEM_HOST std::size_t payload_size(const std::vector< SIZE_TYPE, SIZE_ALLOC > &)
The number of TYPE elements to allocate for the payload.
Definition buffer_traits.hpp:38
static VECMEM_HOST std::size_t layout_size(const std::vector< SIZE_TYPE, SIZE_ALLOC > &)
The number of "layout meta-objects" to allocate for the payload.
Definition buffer_traits.hpp:45
static VECMEM_HOST std::size_t layout_size(const std::vector< SIZE_TYPE, SIZE_ALLOC > &)
The number of "layout meta-objects" to allocate for the payload.
Definition buffer_traits.hpp:73
static VECMEM_HOST std::size_t payload_size(const std::vector< SIZE_TYPE, SIZE_ALLOC > &sizes)
The number of TYPE elements to allocate for the payload.
Definition buffer_traits.hpp:66
static VECMEM_HOST view_type< type::vector< TYPE > >::type make_view(const std::vector< SIZE_TYPE, SIZE_ALLOC > &capacity, unsigned int *size, typename view_type< type::vector< TYPE > >::layout_ptr, typename view_type< type::vector< TYPE > >::layout_ptr, typename view_type< type::vector< TYPE > >::payload_ptr ptr)
Construct a view for a vector variable.
Definition buffer_traits.hpp:80
Definition buffer_traits.hpp:31
Definition view_traits.hpp:33
2D jagged vector variable
Definition schema.hpp:33
Scalar variable, one for a whole container.
Definition schema.hpp:19
1D vector variable
Definition schema.hpp:26