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_base.hpp"
0013
0014
0015 #include <vecmem/containers/device_vector.hpp>
0016 #include <vecmem/containers/jagged_device_vector.hpp>
0017
0018
0019 #include <cassert>
0020
0021 namespace traccc {
0022
0023
0024 template <typename header_t, typename item_t>
0025 class device_container
0026 : public container_base<header_t, item_t, vecmem::device_vector,
0027 vecmem::jagged_device_vector> {
0028 public:
0029
0030 using base_type = container_base<header_t, item_t, vecmem::device_vector,
0031 vecmem::jagged_device_vector>;
0032
0033
0034 using base_type::base_type;
0035
0036
0037
0038
0039
0040
0041 template <template <typename, typename> class view_t>
0042 TRACCC_HOST_DEVICE device_container(const view_t<header_t, item_t>& view)
0043 : base_type(view.headers, view.items) {}
0044
0045
0046
0047
0048 TRACCC_HOST_DEVICE
0049 typename base_type::element_view at(typename base_type::size_type i) {
0050 return {this->m_headers.at(i), this->m_items.at(i)};
0051 }
0052
0053
0054
0055
0056 TRACCC_HOST_DEVICE
0057 typename base_type::const_element_view at(
0058 typename base_type::size_type i) const {
0059 return {this->m_headers.at(i), this->m_items.at(i)};
0060 }
0061
0062
0063
0064
0065 TRACCC_HOST_DEVICE
0066 typename base_type::item_type& at(const typename base_type::link_type& link) {
0067 return this->m_items.at(link.first).at(link.second);
0068 }
0069
0070
0071
0072
0073 TRACCC_HOST_DEVICE
0074 const typename base_type::item_type& at(
0075 const typename base_type::link_type& link) const {
0076 return this->m_items.at(link.first).at(link.second);
0077 }
0078
0079
0080
0081
0082 TRACCC_HOST_DEVICE
0083 typename base_type::element_view operator[](typename base_type::size_type i) {
0084 return {this->m_headers[i], this->m_items[i]};
0085 }
0086
0087
0088
0089
0090 TRACCC_HOST_DEVICE
0091 typename base_type::const_element_view operator[](
0092 typename base_type::size_type i) const {
0093 return {this->m_headers[i], this->m_items[i]};
0094 }
0095
0096
0097
0098
0099 TRACCC_HOST_DEVICE
0100 typename base_type::item_type& operator[](
0101 const typename base_type::link_type& link) {
0102 return this->m_items[link.first][link.second];
0103 }
0104
0105
0106
0107
0108 TRACCC_HOST_DEVICE
0109 const typename base_type::item_type& operator[](
0110 const typename base_type::link_type& link) const {
0111 return this->m_items[link.first][link.second];
0112 }
0113
0114
0115
0116
0117
0118
0119
0120 TRACCC_HOST_DEVICE
0121 typename base_type::size_type size(void) const {
0122 assert(this->m_headers.size() == this->m_items.size());
0123 return this->m_headers.size();
0124 }
0125
0126
0127
0128
0129 TRACCC_HOST_DEVICE
0130 typename base_type::size_type total_size() const {
0131 typename base_type::size_type ret = 0;
0132 for (const typename base_type::item_vector::value_type& item :
0133 this->m_items) {
0134 ret += item.size();
0135 }
0136 return ret;
0137 }
0138
0139 };
0140
0141 }