Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

FilteringBFS.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/Graph.h>
35 #include <ogdf/basic/Queue.h>
36 
37 namespace ogdf {
38 
39 class FilteringBFSIterator;
40 
46 // see also FilteringPCTreeDFS/BFS
50  std::function<bool(adjEntry)> m_visit;
51  std::function<bool(node)> m_descend;
52 
53 public:
54  template<typename T>
55  static bool return_true(T t) {
56  return true;
57  }
58 
59  explicit FilteringBFS() = default;
60 
63 
64  template<typename Container>
65  explicit FilteringBFS(const Graph& G, Container& nodes,
66  const std::function<bool(adjEntry)>& visit = return_true<adjEntry>,
67  const std::function<bool(node)>& descend_from = return_true<node>)
68  : m_pending(), m_visited(G, false), m_visit(visit), m_descend(descend_from) {
69  for (node n : nodes) {
70  m_pending.append(n);
71  }
72  }
73 
74  explicit FilteringBFS(const Graph& G, std::initializer_list<node> nodes,
75  const std::function<bool(adjEntry)>& visit = return_true<adjEntry>,
76  const std::function<bool(node)>& descend_from = return_true<node>)
77  : m_pending(nodes), m_visited(G, false), m_visit(visit), m_descend(descend_from) { }
78 
79  bool operator==(const FilteringBFS& rhs) const {
80  return m_pending.getList() == rhs.m_pending.getList();
81  }
82 
83  bool operator!=(const FilteringBFS& rhs) const {
84  return m_pending.getList() != rhs.m_pending.getList();
85  }
86 
88 
90 
91  void next() {
92  OGDF_ASSERT(!m_pending.empty());
93  node n = m_pending.pop();
94  OGDF_ASSERT(!m_visited[n]);
95  m_visited[n] = true;
96  if (m_descend(n)) {
97  for (adjEntry adj : n->adjEntries) {
98  node twin = adj->twinNode();
99  if (!m_visited[twin] && m_visit(adj)) {
100  m_pending.append(twin);
101  }
102  }
103  }
104  while (!m_pending.empty() && m_visited[m_pending.top()]) {
105  m_pending.pop();
106  }
107  }
108 
110  OGDF_ASSERT(!m_pending.empty());
111  return m_pending.top();
112  }
113 
114  operator bool() const { return valid(); }
115 
116  bool valid() const { return !m_pending.empty(); }
117 
118  void append(node n) {
119  m_visited[n] = false;
120  m_pending.append(n);
121  }
122 
123  bool hasVisited(node n) const { return m_visited[n]; }
124 
125  bool willVisitTarget(adjEntry adj) const { return m_visit(adj); }
126 
127  bool willDescendFrom(node n) const { return m_descend(n); }
128 
129  void setVisitFilter(const std::function<bool(adjEntry)>& mVisit) { m_visit = mVisit; }
130 
131  void setDescendFilter(const std::function<bool(node)>& mDescend) { m_descend = mDescend; }
132 
133  int pendingCount() const { return m_pending.size(); }
134 };
135 
138 
139 public:
140  // iterator traits
141  using iterator_category = std::input_iterator_tag;
142  using value_type = node;
143  using difference_type = std::ptrdiff_t;
144  using pointer = node*;
145  using reference = node&;
146 
147  explicit FilteringBFSIterator() : m_bfs(nullptr) { }
148 
149  explicit FilteringBFSIterator(FilteringBFS* bfs) : m_bfs(bfs) { }
150 
151  bool operator==(const FilteringBFSIterator& rhs) const {
152  if (m_bfs) {
153  if (rhs.m_bfs) {
154  return m_bfs == rhs.m_bfs;
155  } else {
156  return !m_bfs->valid();
157  }
158  } else {
159  if (rhs.m_bfs) {
160  return !rhs.m_bfs->valid();
161  } else {
162  return true;
163  }
164  }
165  }
166 
167  bool operator!=(const FilteringBFSIterator& rhs) const { return !(*this == rhs); }
168 
170  OGDF_ASSERT(m_bfs != nullptr);
171  return m_bfs->current();
172  }
173 
175  OGDF_ASSERT(m_bfs != nullptr);
176  m_bfs->next();
177  return *this;
178  }
179 };
180 
182 
184 
185 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::FilteringBFS::hasVisited
bool hasVisited(node n) const
Definition: FilteringBFS.h:123
ogdf::FilteringBFSIterator::operator++
FilteringBFSIterator & operator++()
Definition: FilteringBFS.h:174
ogdf::Queue::append
iterator append(const E &x)
Adds x at the end of queue.
Definition: Queue.h:319
ogdf::FilteringBFSIterator::operator*
node operator*()
Definition: FilteringBFS.h:169
Graph.h
Includes declaration of graph class.
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::FilteringBFSIterator::FilteringBFSIterator
FilteringBFSIterator(FilteringBFS *bfs)
Definition: FilteringBFS.h:149
ogdf::FilteringBFS
An iterator-based BFS through a Graph.
Definition: FilteringBFS.h:47
ogdf::begin
HypergraphRegistry< HypernodeElement >::iterator begin(const HypergraphRegistry< HypernodeElement > &self)
OGDF_DEFAULT_MOVE
#define OGDF_DEFAULT_MOVE(cls)
Explicitly provides default move construction and assignment for class cls.
Definition: copy_move.h:52
ogdf::FilteringBFS::willVisitTarget
bool willVisitTarget(adjEntry adj) const
Definition: FilteringBFS.h:125
ogdf::FilteringBFS::willDescendFrom
bool willDescendFrom(node n) const
Definition: FilteringBFS.h:127
ogdf::Queue::top
const_reference top() const
Returns a reference to the front element.
Definition: Queue.h:244
Queue.h
Declaration and implementation of list-based queues (classes QueuePure<E> and Queue<E>).
ogdf::FilteringBFS::operator!=
bool operator!=(const FilteringBFS &rhs) const
Definition: FilteringBFS.h:83
ogdf::FilteringBFSIterator::m_bfs
FilteringBFS * m_bfs
Definition: FilteringBFS.h:137
ogdf::AdjElement
Class for adjacency list elements.
Definition: Graph_d.h:135
ogdf::FilteringBFS::begin
FilteringBFSIterator begin()
Definition: FilteringBFS.h:181
ogdf::FilteringBFS::m_pending
Queue< node > m_pending
Definition: FilteringBFS.h:48
ogdf::FilteringBFS::end
FilteringBFSIterator end()
Definition: FilteringBFS.h:183
ogdf::FilteringBFS::m_descend
std::function< bool(node)> m_descend
Definition: FilteringBFS.h:51
ogdf::FilteringBFS::setVisitFilter
void setVisitFilter(const std::function< bool(adjEntry)> &mVisit)
Definition: FilteringBFS.h:129
ogdf::FilteringBFS::current
node current()
Definition: FilteringBFS.h:109
ogdf::FilteringBFS::FilteringBFS
FilteringBFS(const Graph &G, Container &nodes, const std::function< bool(adjEntry)> &visit=return_true< adjEntry >, const std::function< bool(node)> &descend_from=return_true< node >)
Definition: FilteringBFS.h:65
ogdf::FilteringBFS::append
void append(node n)
Definition: FilteringBFS.h:118
ogdf::FilteringBFS::operator==
bool operator==(const FilteringBFS &rhs) const
Definition: FilteringBFS.h:79
ogdf::Queue::pop
E pop()
Removes front element and returns it.
Definition: Queue.h:331
ogdf::FilteringBFSIterator::operator==
bool operator==(const FilteringBFSIterator &rhs) const
Definition: FilteringBFS.h:151
ogdf::Queue::size
int size() const
Returns the number of elements in the queue.
Definition: Queue.h:241
ogdf::FilteringBFSIterator
Definition: FilteringBFS.h:136
ogdf::FilteringBFS::FilteringBFS
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 >)
Definition: FilteringBFS.h:74
ogdf::node
NodeElement * node
The type of nodes.
Definition: Graph_d.h:63
ogdf::FilteringBFSIterator::iterator_category
std::input_iterator_tag iterator_category
Definition: FilteringBFS.h:141
ogdf::FilteringBFS::valid
bool valid() const
Definition: FilteringBFS.h:116
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::Queue
The parameterized class Queue<E> implements list-based queues.
Definition: Queue.h:200
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::FilteringBFS::next
void next()
Definition: FilteringBFS.h:91
ogdf::AdjElement::twinNode
node twinNode() const
Returns the associated node of the corresponding adjacency entry (shorthand for twin()->theNode()).
Definition: Graph_d.h:168
ogdf::Queue::empty
bool empty() const
Returns true iff the queue is empty.
Definition: Queue.h:238
ogdf::end
HypergraphRegistry< HypernodeElement >::iterator end(const HypergraphRegistry< HypernodeElement > &self)
ogdf::FilteringBFS::m_visited
NodeArray< bool > m_visited
Definition: FilteringBFS.h:49
ogdf::FilteringBFSIterator::FilteringBFSIterator
FilteringBFSIterator()
Definition: FilteringBFS.h:147
OGDF_EXPORT
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF DLL.
Definition: config.h:101
ogdf::FilteringBFS::return_true
static bool return_true(T t)
Definition: FilteringBFS.h:55
ogdf::FilteringBFS::setDescendFilter
void setDescendFilter(const std::function< bool(node)> &mDescend)
Definition: FilteringBFS.h:131
ogdf::FilteringBFSIterator::operator!=
bool operator!=(const FilteringBFSIterator &rhs) const
Definition: FilteringBFS.h:167
OGDF_DEFAULT_COPY
#define OGDF_DEFAULT_COPY(cls)
Explicitly provides default copy construction and assignment for class cls.
Definition: copy_move.h:47
ogdf::FilteringBFSIterator::difference_type
std::ptrdiff_t difference_type
Definition: FilteringBFS.h:143
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::FilteringBFS::pendingCount
int pendingCount() const
Definition: FilteringBFS.h:133
ogdf::Queue::getList
const SList< E > & getList() const
Conversion to const SList.
Definition: Queue.h:309
ogdf::FilteringBFS::m_visit
std::function< bool(adjEntry)> m_visit
Definition: FilteringBFS.h:50