LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
element_iterators.h
Go to the documentation of this file.
1 #ifndef LARCOREALG_GEOMETRY_DETAILS_ELEMENT_ITERATORS_H
2 #define LARCOREALG_GEOMETRY_DETAILS_ELEMENT_ITERATORS_H
3 
4 // LArSoft libraries
10 
11 // Framework libraries
12 #include "cetlib_except/exception.h"
13 
14 // C/C++ standard libraries
15 #include <iterator> // std::forward_iterator_tag
16 #include <string>
17 #include <utility>
18 
19 namespace geo::details {
20 
35  template <typename Owner, typename Element, typename GEOIDITER>
37  public:
38  using id_iterator_t = GEOIDITER;
39 
41  "template class for geometry_element_iterator must be a geometry iterator");
42 
44 
47  using LocalID_t = typename id_iterator_t::LocalID_t;
48  using GeoID_t = typename id_iterator_t::GeoID_t;
49  using ElementPtr_t = Element const*;
51 
54  using difference_type = std::ptrdiff_t;
55  using value_type = Element;
56  using reference = value_type const&;
57  using pointer = value_type const*;
58  using iterator_category = std::forward_iterator_tag;
60 
62  geometry_element_iterator() = default;
63 
65  geometry_element_iterator(Owner const* owner, id_iterator_t const& iter)
66  : geom{owner}, id_iter(iter)
67  {}
68 
76  {
77  ElementPtr_t ptr = get();
78  if (ptr) return *ptr;
79  throw cet::exception("geometry_iterator")
80  << "iterator attempted to obtain geometry element " << std::string(ID());
81  }
82 
84  pointer operator->() const { return get(); }
85 
88  {
89  ++id_iter;
90  return *this;
91  }
92 
95  {
96  iterator old(*this);
97  ++id_iter;
98  return old;
99  }
100 
102  operator bool() const { return validElement(geom, *id_iter); }
103 
105  ElementPtr_t get() const { return getElementPtr(geom, *id_iter); }
106 
108  LocalID_t const& ID() const { return *id_iter; }
109 
110  auto id_iterator() const { return id_iter; }
111 
112  private:
113  Owner const* geom;
115  }; // class geometry_element_iterator<>
116 
117  // Element here supports types like CryostatGeo, etc.
118  template <typename Owner, typename Element, typename IterationPolicy>
119  using element_iterator_for =
121 
122  template <typename Element>
124 
125  // Element iterator/sentinel comparisons
126  template <typename Owner, typename Element, typename GEOIDITER>
129  {
130  return a.id_iterator() == b.id_iterator();
131  }
132 
133  template <typename Owner, typename Element, typename GEOIDITER>
136  {
137  return !(a == b);
138  }
139 
140  template <typename Owner, typename Element, typename GEOIDITER>
143  {
144  return a.id_iterator() == b;
145  }
146 
147  template <typename Owner, typename Element, typename GEOIDITER>
150  {
151  return !(a == b);
152  }
153 
154  template <typename Owner, typename Element, typename GEOIDITER>
157  {
158  return a == b.id_iterator();
159  }
160 
161  template <typename Owner, typename Element, typename GEOIDITER>
164  {
165  return !(a == b);
166  }
167 
168 } // namespace geo::details
169 
170 #endif // LARCOREALG_GEOMETRY_DETAILS_ELEMENT_ITERATORS_H
std::forward_iterator_tag iterator_category
bool validElement(GeometryCore const *geom, CryostatID const &id)
CryostatGeo const * getElementPtr(GeometryCore const *geom, CryostatID const &id)
iterator & operator++()
Prefix increment: returns this iterator pointing to the next element.
LocalID_t const & ID() const
Returns the ID of the pointed geometry element.
iterator operator++(int)
Postfix increment: returns the current iterator, then increments it.
bool operator==(geometry_element_iterator< Owner, Element, GEOIDITER > const &a, geometry_element_iterator< Owner, Element, GEOIDITER > const &b)
reference operator*() const
Returns the geometry element the iterator points to.
Definition of data types for geometry description.
geometry_element_iterator()=default
Default constructor; effect not defined: assign to it before using!
bool operator!=(geometry_element_iterator< Owner, Element, GEOIDITER > const &a, geometry_element_iterator< Owner, Element, GEOIDITER > const &b)
Stream output for all geometry ID iterator types: prints the pointed ID.
Definition: id_iterators.h:243
typename id_iterator_t::GeoID_t GeoID_t
geometry_element_iterator(Owner const *owner, id_iterator_t const &iter)
Constructor: points to the same element as the specified ID iterator.
Forward iterator browsing all geometry elements in the detector.
pointer operator->() const
Returns a pointer to the element the iterator points to (or nullptr)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
typename id_iterator_t::LocalID_t LocalID_t