DECLARE_EXPORT Load::~Load() { // Set a flag to make sure the level computation is triggered again HasLevel::triggerLazyRecomputation(); // Delete existing loadplans if (getOperation() && getResource()) { // Loop over operationplans for(OperationPlan::iterator i(getOperation()); i != OperationPlan::end(); ++i) // Loop over loadplans for(OperationPlan::LoadPlanIterator j = i->beginLoadPlans(); j != i->endLoadPlans(); ) if (j->getLoad() == this) j.deleteLoadPlan(); else ++j; } // Delete the load from the operation and resource if (getOperation()) getOperation()->loaddata.erase(this); if (getResource()) getResource()->loads.erase(this); }
DECLARE_EXPORT Load::~Load() { // Set a flag to make sure the level computation is triggered again HasLevel::triggerLazyRecomputation(); // Delete existing loadplans if (getOperation() && getResource()) { // Loop over operationplans for(OperationPlan::iterator i(getOperation()); i != OperationPlan::end(); ++i) // Loop over loadplans for(OperationPlan::LoadPlanIterator j = i->beginLoadPlans(); j != i->endLoadPlans(); ) if (j->getLoad() == this) j.deleteLoadPlan(); else ++j; } // Delete the load from the operation and resource if (getOperation()) getOperation()->loaddata.erase(this); if (getResource()) getResource()->loads.erase(this); // Clean up alternate loads if (hasAlts) { // The load has alternates. // Make a new load the leading one. Or if there is only one alternate // present it is not marked as an alternate any more. unsigned short cnt = 0; int minprio = INT_MAX; Load* newLeader = NULL; for (Operation::loadlist::iterator i = getOperation()->loaddata.begin(); i != getOperation()->loaddata.end(); ++i) if (i->altLoad == this) { cnt++; if (i->priority < minprio) { newLeader = &*i; minprio = i->priority; } } if (cnt < 1) throw LogicException("Alternate loads update failure"); else if (cnt == 1) // No longer an alternate any more newLeader->altLoad = NULL; else { // Mark a new leader load newLeader->hasAlts = true; newLeader->altLoad = NULL; for (Operation::loadlist::iterator i = getOperation()->loaddata.begin(); i != getOperation()->loaddata.end(); ++i) if (i->altLoad == this) i->altLoad = newLeader; } } if (altLoad) { // The load is an alternate of another one. // If it was the only alternate, then the hasAlts flag on the parent // load needs to be set back to false bool only_one = true; for (Operation::loadlist::iterator i = getOperation()->loaddata.begin(); i != getOperation()->loaddata.end(); ++i) if (i->altLoad == altLoad) { only_one = false; break; } if (only_one) altLoad->hasAlts = false; } }