// src/backend/history.cc - Copyright 2005, 2006, University // of Padova, dept. of Pure and Applied // Mathematics // // This file is part of SGPEMv2. // // This 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 2 of the License, or // (at your option) any later version. // // SGPEMv2 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 SGPEMv2; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "history.hh" using namespace std; using namespace sgpem; using namespace memory; //History::instance; //static object History History::_instance(10); //dummy parameter History::History(int) //private constructor. The parameter is discarded :_total_time_elapsed(0) { } History& History::getInstance() { return _instance; } /** Returns a pointer to a copy of the SchedulableStatus object relative to this instant. It can be NULL if time is out of range or if the SimulationStatus object relative to this instant has no running entities. */ smart_ptr History::getScheduledAt (int time) { if (time >= _total_time_elapsed || time < 0) //out of range return smart_ptr(NULL); return getSimulationStatusAt(time)->getRunning(); } /** Returns a pointer to a copy of the SimulationStatus object relative to this instant or NULL if time is out of range. */ smart_ptr History::getSimulationStatusAt (int time) { if (time >= _total_time_elapsed || time < 0) //out of range return smart_ptr(NULL); int trascorso = 0; for(vector::iterator i=_slices.begin(); i < _slices.end(); i++) if (time < trascorso + i->getDuration()) //FOUND!! return smart_ptr(new SimulationStatus(i->getSimulationStatus())); else //Go on... trascorso += i->getDuration(); //never reached return smart_ptr(NULL); } int History::getCurrentTime() { return _total_time_elapsed; } /** Appends to the history a SimulationStatus creating a Slice with duration of 1 instant. Calls the method notify() in quality of ObservedSubject, updating all observers. */ void History::enqueueSlice (SimulationStatus status) { if (_slices.size() == 0){ _slices.push_back(Slice(0, 1, status)); _total_time_elapsed = 1; notify(); return; } //check the last slice Slice& last = _slices[_slices.size()-1]; if (last.getSimulationStatus() == status) //increments the duration by ONE unit { last.setDuration(last.getDuration()+1); } else //insert a new slice CONTIGUOUS to the last one { _slices.push_back(Slice(last.getStartedAt() + last.getDuration(), 1, status)); } _total_time_elapsed++; //one instant is passed... notify(); } /** Removes all the informations about the simulation following the specified instant. */ void History::truncateAt (int instant) { //reach the instant vector::iterator i = _slices.begin(); for (int k=0; k < instant; k++) i++; //replaces the current vector with the "trimmed" one. _slices = vector(_slices.begin(),i); _total_time_elapsed = instant; }