Simplify PBQP graph removeAdjEdgeId implementation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204857 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Lang Hames
2014-03-26 21:21:53 +00:00
parent 927eb31eb4
commit 3a0a1f68ff

View File

@@ -67,16 +67,16 @@ namespace PBQP {
return Idx; return Idx;
} }
// If a swap is performed, returns the new EdgeId that must be void removeAdjEdgeId(Graph &G, NodeId ThisNId, AdjEdgeIdx Idx) {
// updated, otherwise returns invalidEdgeId(). // Swap-and-pop for fast removal.
EdgeId removeAdjEdgeId(AdjEdgeIdx Idx) { // 1) Update the adj index of the edge currently at back().
EdgeId EIdToUpdate = Graph::invalidEdgeId(); // 2) Swap Edge at Idx with back().
if (Idx < AdjEdgeIds.size() - 1) { // 3) pop_back()
std::swap(AdjEdgeIds[Idx], AdjEdgeIds.back()); // If Idx == size() - 1 then the updateAdjEdgeIdx and swap are
EIdToUpdate = AdjEdgeIds[Idx]; // redundant, but both operations are cheap.
} G.getEdge(AdjEdgeIds.back()).updateAdjEdgeIdx(ThisNId, Idx);
std::swap(AdjEdgeIds[Idx], AdjEdgeIds.back());
AdjEdgeIds.pop_back(); AdjEdgeIds.pop_back();
return EIdToUpdate;
} }
const AdjEdgeList& getAdjEdgeIds() const { return AdjEdgeIds; } const AdjEdgeList& getAdjEdgeIds() const { return AdjEdgeIds; }
@@ -138,9 +138,7 @@ namespace PBQP {
assert(ThisEdgeAdjIdxs[NIdx] != NodeEntry::getInvalidAdjEdgeIdx() && assert(ThisEdgeAdjIdxs[NIdx] != NodeEntry::getInvalidAdjEdgeIdx() &&
"Edge not connected to NIds[NIdx]."); "Edge not connected to NIds[NIdx].");
NodeEntry &N = G.getNode(NIds[NIdx]); NodeEntry &N = G.getNode(NIds[NIdx]);
EdgeId EIdToUpdate = N.removeAdjEdgeId(ThisEdgeAdjIdxs[NIdx]); N.removeAdjEdgeId(G, NIds[NIdx], ThisEdgeAdjIdxs[NIdx]);
if (EIdToUpdate != Graph::invalidEdgeId())
G.getEdge(EIdToUpdate).updateAdjEdgeIdx(NIds[NIdx], ThisEdgeAdjIdxs[NIdx]);
ThisEdgeAdjIdxs[NIdx] = NodeEntry::getInvalidAdjEdgeIdx(); ThisEdgeAdjIdxs[NIdx] = NodeEntry::getInvalidAdjEdgeIdx();
} }