Ignore:
Timestamp:
07/20/10 10:09:45 (14 years ago)
Author:
hozdoba
Message:

Réorganisation du code gérant le calendrier.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp

    r117 r118  
    22#define __XMLIO_CALENDAR__ 
    33 
    4 #include "date.hpp" 
    5  
    64namespace XMLIOSERVER 
    75{ 
    8  
    9    typedef enum _monthEnum 
    10    {  JAN = 1, FEB = 2, MAR = 3, APR = 4 , MAY = 5 , JUN = 6 , 
    11       JUL = 7, AUG = 8, SEP = 9, OCT = 10, NOV = 11, DEC = 12  } MonthEnum; 
    12  
    13    class AbstractCalendar : public AbstractObject 
    14    { 
    15       public : 
    16  
    17          virtual int getMonthLength(const Date& d) const 
    18          { // Retourne la durée du mois en jour. 
    19             static const int NoLeapMonthLength[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
    20             return (NoLeapMonthLength[d.getMonth()-1]); 
    21          } 
    22  
    23          virtual int getYearTotalLength(const Date& d) const { return (365 * 86400); } // Retourne la durée d'une année en seconde. 
    24  
    25          virtual int getYearLength(void)   const { return (12); } // Retourne la durée d'une année en mois. 
    26          virtual int getDayLength(void)    const { return (24); } // Retourne la durée d'un jour en heures. 
    27          virtual int getHourLength(void)   const { return (60); } // Retourne la durée d'une heure en minute. 
    28          virtual int getMinuteLength(void) const { return (60); } // Retourne la durée d'une minute en secondes. 
    29  
    30          virtual int getNbSecond(const Date& d) const 
    31          { // Retourne le nombre de secondes écoulées depuis le début de l'année. 
    32             Date _d0(d); int  nbday = 0; 
    33  
    34             for(_d0.setMonth(1); _d0.getMonth() < d.getMonth(); _d0.setMonth(_d0.getMonth()+1)) 
    35                nbday += getMonthLength(_d0); 
    36             //std::cout << "nombre de jours : " << nbday << std::endl; 
    37             return ((((nbday + d.getDay()) * getDayLength() + d.getHour()) 
    38                      * getHourLength() + d.getMinute()) * getMinuteLength() + d.getSecond()); 
    39          } 
    40  
    41          virtual string getMonthName(int _mi) const 
    42          { 
    43             static const string Monthname_str[] = 
    44                { "january", "february", "march"    , "april"  , "may"     , "june"    , 
    45                  "july"   , "august"  , "september", "october", "november", "december" }; 
    46             return(Monthname_str[_mi-1]); 
    47          } 
    48  
    49          virtual const string getMonthShortName(int _mi) const 
    50          { string value = getMonthName(_mi); value.resize(3); return (value); } 
    51  
    52          const Date& getInitDate(void) const { return(initDate); } 
    53          Date& getCurrentDate(void) { return(currentDate); } 
    54  
    55          virtual ~AbstractCalendar() 
    56          {/* Ne rien faire de plus */} 
    57  
    58       protected : 
    59  
    60          AbstractCalendar() : AbstractObject(), initDate(*this), currentDate(initDate) 
    61          {/* Ne rien faire de plus */} 
    62          AbstractCalendar(const string& _id) : AbstractObject(_id), initDate(*this), currentDate(initDate) 
    63          {/* Ne rien faire de plus */} 
    64  
    65       private : 
    66  
    67          const Date initDate; 
    68          Date currentDate; 
    69  
    70    }; // class AbstractCalendar 
    71  
    726   class JulianCalendar : public AbstractCalendar 
    737   { 
     
    14175         { if (d.getMonth() == 2) return (29); return AbstractCalendar::getMonthLength(d); } 
    14276 
    143          virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } // Retourne la durée d'une année en seconde. 
     77         virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } 
    14478 
    14579         virtual ~AllLeapCalendar() 
     
    15488         {/* Ne rien faire de plus */} 
    15589 
    156          virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } // Retourne la durée d'une année en seconde. 
     90         virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } 
    15791         virtual int getMonthLength(const Date& d) const { return (30); } 
    15892 
     
    16296   }; // class D360Calendar 
    16397 
    164  
    165    //////////////////////////////////////// 
    166  
    167    Duration& Duration::resolve(const AbstractCalendar& c) 
    168    { 
    169       // Simplification de l'écriture des minutes. 
    170       second += modf(minute, &minute) * (float)c.getMinuteLength(); 
    171       minute += int(second)/c.getMinuteLength(); second = int(second)%c.getMinuteLength(); 
    172  
    173       // Simplification de l'écriture des heures. 
    174       minute += modf(hour , &hour) * (float)c.getHourLength(); 
    175       hour   += int(minute)/c.getHourLength(); minute = int(minute)%c.getHourLength(); 
    176  
    177       // Simplification de l'écriture des jours. 
    178       hour   += modf(day, &day) * (float)c.getDayLength(); 
    179       day    += int(hour)  /c.getDayLength(); hour   = int(hour)%c.getDayLength(); 
    180  
    181       // > Aucune équivalence jour - mois fixée par avance. // 
    182  
    183       // Simplification de l'écriture des années. 
    184       month  += modf(year, &year) * (float)c.getYearLength(); 
    185       year   += int(month) /c.getYearLength(); month  = int(month)%c.getYearLength(); 
    186       return (*this); 
    187    } 
    188  
    189    Date::operator Time(void) // Non vérifiée, pas optimisée ... 
    190    { 
    191       // Todo : Tester si la date courante est supérieure à la date initiale. 
    192       Time retvalue = - relCalendar.getNbSecond(relCalendar.getInitDate()) 
    193                       + relCalendar.getNbSecond(*this); 
    194  
    195       if ((relCalendar.getId().compare("D360")    == 0) || 
    196           (relCalendar.getId().compare("AllLeap") == 0) || 
    197           (relCalendar.getId().compare("NoLeap")  == 0)) 
    198       return (retvalue + (getYear() - relCalendar.getInitDate().getYear()) * relCalendar.getYearTotalLength(*this)); 
    199  
    200       for(Date _d(relCalendar.getInitDate()); _d.getYear() < getYear(); _d.setYear(_d.getYear()+1)) 
    201          retvalue += relCalendar.getYearTotalLength(_d); 
    202       return (retvalue); 
    203    } 
    204  
    205    Date operator+(const Date& dt, const Duration& dr) // Non testée. 
    206    { 
    207       Duration drr (dr); 
    208       int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0; 
    209       const AbstractCalendar& c = dt.getRelCalendar(); 
    210  
    211       drr.resolve(dt.getRelCalendar()); 
    212  
    213       // Ajustement des minutes par rapport aux secondes. 
    214       second += dt.getSecond() + drr.second; 
    215       if (second <  0) { minute --; second += c.getMinuteLength(); } 
    216       if (second >= c.getMinuteLength()) { minute ++; second -= c.getMinuteLength(); } 
    217  
    218       // Ajustement des heures en fonction des minutes. 
    219       minute += dt.getMinute() + drr.minute; 
    220       if (minute < 0) { hour --; minute += c.getHourLength(); } 
    221       if (minute >= c.getHourLength()) { hour ++; minute -= c.getHourLength(); } 
    222  
    223       // Ajustement des jours en fonction des heures. 
    224       hour += dt.getHour() + drr.hour; 
    225       if (hour <  0) { drr.day --; hour += c.getDayLength(); } 
    226       if (hour >= c.getDayLength()) { drr.day ++; hour -= c.getDayLength(); } 
    227  
    228       // Ajustement des mois en fonction des jours. 
    229       int signVal = drr.day/fabs(drr.day); 
    230       Date dtt(dt); dtt.addMonth (signVal); 
    231  
    232       for(; c.getMonthLength(dtt) < fabs(drr.day); dtt.addMonth (signVal)) 
    233       { drr.day -= signVal * c.getMonthLength(dtt); drr.month += signVal; } 
    234  
    235       day += dt.getDay() + drr.day; 
    236       if (day <  0) { drr.month --; day += c.getMonthLength(dtt); } 
    237       if (day >= c.getMonthLength(dtt)) { drr.month ++; day -= c.getMonthLength(dtt); } // << ProblÚme ici 
    238       if (day == 0) day = c.getMonthLength(dtt); 
    239  
    240       drr.resolve(dt.getRelCalendar()); 
    241  
    242       // Ajustement des années en fonction des mois. 
    243       month += dt.getMonth() + drr.month; 
    244       if (month <  0) { year --; month += c.getYearLength(); } 
    245       if (month >= c.getYearLength()) { year ++; month -= c.getYearLength(); } 
    246       if (month == 0) month = c.getYearLength(); 
    247  
    248       year += dt.getYear() + drr.year; 
    249  
    250       return (Date(dt.getRelCalendar(), year, month, day, hour, minute, second)); 
    251    } 
    252  
    253    Date operator-(const Date& dt, const Duration& dr) { return (dt + (-dr)); } 
    254  
    255  
    25698} // namespace XMLIOSERVER 
    25799 
Note: See TracChangeset for help on using the changeset viewer.