/** * @file tests/mixed/graph_manager.hpp * @author The PARADEVS Development Team * See the AUTHORS or Authors.txt file */ /* * PARADEVS - the multimodeling and simulation environment * This file is a part of the PARADEVS environment * * Copyright (C) 2013 ULCO http://www.univ-litoral.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 TESTS_MIXED_GRAPH_MANAGER_HPP #define TESTS_MIXED_GRAPH_MANAGER_HPP 1 #include #include #include #include #include #include #include #include #include #include namespace paradevs { namespace tests { namespace mixed { struct LastBagPolicy { const common::Bag < MyTime >& bag() const { return _bag; } virtual void operator()(typename MyTime::type /* t */, const common::ExternalEvent < MyTime >& event, typename MyTime::type /* tl */, typename MyTime::type /* tn */) { _bag.clear(); _bag.push_back(event); } private: common::Bag < MyTime > _bag; }; struct IgnorePolicy { const common::Bag < MyTime >& bag() const { return _bag; } virtual void operator()(typename MyTime::type /* t */, const common::ExternalEvent < MyTime >& /* event */, typename MyTime::type /* tl */, typename MyTime::type /* tn */) { } private: common::Bag < MyTime > _bag; }; class S1GraphManager : public pdevs::GraphManager < MyTime, paradevs::common::NoParameters > { public: S1GraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : pdevs::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters), a("a1", NoParameters()), b("b1", NoParameters()) { add_child(&a); add_child(&b); add_link(&a, "out", &b, "in"); add_link(&b, "out", coordinator, "out"); } virtual ~S1GraphManager() { } private: pdevs::Simulator < MyTime, A1, NoParameters > a; pdevs::Simulator < MyTime, B1, NoParameters > b; }; class S2GraphManager : public dtss::GraphManager < MyTime, paradevs::common::NoParameters > { public: S2GraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : dtss::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters), a("a2", 20, NoParameters()), b("b2", 20, NoParameters()) { add_child(&a); add_child(&b); add_link(&a, "out", &b, "in"); add_link(coordinator, "in", &a, "in"); } virtual ~S2GraphManager() { } private: dtss::Simulator < MyTime, A2, NoParameters > a; dtss::Simulator < MyTime, B2, NoParameters > b; }; class RootGraphManager : public pdevs::GraphManager < MyTime, paradevs::common::NoParameters > { public: RootGraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : pdevs::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters), S1("S1", paradevs::common::NoParameters(), paradevs::common::NoParameters()), S2("S2", paradevs::dtss::Parameters < MyTime >(20), paradevs::common::NoParameters()) { add_child(&S1); add_child(&S2); add_link(&S1, "out", &S2, "in"); } virtual ~RootGraphManager() { } private: pdevs::Coordinator < MyTime, paradevs::common::scheduler::VectorScheduler < MyTime >, S1GraphManager, paradevs::common::NoParameters, paradevs::common::NoParameters > S1; dtss::Coordinator < MyTime, LastBagPolicy, S2GraphManager, paradevs::dtss::Parameters < MyTime >, paradevs::common::NoParameters > S2; }; template < int size > class LinearGraphManager : public pdevs::GraphManager < MyTime, paradevs::common::NoParameters > { public: LinearGraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : pdevs::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters) { for (unsigned int i = 1; i <= size; ++i) { std::ostringstream ss; ss << "a" << i; _models.push_back( new pdevs::Simulator < MyTime, Beep, NoParameters >( ss.str(), NoParameters())); } for (unsigned int i = 0; i < size; ++i) { add_child(_models[i]); } for (unsigned int i = 0; i < size - 1; ++i) { add_link(_models[i], "out", _models[i + 1], "in"); } } virtual ~LinearGraphManager() { for (unsigned int i = 0; i < size; ++i) { delete _models[i]; } } private: std::vector < pdevs::Simulator < MyTime, Beep, NoParameters >* > _models; }; class Linear2GraphManager : public pdevs::GraphManager < MyTime, paradevs::common::NoParameters > { public: Linear2GraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : pdevs::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters) { for (unsigned int i = 1; i <= 100; ++i) { std::ostringstream ss; ss << "a" << i; _models.push_back( new pdevs::Simulator < MyTime, Beep, NoParameters >( ss.str(), NoParameters())); } for (unsigned int i = 0; i < 100; ++i) { add_child(_models[i]); } for (unsigned int i = 0; i < 99; ++i) { add_link(_models[i], "out", _models[i + 1], "in"); } add_link(coordinator, "in", _models[0], "in"); add_link(_models[49], "out", coordinator, "out"); } virtual ~Linear2GraphManager() { for (unsigned int i = 0; i < 100; ++i) { delete _models[i]; } } private: std::vector < pdevs::Simulator < MyTime, Beep, NoParameters >* > _models; }; class Root2GraphManager : public pdevs::GraphManager < MyTime, paradevs::common::NoParameters > { public: Root2GraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : pdevs::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters), S1("S1", paradevs::common::NoParameters(), paradevs::common::NoParameters()), S2("S2", paradevs::common::NoParameters(), paradevs::common::NoParameters()) { add_child(&S1); add_child(&S2); add_link(&S1, "out", &S2, "in"); } virtual ~Root2GraphManager() { } private: pdevs::Coordinator < MyTime, paradevs::common::scheduler::HeapScheduler < MyTime >, Linear2GraphManager, paradevs::common::NoParameters, paradevs::common::NoParameters > S1; pdevs::Coordinator < MyTime, paradevs::common::scheduler::HeapScheduler < MyTime >, Linear2GraphManager, paradevs::common::NoParameters, paradevs::common::NoParameters > S2; }; class Root3GraphManager : public pdevs::GraphManager < MyTime, paradevs::common::NoParameters > { public: Root3GraphManager(common::Coordinator < MyTime >* coordinator, const paradevs::common::NoParameters& parameters) : pdevs::GraphManager < MyTime, paradevs::common::NoParameters >( coordinator, parameters), S1("S1", paradevs::common::NoParameters(), paradevs::common::NoParameters()), S2("S2", paradevs::common::NoParameters(), paradevs::common::NoParameters()) { add_child(&S1); add_child(&S2); add_link(&S1, "out", &S2, "in"); } virtual ~Root3GraphManager() { } private: pdevs::Coordinator < MyTime, paradevs::common::scheduler::VectorScheduler < MyTime >, Linear2GraphManager, paradevs::common::NoParameters, paradevs::common::NoParameters > S1; pdevs::Coordinator < MyTime, paradevs::common::scheduler::VectorScheduler < MyTime >, Linear2GraphManager, paradevs::common::NoParameters, paradevs::common::NoParameters > S2; }; } } } // namespace paradevs tests mixed #endif