File indexing completed on 2026-07-26 08:22:00
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010
0011 #include "traccc/geometry/detector.hpp"
0012 #include "traccc/geometry/detector_type_list.hpp"
0013 #include "traccc/geometry/host_detector.hpp"
0014 #include "traccc/geometry/move_only_any.hpp"
0015
0016
0017 #include <any>
0018
0019 namespace traccc {
0020
0021 class detector_buffer {
0022 public:
0023 template <typename detector_traits_t>
0024 void set(typename detector_traits_t::buffer&& obj)
0025 requires(is_detector_traits<detector_traits_t>)
0026 {
0027 m_obj.set<typename detector_traits_t::buffer>(std::move(obj));
0028 }
0029
0030 template <typename detector_traits_t>
0031 bool is() const
0032 requires(is_detector_traits<detector_traits_t>)
0033 {
0034 return (type() == typeid(typename detector_traits_t::buffer));
0035 }
0036
0037 const std::type_info& type() const { return m_obj.type(); }
0038
0039 template <typename detector_traits_t>
0040 const typename detector_traits_t::buffer& as() const
0041 requires(is_detector_traits<detector_traits_t>)
0042 {
0043 return m_obj.as<typename detector_traits_t::buffer>();
0044 }
0045
0046 template <typename detector_traits_t>
0047 typename detector_traits_t::view as_view() const
0048 requires(is_detector_traits<detector_traits_t>)
0049 {
0050 return detray::get_data(as<detector_traits_t>());
0051 }
0052
0053 private:
0054 move_only_any m_obj;
0055 };
0056
0057
0058 template <typename callable_t, typename detector_t, typename... detector_ts>
0059 auto detector_buffer_visitor_helper(const detector_buffer& detector_buffer,
0060 callable_t&& callable,
0061 std::tuple<detector_t, detector_ts...>*) {
0062 if (detector_buffer.is<detector_t>()) {
0063 return callable.template operator()<detector_t>(
0064 detector_buffer.as_view<detector_t>());
0065 } else {
0066 if constexpr (sizeof...(detector_ts) > 0) {
0067 return detector_buffer_visitor_helper(
0068 detector_buffer, std::forward<callable_t>(callable),
0069 static_cast<std::tuple<detector_ts...>*>(nullptr));
0070 } else {
0071 std::stringstream exception_message;
0072
0073 exception_message << "Invalid detector type ("
0074 << detector_buffer.type().name()
0075 << ") received, but this type is not supported"
0076 << std::endl;
0077
0078 throw std::invalid_argument(exception_message.str());
0079 }
0080 }
0081 }
0082
0083
0084
0085
0086
0087
0088 template <typename detector_buffer_list_t, typename callable_t>
0089 auto detector_buffer_visitor(const detector_buffer& detector_buffer,
0090 callable_t&& callable) {
0091 return detector_buffer_visitor_helper(
0092 detector_buffer, std::forward<callable_t>(callable),
0093 static_cast<detector_buffer_list_t*>(nullptr));
0094 }
0095
0096
0097 inline detector_buffer buffer_from_host_detector(const host_detector& det,
0098 vecmem::memory_resource& mr,
0099 vecmem::copy& copy) {
0100 return host_detector_visitor<traccc::detector_type_list>(
0101 det, [&mr, ©]<typename detector_traits_t>(
0102 const typename detector_traits_t::host& detector) {
0103 traccc::detector_buffer rv;
0104 rv.set<detector_traits_t>(detray::get_buffer(detector, mr, copy));
0105 return rv;
0106 });
0107 }
0108
0109 }