Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-03 08:19:38

0001 /* This software is distributed under the GNU Lesser General Public License */
0002 //==========================================================================
0003 //
0004 //   embedding.cpp 
0005 //
0006 //==========================================================================
0007 // $Id: embedding.cpp,v 1.18 2002/10/04 08:07:36 chris Exp $
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   // _DEBUG
0020 #endif  // __GTL_MSVCC
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     // There is a problem with node/edge maps of iterators with Visual C++
0081     // which I donīt fully understand at the moment. Anyway the init for the 
0082     // maps below is only needed to allocate memory, which is done anyway, when
0083     // values are assigned to it. 
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     // this should not happen.
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 //   end of file
0266 //--------------------------------------------------------------------------