File indexing completed on 2025-08-03 08:19:38
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <GTL/embedding.h>
0010
0011 #ifdef __GTL_MSVCC
0012 # ifdef _DEBUG
0013 # ifndef SEARCH_MEMORY_LEAKS_ENABLED
0014 # error SEARCH NOT ENABLED
0015 # endif
0016 # define new DEBUG_NEW
0017 # undef THIS_FILE
0018 static char THIS_FILE[] = __FILE__;
0019 # endif
0020 #endif
0021
0022 __GTL_BEGIN_NAMESPACE
0023
0024 planar_embedding::planar_embedding (const planar_embedding& em)
0025 {
0026 init (*(em.G));
0027
0028 node n;
0029 forall_nodes (n, *G) {
0030 adj_list::const_iterator it = em.adj[n].begin();
0031 adj_list::const_iterator end = em.adj[n].end();
0032
0033 for (; it != end; ++it) {
0034 pos (n, *it) = push_back (n, *it);
0035 }
0036 }
0037
0038 self.insert (self.begin(), em.self.begin(), em.self.end());
0039 multi.insert (multi.begin(), em.multi.begin(), em.multi.begin());
0040 }
0041
0042
0043 planar_embedding&
0044 planar_embedding::operator= (const planar_embedding& em)
0045 {
0046 node n;
0047 if (G != 0) {
0048 forall_nodes (n, *G) {
0049 adj[n].erase (adj[n].begin(), adj[n].end());
0050 }
0051 }
0052
0053 self.erase (self.begin(), self.end());
0054 multi.erase (multi.begin(), multi.end());
0055
0056 init (*(em.G));
0057
0058 forall_nodes (n, *G) {
0059 adj_list::const_iterator it = em.adjacency(n).begin();
0060 adj_list::const_iterator end = em.adjacency(n).end();
0061
0062 for (; it != end; ++it) {
0063 pos (n, *it) = push_back (n, *it);
0064 }
0065 }
0066
0067 self.insert (self.begin(), em.self.begin(), em.self.end());
0068 multi.insert (multi.begin(), em.multi.begin(), em.multi.begin());
0069
0070 return *this;
0071 }
0072
0073
0074 void
0075 planar_embedding::init (graph& my_G)
0076 {
0077 adj.init (my_G);
0078
0079
0080
0081
0082
0083
0084
0085
0086 #ifndef __GTL_MSVCC
0087 s_pos.init (my_G);
0088 t_pos.init (my_G);
0089 #endif
0090 G = &my_G;
0091 }
0092
0093
0094 symlist<edge>::iterator
0095 planar_embedding::push_back (node n, edge e)
0096 {
0097 return adj[n].insert (adj[n].end(), e);
0098 }
0099
0100
0101 symlist<edge>::iterator
0102 planar_embedding::push_front (node n, edge e)
0103 {
0104 return adj[n].insert (adj[n].begin(), e);
0105 }
0106
0107
0108 symlist<edge>::iterator&
0109 planar_embedding::pos (node n, edge e)
0110 {
0111 if (e.source() == n) {
0112 return s_pos[e];
0113 } else if (e.target() == n) {
0114 return t_pos[e];
0115 } else {
0116 assert (false);
0117
0118 return s_pos[e];
0119 }
0120 }
0121
0122
0123 void
0124 planar_embedding::insert_selfloop (edge e)
0125 {
0126 node n = e.source();
0127 s_pos[e] = t_pos[e] = adj[n].insert (adj[n].begin(), e);
0128 }
0129
0130
0131 void
0132 planar_embedding::turn (node n)
0133 {
0134 adj[n].reverse();
0135 }
0136
0137
0138 edge
0139 planar_embedding::cyclic_next (node n, edge e)
0140 {
0141 iterator it = pos (n, e);
0142 ++it;
0143
0144 if (it == adj[n].end()) {
0145 ++it;
0146 }
0147
0148 return *it;
0149 }
0150
0151
0152 edge
0153 planar_embedding::cyclic_prev (node n, edge e)
0154 {
0155 iterator it = pos (n, e);
0156 --it;
0157
0158 if (it == adj[n].end()) {
0159 --it;
0160 }
0161
0162 return *it;
0163 }
0164
0165 bool
0166 planar_embedding::check ()
0167 {
0168 node n;
0169 forall_nodes (n ,*G) {
0170 iterator it, end;
0171
0172 for (it = adj[n].begin(), end = adj[n].end(); it != end; ++it) {
0173 edge curr = *it;
0174 node other = n.opposite (curr);
0175
0176 edge prev = cyclic_prev (n, curr);
0177 edge next = cyclic_next (n, prev);
0178 assert (next == curr);
0179
0180 while (other != n) {
0181 curr = cyclic_next (other, curr);
0182 other = other.opposite (curr);
0183 }
0184 if (curr != prev) {
0185 return false;
0186 }
0187
0188 }
0189 }
0190
0191 return true;
0192 }
0193
0194
0195 void
0196 planar_embedding::write_st (ostream& os, st_number& st)
0197 {
0198 st_number::iterator n_it = st.begin();
0199 st_number::iterator n_end = st.end();
0200 iterator it, end;
0201
0202 for (; n_it != n_end; ++n_it) {
0203 node n = *n_it;
0204 os << "[" << st[n] << "]::";
0205
0206 it = adj[n].begin();
0207 end = adj[n].end();
0208
0209 for (; it != end; ++it) {
0210 os << "[" << st[n.opposite (*it)] << "]";
0211 }
0212
0213 os << endl;
0214 }
0215
0216 os << "SELFLOOPS:" << endl;
0217 list<edge>::iterator e_it, e_end;
0218 for (e_it = self.begin(), e_end = self.end(); e_it != e_end; ++e_it) {
0219 os << st[(*e_it).source()] << "---" << st[(*e_it).target()] << endl;
0220 }
0221
0222 os << "MULTIPLE EDGES:" << endl;
0223 for (e_it = multi.begin(), e_end = multi.end(); e_it != e_end; ++e_it) {
0224 os << st[(*e_it).source()] << "---" << st[(*e_it).target()] << endl;
0225 }
0226 }
0227
0228 GTL_EXTERN ostream& operator<< (ostream& os, planar_embedding& em)
0229 {
0230 graph::node_iterator n_it = em.G->nodes_begin();
0231 graph::node_iterator n_end = em.G->nodes_end();
0232 symlist<edge>::iterator it, end;
0233
0234 for (; n_it != n_end; ++n_it) {
0235 node n = *n_it;
0236 os << n << ":: ";
0237
0238 it = em.adj[n].begin();
0239 end = em.adj[n].end();
0240
0241 for (; it != end; ++it) {
0242 os << n.opposite (*it) << "*";
0243 }
0244
0245 os << endl;
0246 }
0247
0248 os << "SELFLOOPS:" << endl;
0249 list<edge>::iterator e_it, e_end;
0250 for (e_it = em.self.begin(), e_end = em.self.end(); e_it != e_end; ++e_it) {
0251 os << *e_it << endl;
0252 }
0253
0254 os << "MULTIPLE EDGES:" << endl;
0255 for (e_it = em.multi.begin(), e_end = em.multi.end(); e_it != e_end; ++e_it) {
0256 os << *e_it << endl;
0257 }
0258
0259 return os;
0260 }
0261
0262 __GTL_END_NAMESPACE
0263
0264
0265
0266