Open
Graph Drawing
Framework

 v.2012.05
 

ClusterPQContainer.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
00007  ***************************************************************/
00008  
00047 #ifdef _MSC_VER
00048 #pragma once
00049 #endif
00050 
00051 
00052 #ifndef OGDF_CLUSTER_PQ_CONTAINER_H
00053 #define OGDF_CLUSTER_PQ_CONTAINER_H
00054 
00055 #include <ogdf/cluster/CconnectClusterPlanarEmbed.h>
00056 #include <ogdf/internal/planarity/EmbedPQTree.h>
00057 #include <ogdf/basic/NodeArray.h>
00058 #include <ogdf/basic/EdgeArray.h>
00059 
00060 
00061 namespace ogdf {
00062 
00063 class ClusterPQContainer {
00064 
00065     friend class CconnectClusterPlanarEmbed;
00066 
00067 
00068     // Definition
00069     // incoming edge of v: an edge e = (v,w) with number(v) < number(w)
00070 
00071 
00072     // Stores for every node v the keys corresponding to the incoming edges of v 
00073     NodeArray<SListPure<PlanarLeafKey<indInfo*>* > >* m_inLeaves;
00074 
00075     // Stores for every node v the keys corresponding to the outgoing edges of v 
00076     NodeArray<SListPure<PlanarLeafKey<indInfo*>* > >* m_outLeaves;
00077     
00078     // Stores for every node v the sequence of incoming edges of v according 
00079     // to the embedding
00080     NodeArray<SListPure<edge> >* m_frontier;
00081     
00082     // Stores for every node v the nodes corresponding to the
00083     // opposed sink indicators found in the frontier of v.
00084     NodeArray<SListPure<node> >* m_opposed;
00085     
00086     // Stores for every node v the nodes corresponding to the
00087     // non opposed sink indicators found in the frontier of v.
00088     NodeArray<SListPure<node> >* m_nonOpposed;
00089     
00090     // Table to acces for every edge its corresponding key in the PQTree    
00091     EdgeArray<PlanarLeafKey<indInfo*>*>* m_edge2Key;
00092 
00093     // Stores for every node its st-number
00094     NodeArray<int> *m_numbering;
00095 
00096     // Stores for every st-number the node
00097     Array<node> *m_tableNumber2Node;
00098 
00099     node m_superSink;
00100 
00101     // the subgraph that contains the biconnected component
00102     // NOT THE COPY OF THE BICONNECTED COMPONENT THAT WAS CONSTRUCTED
00103     // DURING PLANARITY TESTING. THIS HAS BEEN DELETED.
00104     Graph                   *m_subGraph; 
00105     // corresponding PQTree
00106     EmbedPQTree             *m_T;
00107     // The leaf correpsonding to the edge (s,t).
00108     PlanarLeafKey<indInfo*> *m_stEdgeLeaf;
00109 
00110 public:
00111 
00112     ClusterPQContainer():
00113         m_inLeaves(0),m_outLeaves(0),m_frontier(0),
00114         m_opposed(0),m_nonOpposed(0),m_edge2Key(0),
00115         m_numbering(0),m_tableNumber2Node(0),
00116         m_superSink(0),m_subGraph(0),m_T(0), m_stEdgeLeaf(0) {};
00117     
00118     ~ClusterPQContainer() {};
00119 
00120     void init(Graph *subGraph){
00121         m_subGraph = subGraph;
00122         m_inLeaves 
00123             = OGDF_NEW NodeArray<SListPure<PlanarLeafKey<indInfo*>* > >(*subGraph);
00124 
00125         m_outLeaves 
00126             = OGDF_NEW NodeArray<SListPure<PlanarLeafKey<indInfo*>* > >(*subGraph);
00127 
00128         m_frontier
00129             = OGDF_NEW NodeArray<SListPure<edge> >(*subGraph);
00130 
00131         m_opposed
00132             = OGDF_NEW NodeArray<SListPure<node> >(*subGraph);
00133 
00134         m_nonOpposed
00135             = OGDF_NEW NodeArray<SListPure<node> >(*subGraph);  
00136 
00137         m_edge2Key
00138             = OGDF_NEW EdgeArray<PlanarLeafKey<indInfo*>*>(*subGraph);  
00139 
00140         m_numbering
00141             = OGDF_NEW NodeArray<int >(*subGraph);
00142 
00143         m_tableNumber2Node 
00144             = OGDF_NEW Array<node>(subGraph->numberOfNodes()+1);
00145     }
00146 
00147 
00148     void Cleanup() {
00149         if (m_inLeaves)
00150             delete m_inLeaves;
00151         if (m_outLeaves)
00152         {
00153             node v;
00154             forall_nodes(v,*m_subGraph)
00155             {   
00156                 while (!(*m_outLeaves)[v].empty())
00157                 {
00158                     PlanarLeafKey<indInfo*>* L = (*m_outLeaves)[v].popFrontRet();
00159                     delete L;   
00160                 }
00161             }
00162             delete m_outLeaves;
00163         }
00164         if (m_frontier)
00165             delete m_frontier;
00166         if (m_opposed)
00167             delete m_opposed;
00168         if (m_nonOpposed)
00169             delete m_nonOpposed;
00170         if (m_edge2Key)
00171             delete m_edge2Key;
00172         if (m_T)
00173         {
00174             m_T->emptyAllPertinentNodes();
00175             delete m_T;
00176         }
00177         if (m_numbering)
00178             delete m_numbering;
00179         if (m_tableNumber2Node)
00180             delete m_tableNumber2Node;
00181 
00182     }
00183 };
00184 
00185 }
00186 
00187 #endif