/** * @file kernel/pdevs/GraphManager.hpp * @author The ARTIS Development Team * See the AUTHORS or Authors.txt file */ /* * ARTIS - the multimodeling and simulation environment * This file is a part of the ARTIS environment * * Copyright (C) 2013-2018 ULCO http://www.univ-littoral.fr * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PDEVS_GRAPH_MANANGER #define PDEVS_GRAPH_MANANGER #include #include #include #include #include #include #include namespace artis { namespace pdevs { template < class Time, class Parameters = common::NoParameters, class GraphParameters = common::NoParameters > class GraphManager : public common::GraphManager < Time > { public: typedef GraphManager < Time, Parameters, GraphParameters > type; struct ModelPort { common::Model < Time >* model; unsigned int port_index; type* graph_manager; ModelPort(common::Model < Time >* model, unsigned int port_index) : model(model), port_index(port_index), graph_manager(nullptr) {} void operator>>(const ModelPort& dst) { graph_manager->add_link(model, port_index, dst.model, dst.port_index); } }; GraphManager(common::Coordinator < Time >* coordinator, const Parameters& /* parameters */, const GraphParameters& /* graph_parameters */) : common::GraphManager < Time >(coordinator) { } virtual ~GraphManager() { } ModelPort in(ModelPort p) { p.graph_manager = this; return p; } ModelPort out(ModelPort p) { p.graph_manager = this; return p; } void dispatch_events(common::Bag < Time > bag, typename Time::type t) { for (auto & ymsg : bag) { typename common::Links < Time >::Result result_model = _link_list.find(ymsg.get_model(), ymsg.get_port_index()); for (typename common::Links < Time >:: const_iterator it = result_model.first; it != result_model.second; ++it) { // event on output port of coupled Model if (it->second.get_model() == common::GraphManager < Time >::_coordinator) { dispatch_events_to_parent(it->second, ymsg.data(), t); } else { // event on input port of internal model it->second.get_model()->post_event( t, common::ExternalEvent < Time >( it->second, ymsg.data())); } } } } virtual void dispatch_events_to_parent(common::Node < Time > node, const common::Value& content, typename Time::type t) { common::Bag < Time > ymessages; ymessages.push_back( common::ExternalEvent