// ferrysim.h // ---------------------------------------------------------------------- // // CSE 143 // Homework 4 // http://www.cs.washington.edu/education/courses/143/00su/homework/ // 21 Jul 2000, Ken Yasuhara #ifndef _FERRYSIM_H_ #define _FERRYSIM_H_ #include #include #include "carqueue.h" #include "ferrysimeventlist.h" // The following class forward is needed because classes FerrySimView and // FerrySim reference each other. class FerrySimView; const int CAR_TICKETING_TIME = 2; const int CAR_BOARDING_TIME = 1; const int FARE_PER_CAR_WITH_DRIVER = 6; const int FARE_PER_ADDITIONAL_PASSENGER = 2; class FerrySim { public: // carDataFile should contain car arrival events; assoc. w/ carDataStream // ferryDataFile should contain ferry schedule; assoc. w/ ferryDataStream FerrySim(const char carDataFile[], const char ferryDataFile[]); // deletes any remaining Car, Ferry instances ~FerrySim(); // start simulation void run(); // compute cost of ticket for this car and its passengers int computeFare(const Car *carPtr) const; // statistics; for visualization int getCurrentTime() const { return currentTime; } int getFerryDepartureCount() const { return ferryDepartureCount; } int getTotalTicketRevenue() const { return totalTicketRevenue; } // for visualization const CarQueue &getTicketingQueue() const { return ticketingQ; } const CarQueue &getBoardingQueue() const { return boardingQ; } bool isFerryDocked() const { return (dockedFerryPtr != NULL); } int getDockedFerryDepartureTime() const { return dockedFerryDepartureTime; } private: // reads next car arrival from carDataStream, adds it to event list; // returns true if new arrival event added to list; // allocates a Car instance bool generateCarArrival(); // reads ferry arrival from ferryDataStream, adds it to event list; // returns true if new arrival event added to list; // allocates a Ferry instance bool generateFirstFerryArrival(); // based on arrival time of currently docked ferry and ferry's time // between arrivals, adds ferry arrival event to event list void generateNextFerryArrival(); // adds event for given car (should be first in ticketingQ) // to be ticketed void generateCarTicketing(Car *carPtr); // adds event for given car (should be first in boardingQ) // to board ferry currently at dock bool generateCarBoarding(Car *carPtr); // adds event for currently docked ferry to depart void generateFerryDeparture(); // processCarBoarding deletes Car instance // processFerryDeparture deletes a Ferry instance void processCarArrival(const FerrySimEvent &event); void processCarTicketing(const FerrySimEvent &event); void processFerryArrival(const FerrySimEvent &event); void processCarBoarding(const FerrySimEvent &event); void processFerryDeparture(const FerrySimEvent &event); // // internal representation // ifstream carDataStream, ferryDataStream; int currentTime; CarQueue ticketingQ; CarQueue boardingQ; FerrySimEventList eventList; Ferry *dockedFerryPtr; int dockedFerryDepartureTime; // statistics int ferryDepartureCount; double averageCapacityBoarded; int totalTicketRevenue; // in dollars // graphical visualization FerrySimView *viewPtr; // toggle debugging text bool debugOutput; }; #endif // _FERRYSIM_H_