bool OrderedTask::Insert(const OrderedTaskPoint &new_tp, const unsigned position) { if (position >= task_points.size()) return Append(new_tp); if (/* is the new_tp allowed in this context? */ (position > 0 && !new_tp.IsPredecessorAllowed()) || !new_tp.IsSuccessorAllowed() || /* can a tp be inserted at this position? */ (position > 0 && !task_points[position - 1]->IsSuccessorAllowed()) || !task_points[position]->IsPredecessorAllowed()) return false; if (active_task_point >= position) active_task_point++; task_points.insert(task_points.begin() + position, new_tp.Clone(task_behaviour, ordered_behaviour)); if (position) SetNeighbours(position - 1); SetNeighbours(position); SetNeighbours(position + 1); UpdateGeometry(); return true; }
bool OrderedTask::Replace(const OrderedTaskPoint &new_tp, const unsigned position) { if (position >= task_points.size()) return false; if (task_points[position]->Equals(new_tp)) // nothing to do return true; /* is the new_tp allowed in this context? */ if ((position > 0 && !new_tp.IsPredecessorAllowed()) || (position + 1 < task_points.size() && !new_tp.IsSuccessorAllowed())) return false; delete task_points[position]; task_points[position] = new_tp.Clone(task_behaviour, ordered_behaviour); if (position) SetNeighbours(position - 1); SetNeighbours(position); if (position + 1 < task_points.size()) SetNeighbours(position + 1); UpdateGeometry(); return true; }
bool OrderedTask::Append(const OrderedTaskPoint &new_tp) { if (/* is the new_tp allowed in this context? */ (!task_points.empty() && !new_tp.IsPredecessorAllowed()) || /* can a tp be appended after the last one? */ (task_points.size() >= 1 && !task_points[task_points.size() - 1]->IsSuccessorAllowed())) return false; task_points.push_back(new_tp.Clone(task_behaviour, ordered_settings)); if (task_points.size() > 1) SetNeighbours(task_points.size() - 2); else { // give it a value when we have one tp so it is not uninitialised last_min_location = new_tp.GetLocation(); } SetNeighbours(task_points.size() - 1); return true; }