File indexing completed on 2026-07-26 08:21:57
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010
0011 #include "traccc/definitions/qualifiers.hpp"
0012 #include "traccc/edm/details/container_element.hpp"
0013 #include "traccc/utils/pair.hpp"
0014
0015
0016 #include <vecmem/memory/memory_resource.hpp>
0017
0018
0019 #include <cassert>
0020 #include <stdexcept>
0021 #include <type_traits>
0022
0023 namespace traccc {
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 template <typename header_t, typename item_t,
0037 template <typename> class vector_t,
0038 template <typename> class jagged_vector_t,
0039 template <typename, typename> class pair_t = traccc::pair>
0040 class container_base {
0041 public:
0042
0043
0044
0045
0046 using header_type = header_t;
0047
0048
0049 using item_type = item_t;
0050
0051
0052 template <typename T>
0053 using vector_type = vector_t<T>;
0054
0055
0056 template <typename T>
0057 using jagged_vector_type = jagged_vector_t<T>;
0058
0059
0060 using header_vector = vector_type<header_type>;
0061
0062
0063 using item_vector = jagged_vector_type<item_type>;
0064
0065
0066
0067
0068
0069 using size_type = typename header_vector::size_type;
0070
0071
0072 using link_type = pair_t<typename header_vector::size_type,
0073 typename item_vector::size_type>;
0074
0075
0076
0077
0078
0079
0080
0081 using element_view = container_element<typename header_vector::reference,
0082 typename item_vector::reference>;
0083
0084
0085
0086
0087
0088 using const_element_view =
0089 container_element<typename header_vector::const_reference,
0090 typename item_vector::const_reference>;
0091
0092
0093
0094
0095
0096
0097 static_assert(
0098 std::is_convertible<typename header_vector::size_type,
0099 typename item_vector::size_type>::value,
0100 "Size type for container header and item vectors must be the same.");
0101
0102
0103 container_base(const container_base&) = default;
0104
0105 container_base(container_base&&) noexcept = default;
0106
0107
0108
0109
0110
0111
0112
0113
0114 TRACCC_HOST
0115 container_base(const header_vector& hv, const item_vector& iv)
0116 : m_headers(hv), m_items(iv) {
0117 if (m_headers.size() != m_items.size()) {
0118 throw std::logic_error("Header and item length not equal.");
0119 }
0120 }
0121
0122
0123
0124
0125
0126
0127
0128
0129 TRACCC_HOST
0130 container_base(header_vector&& hv, item_vector&& iv)
0131 : m_headers(hv), m_items(iv) {
0132 if (m_headers.size() != m_items.size()) {
0133 throw std::logic_error("Header and item length not equal.");
0134 }
0135 }
0136
0137
0138
0139
0140 template <typename header_vector_tp, typename item_vector_tp>
0141 requires(std::constructible_from<header_vector, const header_vector_tp&> &&
0142 std::constructible_from<item_vector, const item_vector_tp&>)
0143 TRACCC_HOST_DEVICE container_base(const header_vector_tp& hv,
0144 const item_vector_tp& iv)
0145 : m_headers(hv), m_items(iv) {
0146 assert(m_headers.size() == m_items.size());
0147 }
0148
0149
0150
0151
0152 template <typename size_type>
0153 TRACCC_HOST explicit container_base(size_type size,
0154 vecmem::memory_resource* mr)
0155 : m_headers(size, mr), m_items(size, mr) {}
0156
0157
0158
0159
0160
0161 TRACCC_HOST explicit container_base(vecmem::memory_resource* mr)
0162 : m_headers(mr), m_items(mr) {}
0163
0164
0165
0166
0167 container_base() = default;
0168
0169
0170 container_base& operator=(const container_base&) = default;
0171
0172 container_base& operator=(container_base&&) noexcept = default;
0173
0174
0175
0176
0177 TRACCC_HOST_DEVICE
0178 const header_vector& get_headers() const { return m_headers; }
0179
0180
0181
0182
0183
0184
0185
0186 TRACCC_HOST_DEVICE
0187 header_vector& get_headers() { return m_headers; }
0188
0189
0190
0191
0192 TRACCC_HOST_DEVICE
0193 const item_vector& get_items() const { return m_items; }
0194
0195
0196
0197
0198
0199
0200
0201 TRACCC_HOST_DEVICE
0202 item_vector& get_items() { return m_items; }
0203
0204 protected:
0205
0206 header_vector m_headers;
0207
0208
0209 item_vector m_items;
0210
0211 };
0212
0213 }