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.predecessor_allowed()) || !new_tp.successor_allowed() || /* can a tp be inserted at this position? */ (position > 0 && !task_points[position - 1]->successor_allowed()) || !task_points[position]->predecessor_allowed()) return false; if (active_task_point >= position) active_task_point++; task_points.insert(task_points.begin() + position, new_tp.clone(task_behaviour, m_ordered_behaviour)); if (position) set_neighbours(position - 1); set_neighbours(position); set_neighbours(position + 1); update_geometry(); 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.predecessor_allowed()) || (position + 1 < task_points.size() && !new_tp.successor_allowed())) return false; delete task_points[position]; task_points[position] = new_tp.clone(task_behaviour, m_ordered_behaviour); if (position) set_neighbours(position - 1); set_neighbours(position); if (position + 1 < task_points.size()) set_neighbours(position + 1); update_geometry(); return true; }
bool OrderedTask::Append(const OrderedTaskPoint &new_tp) { if (/* is the new_tp allowed in this context? */ (!task_points.empty() && !new_tp.predecessor_allowed()) || /* can a tp be appended after the last one? */ (task_points.size() >= 1 && !task_points[task_points.size() - 1]->successor_allowed())) return false; task_points.push_back(new_tp.clone(task_behaviour, m_ordered_behaviour)); if (task_points.size() > 1) set_neighbours(task_points.size() - 2); else { // give it a value when we have one tp so it is not uninitialised m_location_min_last = new_tp.GetLocation(); } set_neighbours(task_points.size() - 1); update_geometry(); return true; }