iterators.hpp
1 
2 #include <iterator>
3 #include <set>
4 #include <stack>
5 
6 namespace morphio {
7 namespace vasculature {
8 
9 template <typename SectionT, typename VasculatureT>
11 {
12  std::set<SectionT> visited;
13  std::stack<SectionT> container;
14 
15  public:
16  using iterator_category = std::input_iterator_tag;
17  using value_type = SectionT;
18  using difference_type = std::ptrdiff_t;
19  using pointer = SectionT*;
20  using reference = SectionT&;
21  graph_iterator_t() = default;
22  inline explicit graph_iterator_t(const SectionT& vasculatureSection);
23  inline explicit graph_iterator_t(const VasculatureT& vasculatureMorphology);
24 
25  inline bool operator==(const graph_iterator_t& other) const;
26  inline bool operator!=(const graph_iterator_t& other) const;
27  inline const SectionT& operator*() const;
28 
29  inline graph_iterator_t& operator++();
30  inline graph_iterator_t operator++(int);
31 };
32 
33 template <typename SectionT, typename VasculatureT>
35  const SectionT& vasculatureSection) {
36  container.push(vasculatureSection);
37 }
38 
39 template <typename SectionT, typename VasculatureT>
40 inline graph_iterator_t<SectionT, VasculatureT>::graph_iterator_t(
41  const VasculatureT& vasculatureMorphology) {
42  const auto& sections = vasculatureMorphology.sections();
43  for (std::size_t i = 0; i < sections.size(); ++i) {
44  if (sections[i].predecessors().empty()) {
45  container.push(sections[i]);
46  visited.insert(sections[i]);
47  }
48  }
49 }
50 
51 template <typename SectionT, typename VasculatureT>
52 inline bool graph_iterator_t<SectionT, VasculatureT>::operator==(
53  const graph_iterator_t& other) const {
54  return container == other.container;
55 }
56 
57 template <typename SectionT, typename VasculatureT>
58 inline bool graph_iterator_t<SectionT, VasculatureT>::operator!=(
59  const graph_iterator_t& other) const {
60  return !(*this == other);
61 }
62 
63 template <typename SectionT, typename VasculatureT>
64 inline const SectionT& graph_iterator_t<SectionT, VasculatureT>::operator*() const {
65  return container.top();
66 }
67 
68 template <typename SectionT, typename VasculatureT>
69 inline graph_iterator_t<SectionT, VasculatureT>&
70 graph_iterator_t<SectionT, VasculatureT>::operator++() {
71  const auto& section = *(*this);
72  container.pop();
73  const auto& neighbors = section.neighbors();
74  for (auto it = neighbors.rbegin(); it != neighbors.rend(); ++it)
75  if (visited.find(*it) == visited.end()) {
76  container.push(*it);
77  visited.insert(*it);
78  }
79  return *this;
80 }
81 
82 template <typename SectionT, typename VasculatureT>
83 inline graph_iterator_t<SectionT, VasculatureT>
84 graph_iterator_t<SectionT, VasculatureT>::operator++(int) {
85  graph_iterator_t retval = *this;
86  ++(*this);
87  return retval;
88 }
89 
90 } // namespace vasculature
91 } // namespace morphio
Definition: iterators.hpp:11
Definition: endoplasmic_reticulum.h:5