Update ratsnest conn to multiset

This commit is contained in:
Seth Hillbrand 2020-06-22 19:18:46 -07:00
parent a2ad84f84d
commit 214a9d53b0
2 changed files with 22 additions and 9 deletions

View File

@ -111,8 +111,10 @@ void RN_NET::kruskalMST( std::priority_queue<CN_EDGE> &aEdges )
m_rnEdges.clear(); m_rnEdges.clear();
for( size_t i = 0; i < m_nodes.size(); i++ ) int i = 0;
m_nodes[i]->SetTag( i );
for( auto& node : m_nodes )
node->SetTag( i++ );
while( !aEdges.empty() ) while( !aEdges.empty() )
{ {
@ -316,7 +318,7 @@ void RN_NET::compute()
auto last = ++m_nodes.begin(); auto last = ++m_nodes.begin();
// There can be only one possible connection, but it is missing // There can be only one possible connection, but it is missing
CN_EDGE edge (*m_nodes.begin(), *last ); CN_EDGE edge ( *m_nodes.begin(), *last );
edge.GetSourceNode()->SetTag( 0 ); edge.GetSourceNode()->SetTag( 0 );
edge.GetTargetNode()->SetTag( 1 ); edge.GetTargetNode()->SetTag( 1 );
@ -397,7 +399,7 @@ void RN_NET::AddCluster( CN_CLUSTER_PTR aCluster )
for( unsigned int i = 0; i < nAnchors; i++ ) for( unsigned int i = 0; i < nAnchors; i++ )
{ {
anchors[i]->SetCluster( aCluster ); anchors[i]->SetCluster( aCluster );
m_nodes.push_back(anchors[i]); m_nodes.insert( anchors[i] );
if( firstAnchor ) if( firstAnchor )
{ {

View File

@ -34,6 +34,7 @@
#include <math/box2.h> #include <math/box2.h>
#include <deque> #include <deque>
#include <set>
#include <unordered_set> #include <unordered_set>
#include <unordered_map> #include <unordered_map>
@ -51,6 +52,16 @@ class CN_CONNECTIVITY_ALGO;
struct RN_NODE_OR_FILTER; struct RN_NODE_OR_FILTER;
struct RN_NODE_AND_FILTER; struct RN_NODE_AND_FILTER;
struct CN_PTR_CMP
{
bool operator()( const CN_ANCHOR_PTR& aItem, const CN_ANCHOR_PTR& bItem ) const
{
if( aItem->Pos().x == bItem->Pos().x )
return aItem->Pos().y < bItem->Pos().y;
else
return aItem->Pos().x < bItem->Pos().x;
}
};
/** /**
* RN_NET * RN_NET
@ -74,10 +85,10 @@ public:
* Function MarkDirty() * Function MarkDirty()
* Marks ratsnest for given net as 'dirty', i.e. requiring recomputation. * Marks ratsnest for given net as 'dirty', i.e. requiring recomputation.
*/ */
void MarkDirty() // void MarkDirty()
{ // {
m_dirty = true; // m_dirty = true;
} // }
/** /**
* Function IsDirty() * Function IsDirty()
@ -152,7 +163,7 @@ protected:
void kruskalMST( std::priority_queue<CN_EDGE> &aEdges ); void kruskalMST( std::priority_queue<CN_EDGE> &aEdges );
///> Vector of nodes ///> Vector of nodes
std::vector<CN_ANCHOR_PTR> m_nodes; std::multiset<CN_ANCHOR_PTR, CN_PTR_CMP> m_nodes;
///> Vector of edges that make pre-defined connections ///> Vector of edges that make pre-defined connections
std::vector<CN_EDGE> m_boardEdges; std::vector<CN_EDGE> m_boardEdges;