Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Iterators.h
Go to the documentation of this file.
1 
31 #pragma once
32 
33 #include <functional>
34 #include <iosfwd>
35 #include <iterator>
36 #include <utility>
37 
38 namespace ogdf {
39 
41 template<typename IT>
42 class Range {
43  IT m_begin;
44  IT m_end;
45 
46 public:
47  Range() { }
48 
49  explicit Range(IT begin) : m_begin(begin) { }
50 
51  Range(IT begin, IT end) : m_begin(begin), m_end(end) { }
52 
53  IT begin() const { return m_begin; }
54 
55  IT end() const { return m_end; }
56 };
57 
59 template<typename IT1, typename IT2>
60 class ZipIterator {
61  IT1 m_iter1;
62  IT2 m_iter2;
63 
64 public:
65  // iterator traits
66  using iterator_category = std::input_iterator_tag;
67  using value_type = typename std::pair<typename IT1::value_type, typename IT2::value_type>;
68  using difference_type = std::ptrdiff_t;
69  using pointer = value_type*;
71 
72  explicit ZipIterator() { }
73 
74  explicit ZipIterator(const IT1& mIter1, const IT2& mIter2)
75  : m_iter1(mIter1), m_iter2(mIter2) { }
76 
77  bool operator==(const ZipIterator<IT1, IT2>& rhs) const {
78  return m_iter1 == rhs.m_iter1 && m_iter2 == rhs.m_iter2;
79  }
80 
81  bool operator!=(const ZipIterator<IT1, IT2>& rhs) const { return !(rhs == *this); }
82 
83  value_type operator*() { return std::make_pair(*m_iter1, *m_iter2); }
84 
85  bool checkOnlyOneEnded(const IT1& mEnd1, const IT2& mEnd2) {
86  bool e1 = m_iter1 == mEnd1;
87  bool e2 = m_iter2 == mEnd2;
88  return e1 ^ e2;
89  }
90 
93  ++m_iter1;
94  ++m_iter2;
95  return *this;
96  }
97 
101  ++m_iter1;
102  ++m_iter2;
103  return before;
104  }
105 };
106 
107 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::ZipIterator::iterator_category
std::input_iterator_tag iterator_category
Definition: Iterators.h:66
ogdf::ZipIterator::operator!=
bool operator!=(const ZipIterator< IT1, IT2 > &rhs) const
Definition: Iterators.h:81
ogdf::ZipIterator::pointer
value_type * pointer
Definition: Iterators.h:69
ogdf::Range::end
IT end() const
Definition: Iterators.h:55
ogdf::Range::Range
Range()
Definition: Iterators.h:47
ogdf::ZipIterator::operator++
ZipIterator< IT1, IT2 > operator++(int)
Increment operator (postfix, returns previous value).
Definition: Iterators.h:99
ogdf::ZipIterator::m_iter1
IT1 m_iter1
Definition: Iterators.h:61
ogdf::ZipIterator::ZipIterator
ZipIterator(const IT1 &mIter1, const IT2 &mIter2)
Definition: Iterators.h:74
ogdf::ZipIterator::difference_type
std::ptrdiff_t difference_type
Definition: Iterators.h:68
ogdf::Direction::before
@ before
ogdf::Range::m_begin
IT m_begin
Definition: Iterators.h:43
ogdf::Range::Range
Range(IT begin)
Definition: Iterators.h:49
ogdf::Range::Range
Range(IT begin, IT end)
Definition: Iterators.h:51
ogdf::ZipIterator::operator==
bool operator==(const ZipIterator< IT1, IT2 > &rhs) const
Definition: Iterators.h:77
ogdf::ZipIterator::ZipIterator
ZipIterator()
Definition: Iterators.h:72
ogdf::Range::m_end
IT m_end
Definition: Iterators.h:44
ogdf::Range
Simple before-C++20 version for std::ranges::ref_view.
Definition: Iterators.h:42
ogdf::ZipIterator::reference
value_type & reference
Definition: Iterators.h:70
ogdf::ZipIterator::operator*
value_type operator*()
Definition: Iterators.h:83
ogdf::Range::begin
IT begin() const
Definition: Iterators.h:53
ogdf::ZipIterator::value_type
typename std::pair< typename IT1::value_type, typename IT2::value_type > value_type
Definition: Iterators.h:67
ogdf::ZipIterator::m_iter2
IT2 m_iter2
Definition: Iterators.h:62
ogdf::ZipIterator::operator++
ZipIterator< IT1, IT2 > & operator++()
Increment operator (prefix, returns result).
Definition: Iterators.h:92
ogdf::ZipIterator
Simple before-C++20 version for std::ranges::zip_view.
Definition: Iterators.h:60
ogdf::ZipIterator::checkOnlyOneEnded
bool checkOnlyOneEnded(const IT1 &mEnd1, const IT2 &mEnd2)
Definition: Iterators.h:85