#ifndef __XMLIO_ABSTRACT_CALENDAR__ #define __XMLIO_ABSTRACT_CALENDAR__ namespace XMLIOSERVER { typedef enum _monthEnum { JAN = 1, FEB = 2, MAR = 3, APR = 4 , MAY = 5 , JUN = 6 , JUL = 7, AUG = 8, SEP = 9, OCT = 10, NOV = 11, DEC = 12 } MonthEnum; class AbstractCalendar : public AbstractObject { public : friend std::ostream& operator<<(std::ostream& out, AbstractCalendar& c) { out << "[type: " << c.getId() << ", start: " << c.getInitDate() << ", current: " << c.getCurrentDate() << "]"; return (out); } virtual string getType(void) const { return (string(this->getId())); } const Date& getInitDate(void) const { return(initDate); } Date& getCurrentDate(void) { return(currentDate); } void setTimeStep(const Duration& dr) { timestep = dr; } const Duration& getTimeStep(void) const { return (timestep); } Date& update(void); public : /* virtual */ virtual int getMonthLength(const Date& d) const { // Retourne la durée du mois en jour. static const int NoLeapMonthLength[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return (NoLeapMonthLength[d.getMonth()-1]); } virtual int getYearTotalLength(const Date& d) const { return (365 * 86400); } // Retourne la durée d'une année en seconde. virtual int getYearLength (void) const { return (12); } // Retourne la durée d'une année en mois. virtual int getDayLength (void) const { return (24); } // Retourne la durée d'un jour en heures. virtual int getHourLength (void) const { return (60); } // Retourne la durée d'une heure en minute. virtual int getMinuteLength(void) const { return (60); } // Retourne la durée d'une minute en secondes. virtual int getNbSecond(const Date& d) const { // Retourne le nombre de secondes écoulées depuis le début de l'année. Date _d0(d); int nbday = 0; for(_d0.setMonth(1); _d0.getMonth() < d.getMonth(); _d0.setMonth(_d0.getMonth()+1)) nbday += getMonthLength(_d0); return ((((nbday + d.getDay()) * getDayLength() + d.getHour()) * getHourLength() + d.getMinute()) * getMinuteLength() + d.getSecond()); } virtual string getMonthName(int _mi) const { static const string Monthname_str[] = { "january", "february", "march" , "april" , "may" , "june" , "july" , "august" , "september", "october", "november", "december" }; return(Monthname_str[_mi-1]); } virtual const string getMonthShortName(int _mi) const { string value = getMonthName(_mi); value.resize(3); return (value); } virtual ~AbstractCalendar(void) { /* Ne rien faire de plus */ } protected : AbstractCalendar(void) : AbstractObject(), initDate(*this), currentDate(initDate), timestep(Hour) { /* Ne rien faire de plus */ } AbstractCalendar(const string& _id, int yr = 0, int mth = 1, int d = 1, int hr = 0, int min = 0 , int sec = 0) : AbstractObject(_id), initDate(*this, yr, mth, d, hr, min, sec), currentDate(initDate), timestep(Hour) { /* Ne rien faire de plus */ } AbstractCalendar(const string& _id, const string& dateStr) : AbstractObject(_id), initDate(Date::FromString(dateStr, *this)), currentDate(initDate), timestep(Hour) { /* Ne rien faire de plus */ } private : const Date initDate; Date currentDate; Duration timestep; }; // class AbstractCalendar } // namespace XMLIOSERVER #endif // __XMLIO_ABSTRACT_CALENDAR__