vecmem 1.28.0
Loading...
Searching...
No Matches
data_traits.hpp
1/* VecMem project, part of the ACTS project (R&D line)
2 *
3 * (c) 2023 CERN for the benefit of the ACTS project
4 *
5 * Mozilla Public License Version 2.0
6 */
7#pragma once
8
9// VecMem include(s).
10#include "vecmem/utils/details/narrow_size.hpp"
11
12// Local include(s).
13#include "vecmem/containers/data/jagged_vector_data.hpp"
14#include "vecmem/edm/details/schema_traits.hpp"
15#include "vecmem/edm/details/view_traits.hpp"
16#include "vecmem/edm/schema.hpp"
17#include "vecmem/memory/memory_resource.hpp"
18#include "vecmem/utils/tuple.hpp"
19
20// System include(s).
21#include <tuple>
22#include <variant>
23
24namespace vecmem::edm::details {
25
28
29template <typename TYPE>
30struct data_type {
31 using type = std::monostate;
32}; // struct data_type
33
34template <typename TYPE>
37}; // struct data_type
38
40
43
44template <typename TYPE>
45struct data_alloc {
46 static typename data_type<TYPE>::type make(std::size_t, memory_resource&) {
47 return {};
48 }
49}; // struct data_alloc
50
51template <typename TYPE>
52struct data_alloc<type::jagged_vector<TYPE>> {
53 static typename data_type<type::jagged_vector<TYPE>>::type make(
54 std::size_t size, memory_resource& mr) {
55 using data_t = typename data_type<type::jagged_vector<TYPE>>::type;
56 return {vecmem::details::narrow_size<typename data_t::size_type>(size),
57 mr};
58 }
59}; // struct data_alloc
60
62
64template <typename... VARTYPES, std::size_t INDEX, std::size_t... Is>
65void data_view_assign(
67 const std::tuple<typename data_type<VARTYPES>::type...>& data,
68 std::index_sequence<INDEX, Is...>) {
69
70 // Make the assignments just for jagged vector variables.
71 if constexpr (type::details::is_jagged_vector<typename std::tuple_element<
72 INDEX, std::tuple<VARTYPES...>>::type>::value) {
73 get<INDEX>(view) = std::get<INDEX>(data);
74 }
75 // Terminate, or continue.
76 if constexpr (sizeof...(Is) > 0) {
77 data_view_assign<VARTYPES...>(view, data, std::index_sequence<Is...>{});
78 }
79}
80
81} // namespace vecmem::edm::details
An allocator class that wraps a memory resource.
Definition allocator.hpp:37
A data wrapper for jagged vectors.
Definition jagged_vector_data.hpp:30
Technical base type for data<schema<VARTYPES...>>
Definition data.hpp:25
Technical base type for view<schema<VARTYPES...>>
Definition view.hpp:29
Definition data_traits.hpp:45
Definition data_traits.hpp:30
Definition view_traits.hpp:33
Definition schema_traits.hpp:108
Default tuple type.
Definition tuple.hpp:24