uint StationCargoList::ShiftCargo(Taction action, StationID next, bool include_invalid) { uint max_move = action.MaxMove(); if (this->ShiftCargo(action, next) && include_invalid && action.MaxMove() > 0) { this->ShiftCargo(action, INVALID_STATION); } return max_move - action.MaxMove(); }
uint StationCargoList::ShiftCargo(Taction action, StationIDStack next, bool include_invalid) { uint max_move = action.MaxMove(); while (!next.IsEmpty()) { this->ShiftCargo(action, next.Pop()); if (action.MaxMove() == 0) break; } if (include_invalid && action.MaxMove() > 0) { this->ShiftCargo(action, INVALID_STATION); } return max_move - action.MaxMove(); }
void VehicleCargoList::ShiftCargo(Taction action) { Iterator it(this->packets.begin()); while (it != this->packets.end() && action.MaxMove() > 0) { CargoPacket *cp = *it; if (action(cp)) { it = this->packets.erase(it); } else { break; } } }
bool StationCargoList::ShiftCargo(Taction &action, StationID next) { std::pair<Iterator, Iterator> range(this->packets.equal_range(next)); for (Iterator it(range.first); it != range.second && it.GetKey() == next;) { if (action.MaxMove() == 0) return false; CargoPacket *cp = *it; if (action(cp)) { it = this->packets.erase(it); } else { return false; } } return true; }
void VehicleCargoList::PopCargo(Taction action) { if (this->packets.empty()) return; Iterator it(--(this->packets.end())); Iterator begin(this->packets.begin()); while (action.MaxMove() > 0) { CargoPacket *cp = *it; if (action(cp)) { if (it != begin) { this->packets.erase(it--); } else { this->packets.erase(it); break; } } else { break; } } }