Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

graph_iterators.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/Reverse.h>
35 #include <ogdf/basic/basic.h>
36 
37 #include <functional>
38 
39 namespace ogdf {
40 
41 namespace internal {
42 
43 template<class GraphObjectPtr, bool isReverse, bool isConst>
45 template<class GraphObjectPtr>
47 template<class GraphObjectPtr>
49 
50 template<class GraphObjectPtr, bool isReverse, bool isConst>
51 class GraphIteratorBase {
52  friend class GraphIteratorBase<GraphObjectPtr, !isReverse, isConst>;
54 
55  GraphObjectPtr m_ptr;
56 
57 public:
58  using difference_type = std::ptrdiff_t;
60  using iterator_category = std::bidirectional_iterator_tag;
61  using pointer = value_type*;
63 
64  GraphIteratorBase() : m_ptr(nullptr) { }
65 
66  GraphIteratorBase(GraphObjectPtr ptr) : m_ptr(ptr) { }
67 
68  template<bool isArgReverse>
70  : m_ptr(it.m_ptr) { }
71 
72  bool operator==(const T& other) const { return m_ptr == other.m_ptr; }
73 
74  bool operator!=(const T& other) const { return m_ptr != other.m_ptr; }
75 
76  const GraphObjectPtr& operator*() const { return m_ptr; }
77 
80  OGDF_ASSERT(m_ptr != nullptr);
81  m_ptr = isReverse ? m_ptr->pred() : m_ptr->succ();
82  return *this;
83  }
84 
86  T operator++(int) {
87  OGDF_ASSERT(m_ptr != nullptr);
88  GraphObjectPtr ptr = m_ptr;
89  m_ptr = isReverse ? m_ptr->pred() : m_ptr->succ();
90  return ptr;
91  }
92 
95  OGDF_ASSERT(m_ptr != nullptr);
96  m_ptr = isReverse ? m_ptr->succ() : m_ptr->pred();
97  return *this;
98  }
99 
101  T operator--(int) {
102  OGDF_ASSERT(m_ptr != nullptr);
103  GraphObjectPtr ptr = m_ptr;
104  m_ptr = isReverse ? m_ptr->succ() : m_ptr->pred();
105  return ptr;
106  }
107 };
108 
109 template<class ArrayType, bool isConst>
111 template<class ArrayType>
113 template<class ArrayType>
115 
116 template<class ArrayType, bool isConst>
118  friend class GraphArrayIteratorBase<ArrayType, true>;
119 
120 public:
122  using key_type = typename ArrayType::key_type;
124  using value_type = typename std::conditional<isConst, const typename ArrayType::value_type,
125  typename ArrayType::value_type>::type;
128 
130  GraphArrayIteratorBase() : m_key(nullptr), m_array(nullptr) { }
131 
134 
138  : GraphArrayIteratorBase(iter.m_key, iter.m_array) { }
139 
141  // gcc9 complains since it cannot match the templated constructor above (-Werror=deprecated-copy).
143  : GraphArrayIteratorBase(iter.m_key, iter.m_array) { }
144 
148  m_key = iter.m_key;
149  m_array = iter.m_array;
150  return *this;
151  }
152 
154  key_type key() const { return m_key; }
155 
157  value_type& value() const { return (*m_array)[m_key]; }
158 
160  value_type& operator*() const { return (*m_array)[m_key]; }
161 
164  return m_key == iter.m_key && m_array == iter.m_array;
165  }
166 
169  return !operator==(iter);
170  }
171 
174  OGDF_ASSERT(m_key != nullptr);
175  m_key = ArrayType::findSuccKey(m_key);
176  return *this;
177  }
178 
182  m_key = ArrayType::findSuccKey(m_key);
183  return iter;
184  }
185 
188  OGDF_ASSERT(m_key != nullptr);
189  m_key = ArrayType::findPredKey(m_key);
190  return *this;
191  }
192 
196  m_key = ArrayType::findPredKey(m_key);
197  return iter;
198  }
199 
200 private:
203 };
204 
205 template<typename It>
206 class SimpleRange {
208  It m_end;
209 
210 public:
211  SimpleRange(It&& begin, It&& end) : m_begin(std::move(begin)), m_end(std::move(end)) { }
212 
213  SimpleRange(const It& begin, const It& end) : m_begin(begin), m_end(end) { }
214 
215  SimpleRange() = default;
216 
217  const It& begin() const { return m_begin; }
218 
219  const It& end() const { return m_end; }
220 
221  It& begin() { return m_begin; }
222 
223  It& end() { return m_end; }
224 };
225 
226 }
227 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::internal::GraphIteratorBase::operator--
T & operator--()
Decrement operator (prefix).
Definition: graph_iterators.h:94
ogdf::internal::GraphIteratorBase::iterator_category
std::bidirectional_iterator_tag iterator_category
Definition: graph_iterators.h:60
ogdf::internal::GraphArrayIteratorBase::operator++
GraphArrayIteratorBase< ArrayType, isConst > operator++(int)
Increment operator (postfix).
Definition: graph_iterators.h:180
ogdf::internal::GraphArrayIteratorBase::operator++
GraphArrayIteratorBase< ArrayType, isConst > & operator++()
Increment operator (prefix).
Definition: graph_iterators.h:173
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::internal::GraphIteratorBase
Definition: graph_iterators.h:44
ogdf::internal::GraphArrayIteratorBase::key
key_type key() const
Index in m_array.
Definition: graph_iterators.h:154
ogdf::internal::GraphArrayIteratorBase::operator*
value_type & operator*() const
Value of m_array at index m_key.
Definition: graph_iterators.h:160
ogdf::internal::SimpleRange::end
It & end()
Definition: graph_iterators.h:223
ogdf::internal::GraphIteratorBase::GraphIteratorBase
GraphIteratorBase(GraphIteratorBase< GraphObjectPtr, isArgReverse, isConst > &it)
Definition: graph_iterators.h:69
ogdf::internal::GraphIteratorBase::m_ptr
GraphObjectPtr m_ptr
Definition: graph_iterators.h:55
ogdf::internal::GraphIteratorBase::operator!=
bool operator!=(const T &other) const
Definition: graph_iterators.h:74
ogdf::internal::SimpleRange::SimpleRange
SimpleRange(const It &begin, const It &end)
Definition: graph_iterators.h:213
ogdf::internal::GraphArrayIteratorBase::GraphArrayIteratorBase
GraphArrayIteratorBase(const GraphArrayIteratorBase< ArrayType, isConst > &iter)
Copy constructor.
Definition: graph_iterators.h:142
ogdf::internal::GraphIteratorBase::reference
value_type & reference
Definition: graph_iterators.h:62
ogdf::internal::SimpleRange::begin
const It & begin() const
Definition: graph_iterators.h:217
ogdf::internal::GraphArrayIteratorBase::array_pointer_type
typename std::conditional< isConst, const ArrayType *, ArrayType * >::type array_pointer_type
Type of the array.
Definition: graph_iterators.h:127
ogdf::internal::GraphArrayIteratorBase
Definition: graph_iterators.h:110
ogdf::internal::GraphArrayIteratorBase::operator=
GraphArrayIteratorBase< ArrayType, isConst > & operator=(const GraphArrayIteratorBase< ArrayType, isConst > &iter)
Copy assignment operator.
Definition: graph_iterators.h:146
ogdf::internal::GraphArrayIteratorBase::m_key
key_type m_key
Index in m_array.
Definition: graph_iterators.h:201
ogdf::internal::SimpleRange::SimpleRange
SimpleRange()=default
ogdf::internal::GraphArrayIteratorBase::operator--
GraphArrayIteratorBase< ArrayType, isConst > operator--(int)
Decrement operator (postfix).
Definition: graph_iterators.h:194
ogdf::internal::GraphArrayIteratorBase::m_array
array_pointer_type m_array
The array.
Definition: graph_iterators.h:202
backward::Color::type
type
Definition: backward.hpp:1716
backward::details::move
const T & move(const T &v)
Definition: backward.hpp:243
ogdf::internal::GraphArrayIteratorBase::GraphArrayIteratorBase
GraphArrayIteratorBase(const GraphArrayIteratorBase< ArrayType, isArgConst > &iter)
Constructor.
Definition: graph_iterators.h:137
ogdf::internal::GraphIteratorBase::GraphIteratorBase
GraphIteratorBase()
Definition: graph_iterators.h:64
ogdf::internal::GraphIteratorBase::value_type
typename std::conditional< isConst, const GraphObjectPtr, GraphObjectPtr >::type value_type
Definition: graph_iterators.h:59
ogdf::internal::GraphArrayIteratorBase::GraphArrayIteratorBase
GraphArrayIteratorBase(key_type key, array_pointer_type a)
Constructor.
Definition: graph_iterators.h:133
ogdf::internal::GraphArrayIteratorBase::GraphArrayIteratorBase
GraphArrayIteratorBase()
Constructor.
Definition: graph_iterators.h:130
ogdf::internal::GraphArrayIteratorBase::operator--
GraphArrayIteratorBase< ArrayType, isConst > & operator--()
Decrement operator (prefix).
Definition: graph_iterators.h:187
ogdf::internal::SimpleRange::end
const It & end() const
Definition: graph_iterators.h:219
ogdf::internal::SimpleRange::SimpleRange
SimpleRange(It &&begin, It &&end)
Definition: graph_iterators.h:211
ogdf::internal::GraphArrayIteratorBase::operator!=
bool operator!=(const GraphArrayIteratorBase< ArrayType, isConst > &iter) const
Inequality operator.
Definition: graph_iterators.h:168
ogdf::internal::GraphArrayIteratorBase::value
value_type & value() const
Value of m_array at index m_key.
Definition: graph_iterators.h:157
ogdf::internal::GraphIteratorBase::operator++
T operator++(int)
Increment operator (postfix).
Definition: graph_iterators.h:86
ogdf::internal::SimpleRange::m_begin
It m_begin
Definition: graph_iterators.h:207
ogdf::internal::GraphIteratorBase::operator*
const GraphObjectPtr & operator*() const
Definition: graph_iterators.h:76
Reverse.h
Implementation of the Reverse class for the reverse iteration of containers.
ogdf::internal::GraphArrayIteratorBase::operator==
bool operator==(const GraphArrayIteratorBase< ArrayType, isConst > &iter) const
Equality operator.
Definition: graph_iterators.h:163
basic.h
Basic declarations, included by all source files.
std
Definition: GML.h:110
ogdf::internal::GraphArrayIteratorBase::value_type
typename std::conditional< isConst, const typename ArrayType::value_type, typename ArrayType::value_type >::type value_type
Value type of the associated array.
Definition: graph_iterators.h:125
ogdf::internal::GraphArrayIteratorBase::key_type
typename ArrayType::key_type key_type
Index type of the associated array.
Definition: graph_iterators.h:122
ogdf::internal::SimpleRange
Definition: graph_iterators.h:206
ogdf::internal::GraphIteratorBase::difference_type
std::ptrdiff_t difference_type
Definition: graph_iterators.h:58
ogdf::internal::GraphIteratorBase::GraphIteratorBase
GraphIteratorBase(GraphObjectPtr ptr)
Definition: graph_iterators.h:66
ogdf::internal::GraphIteratorBase::operator--
T operator--(int)
Decrement operator (postfix).
Definition: graph_iterators.h:101
ogdf::internal::SimpleRange::begin
It & begin()
Definition: graph_iterators.h:221
ogdf::internal::SimpleRange::m_end
It m_end
Definition: graph_iterators.h:208
ogdf::internal::GraphIteratorBase::operator==
bool operator==(const T &other) const
Definition: graph_iterators.h:72
ogdf::internal::GraphIteratorBase::pointer
value_type * pointer
Definition: graph_iterators.h:61
ogdf::internal::GraphIteratorBase::operator++
T & operator++()
Increment operator (prefix).
Definition: graph_iterators.h:79