1 #ifndef LARCOREALG_GEOMETRY_ITERABLE_H 2 #define LARCOREALG_GEOMETRY_ITERABLE_H 11 #include "range/v3/view.hpp" 14 #include <type_traits> 22 template <
typename T,
typename =
void>
24 static_assert(std::is_base_of_v<CryostatID, T>);
30 static_assert(!std::is_base_of_v<CryostatID, T>);
31 using type =
typename T::ID_t;
34 template <
typename T,
typename Policy,
typename Transform,
typename =
void>
40 template <
typename T,
typename Policy,
typename Transform>
44 std::enable_if_t<!std::is_same_v<Transform, void_tag> and
45 !std::is_base_of_v<CryostatID, T>>> {
47 using type = decltype(std::declval<Transform>().
template transform<T>(
51 template <
typename Begin,
typename End>
52 using RangeType = decltype(ranges::make_subrange(std::declval<Begin>(), std::declval<End>()));
55 template <
typename IterationPolicy,
typename Transform =
void_tag>
64 explicit Iterable(IterationPolicy
const& policy) : fPolicy{policy} {}
66 Iterable(IterationPolicy
const& policy, Transform
const& transform)
67 : fPolicy{policy}, fTransform{transform}
75 using ID =
typename IDIteratorValueType<T>::type;
77 if constexpr (std::is_base_of<CryostatID, T>{}) {
return iterator; }
79 static_assert(!std::is_same_v<Transform, void_tag>);
80 return fTransform.template transform<T>(
iterator);
84 template <
typename T,
typename BaseID>
88 using ID =
typename IDIteratorValueType<T>::type;
89 static_assert(is_base_of_strict<BaseID, ID>);
91 if constexpr (std::is_base_of<CryostatID, T>{}) {
return iterator; }
93 static_assert(!std::is_same_v<Transform, void_tag>);
94 return fTransform.template transform<T>(
iterator);
102 using ID =
typename IDIteratorValueType<T>::type;
103 static_assert(std::is_base_of<CryostatID, ID>{});
104 return {fPolicy.template GetEndID<ID>()};
107 template <
typename T,
typename BaseID>
111 using ID =
typename IDIteratorValueType<T>::type;
112 static_assert(std::is_base_of<CryostatID, ID>{});
113 static_assert(is_base_of_strict<BaseID, ID>);
114 return {fPolicy.template GetEndID<ID>(id)};
117 template <
typename T>
120 template <
typename T>
123 return ranges::make_subrange(begin<T>(), end<T>());
126 template <
typename T,
typename ID>
129 return ranges::make_subrange(begin<T>(
id), end<T>(
id));
139 #endif // LARCOREALG_GEOMETRY_ITERABLE_H
Policy
Enumeration of all supported random seed policies.
typename details::IteratorFor< T, details::ReadoutIterationPolicy, details::ToReadoutGeometryElement >::type iterator_type
details::RangeType< iterator_type< T >, id_sentinel_for< T >> range_type
iterator_type< T > begin(BaseID const &id) const
iterator_type< T > begin() const
id_sentinel_for< T > end(BaseID const &id) const
auto iterator_for(LocalID const &id, SiblingPolicy const &siblingPolicy)
typename IDIteratorValueType< T >::type ID
Definition of data types for geometry description.
range_type< T > Iterate(ID const &id) const
id_sentinel_for< T > end() const
Iterable(IterationPolicy const &policy)
decltype(ranges::make_subrange(std::declval< Begin >(), std::declval< End >())) RangeType
std::conditional_t< std::is_same_v< Transform, void >, void_tag, Transform > fTransform
range_type< T > Iterate() const
typename IDIteratorValueType< T >::type ID
Iterable(IterationPolicy const &policy, Transform const &transform)
decltype(iterator_for(ID{}, std::declval< Policy >())) type