12#if defined(__GNUC__) && !defined(__clang__)
13#pragma GCC diagnostic warning "-Wnull-dereference"
17#include "detray/core/concepts.hpp"
18#include "detray/definitions/detail/qualifiers.hpp"
19#include "detray/definitions/geometry.hpp"
20#include "detray/definitions/indexing.hpp"
36template <concepts::detector detector_t>
55 const surface_id type,
const typename detector_t::transform3_type &trf,
58 const std::uint64_t source = detail::invalid_value<std::uint64_t>())
60 m_volume_link{std::vector{volume_link}},
63 m_boundaries{std::vector{mask_boundaries}},
77 const surface_id type,
const typename detector_t::transform3_type &trf,
78 std::vector<navigation_link> volume_link,
79 const std::vector<boundary_coll_type> &mask_boundaries,
81 const std::uint64_t source = detail::invalid_value<std::uint64_t>())
83 m_volume_link{std::move(volume_link)},
86 m_boundaries{mask_boundaries},
92 -> std::tuple<surface_id &, std::vector<navigation_link> &,
dindex &,
93 std::uint64_t &, std::vector<boundary_coll_type> &,
94 typename detector_t::transform3_type &> {
95 return std::tie(m_type, m_volume_link, m_index, m_source, m_boundaries,
103 std::vector<navigation_link> m_volume_link;
108 std::uint64_t m_source;
110 std::vector<boundary_coll_type> m_boundaries;
112 typename detector_t::transform3_type m_transform;
119template <concepts::detector detector_t>
120class surface_factory_interface {
125 surface_factory_interface() =
default;
126 virtual ~surface_factory_interface() =
default;
157 typename detector_t::volume_type &volume,
158 typename detector_t::surface_lookup_container &surfaces,
159 typename detector_t::transform_container &transforms,
160 typename detector_t::mask_container &masks,
161 typename detector_t::geometry_context ctx = {}) ->
dindex_range = 0;
172 template <
typename container_t,
typename... Args>
174 container_t &cont,
const typename container_t::value_type value,
175 const dindex idx, Args &&...args)
const {
177 if (detail::is_invalid_value(idx)) {
178 cont.push_back(value, std::forward<Args>(args)...);
180 return static_cast<dindex>(cont.size() - 1u);
183 if (cont.size() < idx + 1) {
184 cont.resize(idx + 1, std::forward<Args>(args)...);
187 cont.at(idx, std::forward<Args>(args)...) = value;
197template <concepts::detector detector_t>
204 std::unique_ptr<surface_factory_interface<detector_t>> factory)
205 : m_factory(std::move(factory)) {
206 if (m_factory ==
nullptr || m_factory.get() ==
nullptr) {
207 throw std::runtime_error(
208 "Surface factory decorator constructed with invalid base "
215 const surface_factory_interface<detector_t> *
get_factory()
const {
216 return m_factory.get();
227 m_factory->push_back(std::move(data));
234 m_factory->push_back(std::move(data));
238 void clear()
override { m_factory->clear(); }
248 typename detector_t::surface_lookup_container &surfaces,
249 typename detector_t::transform_container &transforms,
250 typename detector_t::mask_container &masks,
251 typename detector_t::geometry_context ctx = {})
253 return (*m_factory)(volume, surfaces, transforms, masks, ctx);
261 return m_factory.get();
266 std::unique_ptr<surface_factory_interface<detector_t>> m_factory;
void clear() override
Clear all data in the factory.
Definition surface_factory_interface.hpp:238
surface_factory_interface< detector_t > * get_factory()
Definition surface_factory_interface.hpp:260
dindex size() const override
Overwrite interface functions using callbacks to the base factory.
Definition surface_factory_interface.hpp:223
void push_back(surface_data< detector_t > &&data) override
Add data to the factory.
Definition surface_factory_interface.hpp:226
const surface_factory_interface< detector_t > * get_factory() const
Definition surface_factory_interface.hpp:215
void push_back(std::vector< surface_data< detector_t > > &&data) override
Forward a batch of surface records to the wrapped factory.
Definition surface_factory_interface.hpp:233
auto operator()(typename detector_t::volume_type &volume, typename detector_t::surface_lookup_container &surfaces, typename detector_t::transform_container &transforms, typename detector_t::mask_container &masks, typename detector_t::geometry_context ctx={}) -> dindex_range override
Definition surface_factory_interface.hpp:247
factory_decorator(std::unique_ptr< surface_factory_interface< detector_t > > factory)
Wrap a concrete surface factory and forward interface calls to it.
Definition surface_factory_interface.hpp:203
Bind transform and mask data together for surface building.
Definition surface_factory_interface.hpp:37
surface_data(const surface_id type, const typename detector_t::transform3_type &trf, std::vector< navigation_link > volume_link, const std::vector< boundary_coll_type > &mask_boundaries, const dindex idx=dindex_invalid, const std::uint64_t source=detail::invalid_value< std::uint64_t >())
Parametrized constructor.
Definition surface_factory_interface.hpp:76
surface_data(const surface_id type, const typename detector_t::transform3_type &trf, navigation_link volume_link, const boundary_coll_type &mask_boundaries, const dindex idx=dindex_invalid, const std::uint64_t source=detail::invalid_value< std::uint64_t >())
Parametrized constructor - surface with only one mask.
Definition surface_factory_interface.hpp:54
typename detector_t::surface_type::navigation_link navigation_link
Navigation link stored for each mask attached to the surface.
Definition surface_factory_interface.hpp:42
std::vector< typename detector_t::scalar_type > boundary_coll_type
Boundary-value collection type for one mask.
Definition surface_factory_interface.hpp:40
auto get_data() -> std::tuple< surface_id &, std::vector< navigation_link > &, dindex &, std::uint64_t &, std::vector< boundary_coll_type > &, typename detector_t::transform3_type & >
Definition surface_factory_interface.hpp:91
dindex insert_in_container(container_t &cont, const typename container_t::value_type value, const dindex idx, Args &&...args) const
Insert a value in a container at a specific index.
Definition surface_factory_interface.hpp:173
virtual auto operator()(typename detector_t::volume_type &volume, typename detector_t::surface_lookup_container &surfaces, typename detector_t::transform_container &transforms, typename detector_t::mask_container &masks, typename detector_t::geometry_context ctx={}) -> dindex_range=0
Construct detector components from the data in the factory and add them the containers of a volume bu...
virtual void push_back(std::vector< surface_data< detector_t > > &&data)=0
typename detector_t::surface_type::navigation_link navigation_link
Navigation link type used by surfaces produced by the factory.
Definition surface_factory_interface.hpp:123
virtual void clear()=0
Clear all data in the factory.
virtual void push_back(surface_data< detector_t > &&data)=0
Add data to the factory.
virtual dindex size() const =0
Detray include(s).
Definition array_operators.hpp:18
detail::index_range< dindex > dindex_range
Index ranges and sequences.
Definition indexing.hpp:24
unsigned int dindex
Default index type.
Definition indexing.hpp:18
constexpr dindex dindex_invalid
Global invalid index definition.
Definition indexing.hpp:21
surface_id
surface type, resolved during navigation.
Definition geometry.hpp:41