Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 08:22:00

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2024 CERN for the benefit of the ACTS project
0004  *
0005  * Mozilla Public License Version 2.0
0006  */
0007 
0008 #pragma once
0009 
0010 // Project include(s).
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 // Detray include(s).
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 };  // class bfield
0056 
0057 /// @brief Helper function for `detector_buffer_visitor`
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 /// @brief Visitor for polymorphic detector buffer types
0084 ///
0085 /// This function takes a list of supported detector trait types and checks
0086 /// if the provided field is one of them. If it is, it will call the provided
0087 /// callable on a view of it and otherwise it will throw an exception.
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 // TODO: Docs
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, &copy]<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 }  // namespace traccc