Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

IOPoints.h
Go to the documentation of this file.
1 
33 #pragma once
34 
35 #include <ogdf/planarity/PlanRep.h>
36 
37 namespace ogdf {
38 
39 
41 struct InOutPoint {
42  int m_dx, m_dy;
44 
46  m_dx = m_dy = 0;
47  m_adj = nullptr;
48  }
49 
50  explicit InOutPoint(adjEntry adj) {
51  m_adj = adj;
52  m_dx = m_dy = 0;
53  }
54 };
55 
57 class IOPoints {
58 public:
59  IOPoints() { }
60 
61  explicit IOPoints(const Graph& G)
62  : m_depth(G, 0), m_height(G, 0), m_in(G), m_out(G), m_mark(G, false), m_pointOf(G, nullptr) { }
63 
64  ~IOPoints() { }
65 
66  // length of in- or outpoint list
67  int out(node v) const { return m_out[v].size(); }
68 
69  int in(node v) const { return m_in[v].size(); }
70 
71  // getting a const-reference to in- or outpoint list
72  const List<InOutPoint>& inpoints(node v) const { return m_in[v]; }
73 
74  List<InOutPoint>& inpoints(node v) { return m_in[v]; }
75 
76  const List<InOutPoint>& outpoints(node v) const { return m_out[v]; }
77 
78  List<InOutPoint>& outpoints(node v) { return m_out[v]; }
79 
80  // getting the in-/outpoint belonging to an adjacency entry
81  const InOutPoint* pointOf(adjEntry adj) const { return m_pointOf[adj]; }
82 
83  // marking adjacency entries
84  bool marked(adjEntry adj) const { return m_mark[adj]; }
85 
86  bool marked(node v) { return v->outdeg() == 1 && marked(v->firstAdj()); }
87 
88  // finding outpoints belonging to non-marked edges
90  return searchRealForward(m_out[v].begin());
91  }
92 
94  return searchRealBackward(m_out[v].rbegin());
95  }
96 
98  return searchRealForward(it.succ());
99  }
100 
102  return searchRealBackward(it.pred());
103  }
104 
105  // building in-/outpoint lists
107  node v = adj->theNode();
108  m_pointOf[adj] = &(*m_in[v].pushBack(InOutPoint(adj)));
109  }
110 
112  node v = adj->theNode();
113  m_pointOf[adj] = &(*m_out[v].pushBack(InOutPoint(adj)));
114  }
115 
116  void pushInpoint(adjEntry adj) {
117  node v = adj->theNode();
118  m_pointOf[adj] = &(*m_in[v].pushFront(InOutPoint(adj)));
119  }
120 
121  // setting relative coordinates
122  void setOutCoord(ListIterator<InOutPoint> it, int dx, int dy) {
123  (*it).m_dx = dx;
124  (*it).m_dy = dy;
125  }
126 
127  void setInCoord(ListIterator<InOutPoint> it, int dx, int dy) {
128  (*it).m_dx = dx;
129  (*it).m_dy = dy;
130  }
131 
132  void setOutDx(ListIterator<InOutPoint> it, int dx) { (*it).m_dx = dx; }
133 
135 
136  void changeEdge(node v, adjEntry adj_new) {
137  m_out[v].popBack();
138  appendInpoint(adj_new);
139  }
140 
141  // belongs v to a chain (= at most to non-marked incoming edges
142  bool isChain(node v) const {
143  int i = 0;
144  for (const InOutPoint& iop : m_in[v]) {
145  if (!marked(iop.m_adj)) {
146  ++i;
147  }
148  }
149  return i <= 2;
150  }
151 
152  // width of the left-/right side of an in-/outpoint list
153  int outLeft(node v) const { return (m_out[v].empty()) ? 0 : (-m_out[v].front().m_dx); }
154 
155  int outRight(node v) const { return (m_out[v].empty()) ? 0 : (m_out[v].back().m_dx); }
156 
157  int inLeft(node v) const { return (m_in[v].empty()) ? 0 : (-m_in[v].front().m_dx); }
158 
159  int inRight(node v) const { return (m_in[v].empty()) ? 0 : (m_in[v].back().m_dx); }
160 
161  int maxLeft(node v) const { return max(inLeft(v), outLeft(v)); }
162 
163  int maxRight(node v) const { return max(inRight(v), outRight(v)); }
164 
165  int maxPlusLeft(node v) const {
166  return (in(v) >= 3) ? max(inLeft(v) + 1, outLeft(v)) : maxLeft(v);
167  }
168 
169  int maxPlusRight(node v) const {
170  return (in(v) >= 3) ? max(inRight(v) + 1, outRight(v)) : maxRight(v);
171  }
172 
173  InOutPoint middleNeighbor(node z1) const;
174 
175  void numDeg1(node v, int& xl, int& xr, bool doubleCount) const;
176 
179 
180  void switchBeginOut(node v);
181  void switchEndOut(node v);
182 
183 
185 
186 
187 private:
191 
194 };
195 
196 }
ogdf::ArrayBuffer
An array that keeps track of the number of inserted elements; also usable as an efficient stack.
Definition: Array.h:46
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::ListIteratorBase::pred
ListIteratorBase< E, isConst, isReverse > pred() const
Returns predecessor iterator.
Definition: List.h:169
ogdf::IOPoints::restoreDeg1Nodes
void restoreDeg1Nodes(PlanRep &PG, ArrayBuffer< PlanRep::Deg1RestoreInfo > &S)
ogdf::IOPoints::numDeg1
void numDeg1(node v, int &xl, int &xr, bool doubleCount) const
ogdf::InOutPoint::m_dx
int m_dx
Definition: IOPoints.h:42
ogdf::PlanRep
Planarized representations (of a connected component) of a graph.
Definition: PlanRep.h:57
ogdf::IOPoints::m_out
NodeArray< List< InOutPoint > > m_out
Definition: IOPoints.h:188
ogdf::IOPoints::switchEndIn
adjEntry switchEndIn(node v)
ogdf::IOPoints::switchEndOut
void switchEndOut(node v)
ogdf::AdjElement::theNode
node theNode() const
Returns the node whose adjacency list contains this element.
Definition: Graph_d.h:159
ogdf::IOPoints::setOutDx
void setOutDx(ListIterator< InOutPoint > it, int dx)
Definition: IOPoints.h:132
ogdf::IOPoints::inpoints
const List< InOutPoint > & inpoints(node v) const
Definition: IOPoints.h:72
ogdf::begin
HypergraphRegistry< HypernodeElement >::iterator begin(const HypergraphRegistry< HypernodeElement > &self)
ogdf::IOPoints::m_mark
AdjEntryArray< bool > m_mark
Definition: IOPoints.h:189
ogdf::IOPoints::nextRealOut
ListConstIterator< InOutPoint > nextRealOut(ListConstIterator< InOutPoint > it) const
Definition: IOPoints.h:97
ogdf::IOPoints::maxLeft
int maxLeft(node v) const
Definition: IOPoints.h:161
ogdf::IOPoints::m_height
NodeArray< int > m_height
Definition: IOPoints.h:184
ogdf::InOutPoint::InOutPoint
InOutPoint(adjEntry adj)
Definition: IOPoints.h:50
ogdf::IOPoints::prevRealOut
ListConstIterator< InOutPoint > prevRealOut(ListConstIterator< InOutPoint > it) const
Definition: IOPoints.h:101
ogdf::IOPoints::firstRealOut
ListConstIterator< InOutPoint > firstRealOut(node v) const
Definition: IOPoints.h:89
ogdf::InOutPoint
Representation of an in- or outpoint.
Definition: IOPoints.h:41
ogdf::IOPoints::appendInpoint
void appendInpoint(adjEntry adj)
Definition: IOPoints.h:106
ogdf::IOPoints::marked
bool marked(node v)
Definition: IOPoints.h:86
ogdf::IOPoints
Representation of in- and outpoint lists.
Definition: IOPoints.h:57
ogdf::IOPoints::out
int out(node v) const
Definition: IOPoints.h:67
PlanRep.h
Declaration of a base class for planar representations of graphs and cluster graphs.
ogdf::IOPoints::m_pointOf
AdjEntryArray< InOutPoint * > m_pointOf
Definition: IOPoints.h:190
ogdf::AdjElement
Class for adjacency list elements.
Definition: Graph_d.h:135
ogdf::IOPoints::searchRealBackward
ListConstIterator< InOutPoint > searchRealBackward(ListConstIterator< InOutPoint > it) const
ogdf::ListIteratorBase::succ
ListIteratorBase< E, isConst, isReverse > succ() const
Returns successor iterator.
Definition: List.h:164
ogdf::IOPoints::middleNeighbor
InOutPoint middleNeighbor(node z1) const
ogdf::IOPoints::searchRealForward
ListConstIterator< InOutPoint > searchRealForward(ListConstIterator< InOutPoint > it) const
ogdf::NodeElement::outdeg
int outdeg() const
Returns the outdegree of the node.
Definition: Graph_d.h:273
ogdf::IOPoints::outpoints
const List< InOutPoint > & outpoints(node v) const
Definition: IOPoints.h:76
ogdf::IOPoints::maxRight
int maxRight(node v) const
Definition: IOPoints.h:163
ogdf::IOPoints::pushInpoint
void pushInpoint(adjEntry adj)
Definition: IOPoints.h:116
ogdf::IOPoints::inLeft
int inLeft(node v) const
Definition: IOPoints.h:157
ogdf::IOPoints::IOPoints
IOPoints(const Graph &G)
Definition: IOPoints.h:61
ogdf::IOPoints::appendOutpoint
void appendOutpoint(adjEntry adj)
Definition: IOPoints.h:111
ogdf::IOPoints::in
int in(node v) const
Definition: IOPoints.h:69
ogdf::IOPoints::setInCoord
void setInCoord(ListIterator< InOutPoint > it, int dx, int dy)
Definition: IOPoints.h:127
ogdf::List
Doubly linked lists (maintaining the length of the list).
Definition: List.h:42
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::IOPoints::changeEdge
void changeEdge(node v, adjEntry adj_new)
Definition: IOPoints.h:136
ogdf::IOPoints::outLeft
int outLeft(node v) const
Definition: IOPoints.h:153
ogdf::IOPoints::outpoints
List< InOutPoint > & outpoints(node v)
Definition: IOPoints.h:78
ogdf::IOPoints::lastRealOut
ListConstIterator< InOutPoint > lastRealOut(node v) const
Definition: IOPoints.h:93
ogdf::IOPoints::setOutCoord
void setOutCoord(ListIterator< InOutPoint > it, int dx, int dy)
Definition: IOPoints.h:122
ogdf::IOPoints::inRight
int inRight(node v) const
Definition: IOPoints.h:159
ogdf::IOPoints::marked
bool marked(adjEntry adj) const
Definition: IOPoints.h:84
ogdf::IOPoints::maxPlusLeft
int maxPlusLeft(node v) const
Definition: IOPoints.h:165
ogdf::InOutPoint::InOutPoint
InOutPoint()
Definition: IOPoints.h:45
ogdf::IOPoints::m_in
NodeArray< List< InOutPoint > > m_in
Definition: IOPoints.h:188
ogdf::IOPoints::IOPoints
IOPoints()
Definition: IOPoints.h:59
ogdf::NodeElement::firstAdj
adjEntry firstAdj() const
Returns the first entry in the adjaceny list.
Definition: Graph_d.h:279
ogdf::IOPoints::inpoints
List< InOutPoint > & inpoints(node v)
Definition: IOPoints.h:74
ogdf::IOPoints::pointOf
const InOutPoint * pointOf(adjEntry adj) const
Definition: IOPoints.h:81
ogdf::InOutPoint::m_adj
adjEntry m_adj
Definition: IOPoints.h:43
ogdf::IOPoints::switchBeginIn
adjEntry switchBeginIn(node v)
ogdf::ListIteratorBase
Encapsulates a pointer to a list element.
Definition: List.h:46
ogdf::IOPoints::maxPlusRight
int maxPlusRight(node v) const
Definition: IOPoints.h:169
ogdf::IOPoints::outRight
int outRight(node v) const
Definition: IOPoints.h:155
ogdf::IOPoints::m_depth
NodeArray< int > m_depth
Definition: IOPoints.h:184
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::InOutPoint::m_dy
int m_dy
Definition: IOPoints.h:42
ogdf::IOPoints::isChain
bool isChain(node v) const
Definition: IOPoints.h:142
ogdf::IOPoints::~IOPoints
~IOPoints()
Definition: IOPoints.h:64
ogdf::IOPoints::switchBeginOut
void switchBeginOut(node v)