X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f8cc796d4887f187e4cf49b10d53415afc56025a..1d66ac4c2a43e3df812bd855d3c385b23127a57d:/include/simgrid/s4u/Activity.hpp diff --git a/include/simgrid/s4u/Activity.hpp b/include/simgrid/s4u/Activity.hpp index ab1e57bb80..4608f49a8a 100644 --- a/include/simgrid/s4u/Activity.hpp +++ b/include/simgrid/s4u/Activity.hpp @@ -6,10 +6,12 @@ #ifndef SIMGRID_S4U_ACTIVITY_HPP #define SIMGRID_S4U_ACTIVITY_HPP -#include "xbt/asserts.h" +#include +#include #include #include #include +#include #include #include #include @@ -51,10 +53,29 @@ protected: void add_successor(ActivityPtr a) { + if(this == a) + throw std::invalid_argument("Cannot be its own successor"); + auto p = std::find_if(successors_.begin(), successors_.end(), [a](ActivityPtr const& i){ return i.get() == a.get(); }); + if (p != successors_.end()) + throw std::invalid_argument("Dependency already exists"); + successors_.push_back(a); a->dependencies_.insert({this}); } + void remove_successor(ActivityPtr a) + { + if(this == a) + throw std::invalid_argument("Cannot ask to remove its from successors"); + + auto p = std::find_if(successors_.begin(), successors_.end(), [a](ActivityPtr const& i){ return i.get() == a.get(); }); + if (p != successors_.end()){ + successors_.erase(p); + a->dependencies_.erase({this}); + } else + throw std::invalid_argument("Dependency does not exist. Can not be removed."); + } + public: void vetoable_start() { @@ -155,7 +176,11 @@ public: Activity::add_successor(a); return static_cast(this); } - + AnyActivity* remove_successor(ActivityPtr a) + { + Activity::remove_successor(a); + return static_cast(this); + } AnyActivity* set_name(const std::string& name) { xbt_assert(get_state() == State::INITED, "Cannot change the name of an activity after its start");