Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
FilteringBFS.h
Go to the documentation of this file.
1
32#pragma once
33
34#include <ogdf/basic/Graph.h>
36#include <ogdf/basic/Queue.h>
37#include <ogdf/basic/SList.h>
38#include <ogdf/basic/basic.h>
41
42#include <functional>
43#include <initializer_list>
44#include <iosfwd>
45#include <iterator>
46
47namespace ogdf {
48
49class FilteringBFSIterator;
50
56// see also FilteringPCTreeDFS/BFS
60 std::function<bool(adjEntry)> m_visit;
61 std::function<bool(node)> m_descend;
62
63public:
64 template<typename T>
65 static bool return_true(T t) {
66 return true;
67 }
68
69 explicit FilteringBFS() = default;
70
73
74 template<typename Container>
75 explicit FilteringBFS(const Graph& G, Container& nodes,
76 const std::function<bool(adjEntry)>& visit = return_true<adjEntry>,
77 const std::function<bool(node)>& descend_from = return_true<node>)
78 : m_pending(), m_visited(G, false), m_visit(visit), m_descend(descend_from) {
79 for (node n : nodes) {
80 m_pending.append(n);
81 }
82 }
83
84 explicit FilteringBFS(const Graph& G, std::initializer_list<node> nodes,
85 const std::function<bool(adjEntry)>& visit = return_true<adjEntry>,
86 const std::function<bool(node)>& descend_from = return_true<node>)
87 : m_pending(nodes), m_visited(G, false), m_visit(visit), m_descend(descend_from) { }
88
89 bool operator==(const FilteringBFS& rhs) const {
90 return m_pending.getList() == rhs.m_pending.getList();
91 }
92
93 bool operator!=(const FilteringBFS& rhs) const {
94 return m_pending.getList() != rhs.m_pending.getList();
95 }
96
98
100
101 void next() {
102 OGDF_ASSERT(!m_pending.empty());
103 node n = m_pending.pop();
104 OGDF_ASSERT(!m_visited[n]);
105 m_visited[n] = true;
106 if (m_descend(n)) {
107 for (adjEntry adj : n->adjEntries) {
108 node twin = adj->twinNode();
109 if (!m_visited[twin] && m_visit(adj)) {
110 m_pending.append(twin);
111 }
112 }
113 }
114 while (!m_pending.empty() && m_visited[m_pending.top()]) {
115 m_pending.pop();
116 }
117 }
118
120 OGDF_ASSERT(!m_pending.empty());
121 return m_pending.top();
122 }
123
124 operator bool() const { return valid(); }
125
126 bool valid() const { return !m_pending.empty(); }
127
128 void append(node n) {
129 m_visited[n] = false;
130 m_pending.append(n);
131 }
132
133 bool hasVisited(node n) const { return m_visited[n]; }
134
135 bool willVisitTarget(adjEntry adj) const { return m_visit(adj); }
136
137 bool willDescendFrom(node n) const { return m_descend(n); }
138
139 void setVisitFilter(const std::function<bool(adjEntry)>& mVisit) { m_visit = mVisit; }
140
141 void setDescendFilter(const std::function<bool(node)>& mDescend) { m_descend = mDescend; }
142
143 int pendingCount() const { return m_pending.size(); }
144};
145
148
149public:
150 // iterator traits
151 using iterator_category = std::input_iterator_tag;
153 using difference_type = std::ptrdiff_t;
154 using pointer = node*;
155 using reference = node&;
156
157 explicit FilteringBFSIterator() : m_bfs(nullptr) { }
158
159 explicit FilteringBFSIterator(FilteringBFS* bfs) : m_bfs(bfs) { }
160
161 bool operator==(const FilteringBFSIterator& rhs) const {
162 if (m_bfs) {
163 if (rhs.m_bfs) {
164 return m_bfs == rhs.m_bfs;
165 } else {
166 return !m_bfs->valid();
167 }
168 } else {
169 if (rhs.m_bfs) {
170 return !rhs.m_bfs->valid();
171 } else {
172 return true;
173 }
174 }
175 }
176
177 bool operator!=(const FilteringBFSIterator& rhs) const { return !(*this == rhs); }
178
180 OGDF_ASSERT(m_bfs != nullptr);
181 return m_bfs->current();
182 }
183
185 OGDF_ASSERT(m_bfs != nullptr);
186 m_bfs->next();
187 return *this;
188 }
189};
190
192
194
195}
Includes declaration of graph class.
Decralation of GraphElement and GraphList classes.
Declaration of singly linked lists and iterators.
Declaration and implementation of list-based queues (classes QueuePure<E> and Queue<E>).
Basic declarations, included by all source files.
Class for adjacency list elements.
Definition Graph_d.h:143
An iterator-based BFS through a Graph.
bool valid() const
FilteringBFS(const Graph &G, std::initializer_list< node > nodes, const std::function< bool(adjEntry)> &visit=return_true< adjEntry >, const std::function< bool(node)> &descend_from=return_true< node >)
std::function< bool(node)> m_descend
FilteringBFSIterator begin()
void append(node n)
bool hasVisited(node n) const
NodeArray< bool > m_visited
bool willDescendFrom(node n) const
void setVisitFilter(const std::function< bool(adjEntry)> &mVisit)
int pendingCount() const
bool operator==(const FilteringBFS &rhs) const
FilteringBFS()=default
Queue< node > m_pending
bool willVisitTarget(adjEntry adj) const
FilteringBFSIterator end()
bool operator!=(const FilteringBFS &rhs) const
void setDescendFilter(const std::function< bool(node)> &mDescend)
std::function< bool(adjEntry)> m_visit
static bool return_true(T t)
FilteringBFSIterator & operator++()
std::input_iterator_tag iterator_category
std::ptrdiff_t difference_type
bool operator!=(const FilteringBFSIterator &rhs) const
bool operator==(const FilteringBFSIterator &rhs) const
FilteringBFSIterator(FilteringBFS *bfs)
Data type for general directed graphs (adjacency list representation).
Definition Graph_d.h:866
Class for the representation of nodes.
Definition Graph_d.h:241
internal::GraphObjectContainer< AdjElement > adjEntries
The container containing all entries in the adjacency list of this node.
Definition Graph_d.h:272
The parameterized class Queue<E> implements list-based queues.
Definition Queue.h:205
int size() const
Returns the number of elements in the queue.
Definition Queue.h:246
E pop()
Removes front element and returns it.
Definition Queue.h:336
bool empty() const
Returns true iff the queue is empty.
Definition Queue.h:243
const_reference top() const
Returns a reference to the front element.
Definition Queue.h:249
iterator append(const E &x)
Adds x at the end of queue.
Definition Queue.h:324
const SList< E > & getList() const
Conversion to const SList.
Definition Queue.h:314
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition Graph_d.h:659
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF dynamic library (shared object / DLL),...
Definition config.h:117
Utility macros for declaring copy and move constructors and assignment operations.
#define OGDF_DEFAULT_MOVE(cls)
Explicitly provides default move construction and assignment for class cls.
Definition copy_move.h:52
#define OGDF_DEFAULT_COPY(cls)
Explicitly provides default copy construction and assignment for class cls.
Definition copy_move.h:47
Decralation of graph iterators.
NodeElement * node
The type of nodes.
Definition Graph_d.h:71
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition basic.h:52
The namespace for all OGDF objects.
HypergraphRegistry< HypernodeElement >::iterator begin(const HypergraphRegistry< HypernodeElement > &self)
HypergraphRegistry< HypernodeElement >::iterator end(const HypergraphRegistry< HypernodeElement > &self)
Definition GML.h:111