mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Refactoring with range-based for, NFC
Patch by Wei-Ren Chen. Differential Revision: https://reviews.llvm.org/D32682 llvm-svn: 302148
This commit is contained in:
parent
466bbd4878
commit
d697de4ed0
@ -67,12 +67,11 @@ ResourcePriorityQueue::ResourcePriorityQueue(SelectionDAGISel *IS)
|
||||
unsigned
|
||||
ResourcePriorityQueue::numberRCValPredInSU(SUnit *SU, unsigned RCId) {
|
||||
unsigned NumberDeps = 0;
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
if (I->isCtrl())
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
if (Pred.isCtrl())
|
||||
continue;
|
||||
|
||||
SUnit *PredSU = I->getSUnit();
|
||||
SUnit *PredSU = Pred.getSUnit();
|
||||
const SDNode *ScegN = PredSU->getNode();
|
||||
|
||||
if (!ScegN)
|
||||
@ -105,12 +104,11 @@ ResourcePriorityQueue::numberRCValPredInSU(SUnit *SU, unsigned RCId) {
|
||||
unsigned ResourcePriorityQueue::numberRCValSuccInSU(SUnit *SU,
|
||||
unsigned RCId) {
|
||||
unsigned NumberDeps = 0;
|
||||
for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
if (I->isCtrl())
|
||||
for (const SDep &Succ : SU->Succs) {
|
||||
if (Succ.isCtrl())
|
||||
continue;
|
||||
|
||||
SUnit *SuccSU = I->getSUnit();
|
||||
SUnit *SuccSU = Succ.getSUnit();
|
||||
const SDNode *ScegN = SuccSU->getNode();
|
||||
if (!ScegN)
|
||||
continue;
|
||||
@ -142,9 +140,8 @@ unsigned ResourcePriorityQueue::numberRCValSuccInSU(SUnit *SU,
|
||||
|
||||
static unsigned numberCtrlDepsInSU(SUnit *SU) {
|
||||
unsigned NumberDeps = 0;
|
||||
for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I)
|
||||
if (I->isCtrl())
|
||||
for (const SDep &Succ : SU->Succs)
|
||||
if (Succ.isCtrl())
|
||||
NumberDeps++;
|
||||
|
||||
return NumberDeps;
|
||||
@ -152,9 +149,8 @@ static unsigned numberCtrlDepsInSU(SUnit *SU) {
|
||||
|
||||
static unsigned numberCtrlPredInSU(SUnit *SU) {
|
||||
unsigned NumberDeps = 0;
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I)
|
||||
if (I->isCtrl())
|
||||
for (SDep &Pred : SU->Preds)
|
||||
if (Pred.isCtrl())
|
||||
NumberDeps++;
|
||||
|
||||
return NumberDeps;
|
||||
@ -212,15 +208,14 @@ bool resource_sort::operator()(const SUnit *LHS, const SUnit *RHS) const {
|
||||
/// of SU, return it, otherwise return null.
|
||||
SUnit *ResourcePriorityQueue::getSingleUnscheduledPred(SUnit *SU) {
|
||||
SUnit *OnlyAvailablePred = nullptr;
|
||||
for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
SUnit &Pred = *I->getSUnit();
|
||||
if (!Pred.isScheduled) {
|
||||
for (const SDep &Pred : SU->Preds) {
|
||||
SUnit &PredSU = *Pred.getSUnit();
|
||||
if (!PredSU.isScheduled) {
|
||||
// We found an available, but not scheduled, predecessor. If it's the
|
||||
// only one we have found, keep track of it... otherwise give up.
|
||||
if (OnlyAvailablePred && OnlyAvailablePred != &Pred)
|
||||
if (OnlyAvailablePred && OnlyAvailablePred != &PredSU)
|
||||
return nullptr;
|
||||
OnlyAvailablePred = &Pred;
|
||||
OnlyAvailablePred = &PredSU;
|
||||
}
|
||||
}
|
||||
return OnlyAvailablePred;
|
||||
@ -230,9 +225,8 @@ void ResourcePriorityQueue::push(SUnit *SU) {
|
||||
// Look at all of the successors of this node. Count the number of nodes that
|
||||
// this node is the sole unscheduled node for.
|
||||
unsigned NumNodesBlocking = 0;
|
||||
for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I)
|
||||
if (getSingleUnscheduledPred(I->getSUnit()) == SU)
|
||||
for (const SDep &Succ : SU->Succs)
|
||||
if (getSingleUnscheduledPred(Succ.getSUnit()) == SU)
|
||||
++NumNodesBlocking;
|
||||
|
||||
NumNodesSolelyBlocking[SU->NodeNum] = NumNodesBlocking;
|
||||
@ -269,14 +263,13 @@ bool ResourcePriorityQueue::isResourceAvailable(SUnit *SU) {
|
||||
// Now see if there are no other dependencies
|
||||
// to instructions already in the packet.
|
||||
for (unsigned i = 0, e = Packet.size(); i != e; ++i)
|
||||
for (SUnit::const_succ_iterator I = Packet[i]->Succs.begin(),
|
||||
E = Packet[i]->Succs.end(); I != E; ++I) {
|
||||
for (const SDep &Succ : Packet[i]->Succs) {
|
||||
// Since we do not add pseudos to packets, might as well
|
||||
// ignore order deps.
|
||||
if (I->isCtrl())
|
||||
if (Succ.isCtrl())
|
||||
continue;
|
||||
|
||||
if (I->getSUnit() == SU)
|
||||
if (Succ.getSUnit() == SU)
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -499,11 +492,10 @@ void ResourcePriorityQueue::scheduledNode(SUnit *SU) {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
if (I->isCtrl() || (I->getSUnit()->NumRegDefsLeft == 0))
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
if (Pred.isCtrl() || (Pred.getSUnit()->NumRegDefsLeft == 0))
|
||||
continue;
|
||||
--I->getSUnit()->NumRegDefsLeft;
|
||||
--Pred.getSUnit()->NumRegDefsLeft;
|
||||
}
|
||||
}
|
||||
|
||||
@ -515,10 +507,9 @@ void ResourcePriorityQueue::scheduledNode(SUnit *SU) {
|
||||
// number of live ranges. All others, increase it.
|
||||
unsigned NumberNonControlDeps = 0;
|
||||
|
||||
for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
adjustPriorityOfUnscheduledPreds(I->getSUnit());
|
||||
if (!I->isCtrl())
|
||||
for (const SDep &Succ : SU->Succs) {
|
||||
adjustPriorityOfUnscheduledPreds(Succ.getSUnit());
|
||||
if (!Succ.isCtrl())
|
||||
NumberNonControlDeps++;
|
||||
}
|
||||
|
||||
@ -595,8 +586,7 @@ SUnit *ResourcePriorityQueue::pop() {
|
||||
std::vector<SUnit *>::iterator Best = Queue.begin();
|
||||
if (!DisableDFASched) {
|
||||
int BestCost = SUSchedulingCost(*Best);
|
||||
for (std::vector<SUnit *>::iterator I = std::next(Queue.begin()),
|
||||
E = Queue.end(); I != E; ++I) {
|
||||
for (auto I = std::next(Queue.begin()), E = Queue.end(); I != E; ++I) {
|
||||
|
||||
if (SUSchedulingCost(*I) > BestCost) {
|
||||
BestCost = SUSchedulingCost(*I);
|
||||
@ -606,8 +596,7 @@ SUnit *ResourcePriorityQueue::pop() {
|
||||
}
|
||||
// Use default TD scheduling mechanism.
|
||||
else {
|
||||
for (std::vector<SUnit *>::iterator I = std::next(Queue.begin()),
|
||||
E = Queue.end(); I != E; ++I)
|
||||
for (auto I = std::next(Queue.begin()), E = Queue.end(); I != E; ++I)
|
||||
if (Picker(*Best, *I))
|
||||
Best = I;
|
||||
}
|
||||
|
@ -160,18 +160,17 @@ void ScheduleDAGFast::ReleasePred(SUnit *SU, SDep *PredEdge) {
|
||||
|
||||
void ScheduleDAGFast::ReleasePredecessors(SUnit *SU, unsigned CurCycle) {
|
||||
// Bottom up: release predecessors
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
ReleasePred(SU, &*I);
|
||||
if (I->isAssignedRegDep()) {
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
ReleasePred(SU, &Pred);
|
||||
if (Pred.isAssignedRegDep()) {
|
||||
// This is a physical register dependency and it's impossible or
|
||||
// expensive to copy the register. Make sure nothing that can
|
||||
// clobber the register is scheduled between the predecessor and
|
||||
// this node.
|
||||
if (!LiveRegDefs[I->getReg()]) {
|
||||
if (!LiveRegDefs[Pred.getReg()]) {
|
||||
++NumLiveRegs;
|
||||
LiveRegDefs[I->getReg()] = I->getSUnit();
|
||||
LiveRegCycles[I->getReg()] = CurCycle;
|
||||
LiveRegDefs[Pred.getReg()] = Pred.getSUnit();
|
||||
LiveRegCycles[Pred.getReg()] = CurCycle;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -191,16 +190,15 @@ void ScheduleDAGFast::ScheduleNodeBottomUp(SUnit *SU, unsigned CurCycle) {
|
||||
ReleasePredecessors(SU, CurCycle);
|
||||
|
||||
// Release all the implicit physical register defs that are live.
|
||||
for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
if (I->isAssignedRegDep()) {
|
||||
if (LiveRegCycles[I->getReg()] == I->getSUnit()->getHeight()) {
|
||||
for (SDep &Succ : SU->Succs) {
|
||||
if (Succ.isAssignedRegDep()) {
|
||||
if (LiveRegCycles[Succ.getReg()] == Succ.getSUnit()->getHeight()) {
|
||||
assert(NumLiveRegs > 0 && "NumLiveRegs is already zero!");
|
||||
assert(LiveRegDefs[I->getReg()] == SU &&
|
||||
assert(LiveRegDefs[Succ.getReg()] == SU &&
|
||||
"Physical register dependency violated?");
|
||||
--NumLiveRegs;
|
||||
LiveRegDefs[I->getReg()] = nullptr;
|
||||
LiveRegCycles[I->getReg()] = 0;
|
||||
LiveRegDefs[Succ.getReg()] = nullptr;
|
||||
LiveRegCycles[Succ.getReg()] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -282,22 +280,20 @@ SUnit *ScheduleDAGFast::CopyAndMoveSuccessors(SUnit *SU) {
|
||||
SmallVector<SDep, 4> LoadPreds;
|
||||
SmallVector<SDep, 4> NodePreds;
|
||||
SmallVector<SDep, 4> NodeSuccs;
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
if (I->isCtrl())
|
||||
ChainPred = *I;
|
||||
else if (I->getSUnit()->getNode() &&
|
||||
I->getSUnit()->getNode()->isOperandOf(LoadNode))
|
||||
LoadPreds.push_back(*I);
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
if (Pred.isCtrl())
|
||||
ChainPred = Pred;
|
||||
else if (Pred.getSUnit()->getNode() &&
|
||||
Pred.getSUnit()->getNode()->isOperandOf(LoadNode))
|
||||
LoadPreds.push_back(Pred);
|
||||
else
|
||||
NodePreds.push_back(*I);
|
||||
NodePreds.push_back(Pred);
|
||||
}
|
||||
for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
if (I->isCtrl())
|
||||
ChainSuccs.push_back(*I);
|
||||
for (SDep &Succ : SU->Succs) {
|
||||
if (Succ.isCtrl())
|
||||
ChainSuccs.push_back(Succ);
|
||||
else
|
||||
NodeSuccs.push_back(*I);
|
||||
NodeSuccs.push_back(Succ);
|
||||
}
|
||||
|
||||
if (ChainPred.getSUnit()) {
|
||||
@ -354,21 +350,19 @@ SUnit *ScheduleDAGFast::CopyAndMoveSuccessors(SUnit *SU) {
|
||||
NewSU = Clone(SU);
|
||||
|
||||
// New SUnit has the exact same predecessors.
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I)
|
||||
if (!I->isArtificial())
|
||||
AddPred(NewSU, *I);
|
||||
for (SDep &Pred : SU->Preds)
|
||||
if (!Pred.isArtificial())
|
||||
AddPred(NewSU, Pred);
|
||||
|
||||
// Only copy scheduled successors. Cut them from old node's successor
|
||||
// list and move them over.
|
||||
SmallVector<std::pair<SUnit *, SDep>, 4> DelDeps;
|
||||
for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
if (I->isArtificial())
|
||||
for (SDep &Succ : SU->Succs) {
|
||||
if (Succ.isArtificial())
|
||||
continue;
|
||||
SUnit *SuccSU = I->getSUnit();
|
||||
SUnit *SuccSU = Succ.getSUnit();
|
||||
if (SuccSU->isScheduled) {
|
||||
SDep D = *I;
|
||||
SDep D = Succ;
|
||||
D.setSUnit(NewSU);
|
||||
AddPred(SuccSU, D);
|
||||
D.setSUnit(SU);
|
||||
@ -399,16 +393,15 @@ void ScheduleDAGFast::InsertCopiesAndMoveSuccs(SUnit *SU, unsigned Reg,
|
||||
// Only copy scheduled successors. Cut them from old node's successor
|
||||
// list and move them over.
|
||||
SmallVector<std::pair<SUnit *, SDep>, 4> DelDeps;
|
||||
for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
if (I->isArtificial())
|
||||
for (SDep &Succ : SU->Succs) {
|
||||
if (Succ.isArtificial())
|
||||
continue;
|
||||
SUnit *SuccSU = I->getSUnit();
|
||||
SUnit *SuccSU = Succ.getSUnit();
|
||||
if (SuccSU->isScheduled) {
|
||||
SDep D = *I;
|
||||
SDep D = Succ;
|
||||
D.setSUnit(CopyToSU);
|
||||
AddPred(SuccSU, D);
|
||||
DelDeps.push_back(std::make_pair(SuccSU, *I));
|
||||
DelDeps.push_back(std::make_pair(SuccSU, Succ));
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0, e = DelDeps.size(); i != e; ++i) {
|
||||
@ -479,10 +472,9 @@ bool ScheduleDAGFast::DelayForLiveRegsBottomUp(SUnit *SU,
|
||||
|
||||
SmallSet<unsigned, 4> RegAdded;
|
||||
// If this node would clobber any "live" register, then it's not ready.
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
if (I->isAssignedRegDep()) {
|
||||
CheckForLiveRegDef(I->getSUnit(), I->getReg(), LiveRegDefs,
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
if (Pred.isAssignedRegDep()) {
|
||||
CheckForLiveRegDef(Pred.getSUnit(), Pred.getReg(), LiveRegDefs,
|
||||
RegAdded, LRegs, TRI);
|
||||
}
|
||||
}
|
||||
@ -755,9 +747,8 @@ void ScheduleDAGLinearize::Schedule() {
|
||||
// Glue user must be scheduled together with the glue operand. So other
|
||||
// users of the glue operand must be treated as its users.
|
||||
SDNode *ImmGUser = Glue->getGluedUser();
|
||||
for (SDNode::use_iterator ui = Glue->use_begin(), ue = Glue->use_end();
|
||||
ui != ue; ++ui)
|
||||
if (*ui == ImmGUser)
|
||||
for (const SDNode *U : Glue->uses())
|
||||
if (U == ImmGUser)
|
||||
--Degree;
|
||||
GUser->setNodeId(UDegree + Degree);
|
||||
Glue->setNodeId(1);
|
||||
|
@ -520,21 +520,20 @@ FindCallSeqStart(SDNode *N, unsigned &NestLevel, unsigned &MaxNest,
|
||||
/// interference on flags.
|
||||
void ScheduleDAGRRList::ReleasePredecessors(SUnit *SU) {
|
||||
// Bottom up: release predecessors
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
ReleasePred(SU, &*I);
|
||||
if (I->isAssignedRegDep()) {
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
ReleasePred(SU, &Pred);
|
||||
if (Pred.isAssignedRegDep()) {
|
||||
// This is a physical register dependency and it's impossible or
|
||||
// expensive to copy the register. Make sure nothing that can
|
||||
// clobber the register is scheduled between the predecessor and
|
||||
// this node.
|
||||
SUnit *RegDef = LiveRegDefs[I->getReg()]; (void)RegDef;
|
||||
assert((!RegDef || RegDef == SU || RegDef == I->getSUnit()) &&
|
||||
SUnit *RegDef = LiveRegDefs[Pred.getReg()]; (void)RegDef;
|
||||
assert((!RegDef || RegDef == SU || RegDef == Pred.getSUnit()) &&
|
||||
"interference on register dependence");
|
||||
LiveRegDefs[I->getReg()] = I->getSUnit();
|
||||
if (!LiveRegGens[I->getReg()]) {
|
||||
LiveRegDefs[Pred.getReg()] = Pred.getSUnit();
|
||||
if (!LiveRegGens[Pred.getReg()]) {
|
||||
++NumLiveRegs;
|
||||
LiveRegGens[I->getReg()] = SU;
|
||||
LiveRegGens[Pred.getReg()] = SU;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -733,15 +732,14 @@ void ScheduleDAGRRList::ScheduleNodeBottomUp(SUnit *SU) {
|
||||
ReleasePredecessors(SU);
|
||||
|
||||
// Release all the implicit physical register defs that are live.
|
||||
for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
|
||||
I != E; ++I) {
|
||||
// LiveRegDegs[I->getReg()] != SU when SU is a two-address node.
|
||||
if (I->isAssignedRegDep() && LiveRegDefs[I->getReg()] == SU) {
|
||||
for (SDep &Succ : SU->Succs) {
|
||||
// LiveRegDegs[Succ.getReg()] != SU when SU is a two-address node.
|
||||
if (Succ.isAssignedRegDep() && LiveRegDefs[Succ.getReg()] == SU) {
|
||||
assert(NumLiveRegs > 0 && "NumLiveRegs is already zero!");
|
||||
--NumLiveRegs;
|
||||
LiveRegDefs[I->getReg()] = nullptr;
|
||||
LiveRegGens[I->getReg()] = nullptr;
|
||||
releaseInterferences(I->getReg());
|
||||
LiveRegDefs[Succ.getReg()] = nullptr;
|
||||
LiveRegGens[Succ.getReg()] = nullptr;
|
||||
releaseInterferences(Succ.getReg());
|
||||
}
|
||||
}
|
||||
// Release the special call resource dependence, if this is the beginning
|
||||
@ -802,17 +800,16 @@ void ScheduleDAGRRList::UnscheduleNodeBottomUp(SUnit *SU) {
|
||||
DEBUG(dbgs() << "*** Unscheduling [" << SU->getHeight() << "]: ");
|
||||
DEBUG(SU->dump(this));
|
||||
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
CapturePred(&*I);
|
||||
if (I->isAssignedRegDep() && SU == LiveRegGens[I->getReg()]){
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
CapturePred(&Pred);
|
||||
if (Pred.isAssignedRegDep() && SU == LiveRegGens[Pred.getReg()]){
|
||||
assert(NumLiveRegs > 0 && "NumLiveRegs is already zero!");
|
||||
assert(LiveRegDefs[I->getReg()] == I->getSUnit() &&
|
||||
assert(LiveRegDefs[Pred.getReg()] == Pred.getSUnit() &&
|
||||
"Physical register dependency violated?");
|
||||
--NumLiveRegs;
|
||||
LiveRegDefs[I->getReg()] = nullptr;
|
||||
LiveRegGens[I->getReg()] = nullptr;
|
||||
releaseInterferences(I->getReg());
|
||||
LiveRegDefs[Pred.getReg()] = nullptr;
|
||||
LiveRegGens[Pred.getReg()] = nullptr;
|
||||
releaseInterferences(Pred.getReg());
|
||||
}
|
||||
}
|
||||
|
||||
@ -895,7 +892,7 @@ void ScheduleDAGRRList::RestoreHazardCheckerBottomUp() {
|
||||
|
||||
std::vector<SUnit*>::const_iterator I = (Sequence.end() - LookAhead);
|
||||
unsigned HazardCycle = (*I)->getHeight();
|
||||
for (std::vector<SUnit*>::const_iterator E = Sequence.end(); I != E; ++I) {
|
||||
for (auto E = Sequence.end(); I != E; ++I) {
|
||||
SUnit *SU = *I;
|
||||
for (; SU->getHeight() > HazardCycle; ++HazardCycle) {
|
||||
HazardRec->RecedeCycle();
|
||||
@ -1261,10 +1258,9 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVectorImpl<unsigned> &LRegs) {
|
||||
//
|
||||
// If SU is the currently live definition of the same register that it uses,
|
||||
// then we are free to schedule it.
|
||||
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
|
||||
I != E; ++I) {
|
||||
if (I->isAssignedRegDep() && LiveRegDefs[I->getReg()] != SU)
|
||||
CheckForLiveRegDef(I->getSUnit(), I->getReg(), LiveRegDefs.get(),
|
||||
for (SDep &Pred : SU->Preds) {
|
||||
if (Pred.isAssignedRegDep() && LiveRegDefs[Pred.getReg()] != SU)
|
||||
CheckForLiveRegDef(Pred.getSUnit(), Pred.getReg(), LiveRegDefs.get(),
|
||||
RegAdded, LRegs, TRI);
|
||||
}
|
||||
|
||||
@ -1743,8 +1739,7 @@ protected:
|
||||
template<class SF>
|
||||
static SUnit *popFromQueueImpl(std::vector<SUnit*> &Q, SF &Picker) {
|
||||
std::vector<SUnit *>::iterator Best = Q.begin();
|
||||
for (std::vector<SUnit *>::iterator I = std::next(Q.begin()),
|
||||
E = Q.end(); I != E; ++I)
|
||||
for (auto I = std::next(Q.begin()), E = Q.end(); I != E; ++I)
|
||||
if (Picker(*Best, *I))
|
||||
Best = I;
|
||||
SUnit *V = *Best;
|
||||
|
Loading…
x
Reference in New Issue
Block a user