Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

PCTreeIterators.h
Go to the documentation of this file.
1 
32 #pragma once
33 
36 
37 #include <deque>
38 #include <utility>
39 
40 namespace ogdf::pc_tree {
42  friend struct PCNodeChildrenIterable;
43  friend struct PCNodeNeighborsIterable;
44 
45  PCNode* m_node = nullptr;
46  PCNode* m_pred = nullptr;
47  PCNode* m_curr = nullptr;
48 
50  : m_node(node), m_pred(pred), m_curr(curr) { }
51 
52 public:
53  using iterator_category = std::forward_iterator_tag;
54  using value_type = PCNode;
55  using pointer = PCNode*;
56  using reference = PCNode&;
57  using difference_type = std::ptrdiff_t;
58 
59  PCNodeIterator() = default;
60 
61  PCNode& operator->() const { return *m_curr; }
62 
63  PCNode* operator*() const { return m_curr; }
64 
66  PCNodeIterator& operator++();
67 
69  PCNodeIterator operator++(int);
70 
71  bool operator==(const PCNodeIterator& rhs) const {
72  return m_node == rhs.m_node && m_pred == rhs.m_pred && m_curr == rhs.m_curr;
73  }
74 
75  bool operator!=(const PCNodeIterator& rhs) const { return !(rhs == *this); }
76 
77  PCNode* nodeOf() const { return m_node; }
78 
79  bool isParent();
80 };
81 
83  PCNode* const m_node;
84 
85  explicit PCNodeChildrenIterable(PCNode* node) : m_node(node) { }
86 
87  PCNodeIterator begin() const noexcept;
88 
89  PCNodeIterator end() const noexcept;
90 
91  unsigned long count() const;
92 };
93 
95  PCNode* const m_node;
96  PCNode* const m_first;
97 
98  explicit PCNodeNeighborsIterable(PCNode* node, PCNode* first = nullptr)
99  : m_node(node)
100  , m_first(first != nullptr
101  ? first
102  : (node->m_child1 != nullptr ? node->m_child1 : node->getParent())) {
103  if (this->m_first == nullptr) {
104  OGDF_ASSERT(this->m_node->getDegree() == 0);
105  } else {
106  OGDF_ASSERT(this->m_node->isParentOf(this->m_first)
107  || this->m_first->isParentOf(this->m_node));
108  }
109  }
110 
111  PCNodeIterator begin() const noexcept;
112 
113  PCNodeIterator end() const noexcept;
114 
115  unsigned long count() const;
116 };
117 
122 template<bool dfs, bool reverse = false>
124  using container_type =
125  typename std::conditional<dfs, std::vector<PCNode*>, std::deque<PCNode*>>::type;
126 
128  std::function<bool(PCNode*)> m_visit;
129  std::function<bool(PCNode*)> m_descend;
130 
131 public:
132  // iterator traits
133  using iterator_category = std::input_iterator_tag;
134  using value_type = PCNode*;
135  using difference_type = std::ptrdiff_t;
136  using pointer = PCNode**;
137  using reference = PCNode*&;
138 
139  static bool return_true([[maybe_unused]] PCNode* n) { return true; }
140 
141  explicit FilteringPCTreeWalk() = default;
142 
143  explicit FilteringPCTreeWalk([[maybe_unused]] const PCTree& T, PCNode* start,
144  std::function<bool(PCNode*)> visit = return_true,
145  std::function<bool(PCNode*)> descend_from = return_true)
146  : m_pending({start}), m_visit(std::move(visit)), m_descend(std::move(descend_from)) {
147  if (!m_pending.empty() && !m_visit(top())) {
148  next();
149  }
150  }
151 
152  bool operator==(const FilteringPCTreeWalk& rhs) const { return m_pending == rhs.m_pending; }
153 
154  bool operator!=(const FilteringPCTreeWalk& rhs) const { return m_pending != rhs.m_pending; }
155 
156  FilteringPCTreeWalk& begin() { return *this; }
157 
159 
160  PCNode* top() {
161  OGDF_ASSERT(!m_pending.empty());
162  if constexpr (dfs) {
163  return m_pending.back();
164  } else {
165  return m_pending.front();
166  }
167  }
168 
169  PCNode* operator*() { return top(); }
170 
173  next();
174  return *this;
175  }
176 
178  OGDF_DEPRECATED("Calling FilteringPCTreeWalk++ will copy the array of pending nodes")
179 
180  FilteringPCTreeWalk operator++(int) {
181  FilteringPCTreeWalk before = *this;
182  next();
183  return before;
184  }
185 
186  void next() {
187  do {
188  OGDF_ASSERT(!m_pending.empty());
189  PCNode* node = top();
190  if constexpr (dfs) {
191  m_pending.pop_back();
192  } else {
193  m_pending.pop_front();
194  }
195  if (m_descend(node)) {
196  std::copy(node->children().begin(), node->children().end(),
197  std::back_inserter(m_pending));
198  if constexpr (reverse) {
199  std::reverse(m_pending.end() - node->getChildCount(), m_pending.end());
200  }
201  }
202  } while (!m_pending.empty() && !m_visit(top()));
203  }
204 
205  explicit operator bool() const { return valid(); }
206 
207  bool valid() const { return !m_pending.empty(); }
208 
209  void append(PCNode* a) { m_pending.push(a); }
210 
211  int pendingCount() const { return m_pending.size(); }
212 };
213 
216 }
ogdf::pc_tree::FilteringPCTreeWalk::container_type
typename std::conditional< dfs, std::vector< PCNode * >, std::deque< PCNode * > >::type container_type
Definition: PCTreeIterators.h:125
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::pc_tree::PCNodeNeighborsIterable
Definition: PCTreeIterators.h:94
ogdf::pc_tree::FilteringPCTreeWalk::FilteringPCTreeWalk
FilteringPCTreeWalk([[maybe_unused]] const PCTree &T, PCNode *start, std::function< bool(PCNode *)> visit=return_true, std::function< bool(PCNode *)> descend_from=return_true)
Definition: PCTreeIterators.h:143
ogdf::pc_tree::FilteringPCTreeWalk::next
void next()
Definition: PCTreeIterators.h:186
ogdf::pc_tree::PCNodeIterator::operator*
PCNode * operator*() const
Definition: PCTreeIterators.h:63
ogdf::pc_tree::PCNode::isParentOf
bool isParentOf(const PCNode *other) const
Definition: PCNode.h:311
ogdf::pc_tree::PCNodeIterator::m_node
PCNode * m_node
Definition: PCTreeIterators.h:45
OGDF_DEPRECATED
#define OGDF_DEPRECATED(reason)
Mark a class / member / function as deprecated.
Definition: config.h:120
ogdf::begin
HypergraphRegistry< HypernodeElement >::iterator begin(const HypergraphRegistry< HypernodeElement > &self)
ogdf::pc_tree
Definition: NodePCRotation.h:37
ogdf::pc_tree::FilteringPCTreeWalk::difference_type
std::ptrdiff_t difference_type
Definition: PCTreeIterators.h:135
ogdf::pc_tree::FilteringPCTreeWalk::pendingCount
int pendingCount() const
Definition: PCTreeIterators.h:211
ogdf::pc_tree::PCTree
A PC-tree represents a set of cyclic orders of its leaves by labeling its inner nodes as either P- or...
Definition: PCTree.h:109
ogdf::pc_tree::PCNodeChildrenIterable
Definition: PCTreeIterators.h:82
ogdf::pc_tree::PCNodeIterator::m_curr
PCNode * m_curr
Definition: PCTreeIterators.h:47
ogdf::pc_tree::PCNodeIterator::iterator_category
std::forward_iterator_tag iterator_category
Definition: PCTreeIterators.h:53
ogdf::pc_tree::PCNodeChildrenIterable::PCNodeChildrenIterable
PCNodeChildrenIterable(PCNode *node)
Definition: PCTreeIterators.h:85
ogdf::pc_tree::FilteringPCTreeWalk::end
FilteringPCTreeWalk end() const
Definition: PCTreeIterators.h:158
ogdf::pc_tree::PCNodeIterator::operator->
PCNode & operator->() const
Definition: PCTreeIterators.h:61
ogdf::pc_tree::PCNodeNeighborsIterable::m_node
PCNode *const m_node
Definition: PCTreeIterators.h:95
ogdf::Direction::before
@ before
ogdf::pc_tree::PCNodeIterator::operator!=
bool operator!=(const PCNodeIterator &rhs) const
Definition: PCTreeIterators.h:75
ogdf::pc_tree::PCNodeIterator
Definition: PCTreeIterators.h:41
ogdf::pc_tree::PCNodeChildrenIterable::m_node
PCNode *const m_node
Definition: PCTreeIterators.h:83
ogdf::reverse
Reverse< T > reverse(T &container)
Provides iterators for container to make it easily iterable in reverse.
Definition: Reverse.h:74
ogdf::pc_tree::FilteringPCTreeWalk::iterator_category
std::input_iterator_tag iterator_category
Definition: PCTreeIterators.h:133
ogdf::pc_tree::FilteringPCTreeWalk
A DFS or BFS through a PCTree.
Definition: PCTreeIterators.h:123
ogdf::pc_tree::FilteringPCTreeWalk::begin
FilteringPCTreeWalk & begin()
Definition: PCTreeIterators.h:156
Minisat::Internal::copy
static void copy(const T &from, T &to)
Definition: Alg.h:61
ogdf::pc_tree::PCNodeIterator::operator==
bool operator==(const PCNodeIterator &rhs) const
Definition: PCTreeIterators.h:71
ogdf::pc_tree::FilteringPCTreeWalk::operator*
PCNode * operator*()
Definition: PCTreeIterators.h:169
ogdf::pc_tree::PCNodeNeighborsIterable::m_first
PCNode *const m_first
Definition: PCTreeIterators.h:96
ogdf::pc_tree::FilteringPCTreeWalk::return_true
static bool return_true([[maybe_unused]] PCNode *n)
Definition: PCTreeIterators.h:139
backward::Color::type
type
Definition: backward.hpp:1716
backward::details::move
const T & move(const T &v)
Definition: backward.hpp:243
ogdf::pc_tree::FilteringPCTreeWalk::top
PCNode * top()
Definition: PCTreeIterators.h:160
ogdf::pc_tree::FilteringPCTreeWalk::append
void append(PCNode *a)
Definition: PCTreeIterators.h:209
ogdf::pc_tree::FilteringPCTreeWalk::m_pending
container_type m_pending
Definition: PCTreeIterators.h:127
ogdf::pc_tree::FilteringPCTreeWalk::m_descend
std::function< bool(PCNode *)> m_descend
Definition: PCTreeIterators.h:129
ogdf::pc_tree::PCNode::getDegree
size_t getDegree() const
Definition: PCNode.h:454
ogdf::pc_tree::FilteringPCTreeWalk::valid
bool valid() const
Definition: PCTreeIterators.h:207
ogdf::pc_tree::PCNodeIterator::nodeOf
PCNode * nodeOf() const
Definition: PCTreeIterators.h:77
ogdf::pc_tree::FilteringPCTreeWalk::operator==
bool operator==(const FilteringPCTreeWalk &rhs) const
Definition: PCTreeIterators.h:152
ogdf::pc_tree::FilteringPCTreeWalk::m_visit
std::function< bool(PCNode *)> m_visit
Definition: PCTreeIterators.h:128
PCEnum.h
Predeclaration of various PC-tree related classes and enums.
ogdf::pc_tree::PCNode
A node in a PC-tree that is either a P-node, C-node or leaf.
Definition: PCNode.h:58
PCNode.h
A node in a PC-tree that is either a P-node, C-node or leaf.
ogdf::end
HypergraphRegistry< HypernodeElement >::iterator end(const HypergraphRegistry< HypernodeElement > &self)
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::pc_tree::PCNodeIterator::difference_type
std::ptrdiff_t difference_type
Definition: PCTreeIterators.h:57
ogdf::pc_tree::PCNodeNeighborsIterable::PCNodeNeighborsIterable
PCNodeNeighborsIterable(PCNode *node, PCNode *first=nullptr)
Definition: PCTreeIterators.h:98
ogdf::pc_tree::FilteringPCTreeWalk::operator!=
bool operator!=(const FilteringPCTreeWalk &rhs) const
Definition: PCTreeIterators.h:154
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::pc_tree::PCNodeIterator::PCNodeIterator
PCNodeIterator(PCNode *node, PCNode *pred, PCNode *curr)
Definition: PCTreeIterators.h:49
ogdf::pc_tree::PCNodeIterator::m_pred
PCNode * m_pred
Definition: PCTreeIterators.h:46
ogdf::pc_tree::FilteringPCTreeWalk::operator++
FilteringPCTreeWalk & operator++()
Increment operator (prefix, returns result).
Definition: PCTreeIterators.h:172