source: XMLIO_V2/dev/dev_rv/src/XMLIO/date.hpp @ 116

Last change on this file since 116 was 116, checked in by hozdoba, 14 years ago
File size: 7.0 KB
Line 
1#ifndef __XMLIO_DATE__
2#define __XMLIO_DATE__
3
4namespace XMLIOSERVER
5{
6   class AbstractCalendar;
7
8   typedef long long int Time;
9
10   typedef struct _duration
11   {
12      /// Méthodes associées à la structure Duration.
13      friend std::ostream& operator<<(std::ostream& out, const struct _duration& d)
14      {
15         out << d.year  << "y. " << d.month  << "mo. "   <<  d.day   << "d. "
16             << d.hour  << "h. " << d.minute << "min. " << d.second << "sec. ";
17         return (out);
18      }
19
20      struct _duration& resolve(void)
21      {
22         // Simplification de l'écriture des minutes.
23         second += modf(minute, &minute) * 60.;
24         minute += int(second)/60; second = int(second)%60;
25         // Simplification de l'écriture des heures.
26         minute += modf(hour  , &hour  ) * 60.;
27         hour   += int(minute)/60; minute = int(minute)%60;
28         // Simplification de l'écriture des jours.
29         hour   += modf(day   , &day   ) * 24.;
30         day    += int(hour)  /24; hour   = int(hour)  %24;
31         // > Aucune équivalence jour - mois fixée par avance. //
32         // Simplification de l'écriture des années.
33         month  += modf(year , &year   ) * 12.;
34         year   += int(month) /12; month  = int(month) %12;
35         return (*this);
36      }
37
38      /// Propriétés associées à la structure.
39      double year, month, day, hour, minute, second;
40
41   } Duration;
42
43   /// Opérateurs associés à la structure Duration.
44   Duration operator*(const Duration& ddr, const double& scal)
45   {
46      Duration dur(ddr);
47      dur.year *= scal;  dur.month  *= scal; dur.day    *= scal;
48      dur.hour *= scal;  dur.minute *= scal; dur.second *= scal;
49      return (dur.resolve());
50   }
51
52   Duration operator*(const double& scal, const Duration& ddr)
53   { return (ddr * scal); }
54
55   Duration operator-(const Duration& ddr, const Duration& dr)
56   {
57      Duration dur(ddr);
58      dur.year -= dr.year;  dur.month  -= dr.month ; dur.day    -= dr.day;
59      dur.hour -= dr.hour;  dur.minute -= dr.minute; dur.second -= dr.second;
60      return (dur.resolve());
61   }
62
63   Duration operator+(const Duration& ddr, const Duration& dr)
64   {
65      Duration dur(ddr);
66      dur.year += dr.year;  dur.month  += dr.month ; dur.day    += dr.day;
67      dur.hour += dr.hour;  dur.minute += dr.minute; dur.second += dr.second;
68      return (dur.resolve());
69   }
70
71   // Les principales durées constantes : année, mois, jour, ...
72   static const Duration Year   = {1.0, 0.0, 0.0, 0.0, 0.0, 0.0},
73                         Month  = {0.0, 1.0, 0.0, 0.0, 0.0, 0.0},
74                         Day    = {0.0, 0.0, 1.0, 0.0, 0.0, 0.0},
75                         Hour   = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0},
76                         Minute = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0},
77                         Second = {0.0, 0.0, 0.0, 0.0, 0.0, 1.0};
78
79   ///////////////////////////////////////////////////
80
81   class Date
82   {
83      public :
84
85         Date(const AbstractCalendar& cal, int yr = 0, int mth = 0, int d = 0, int hr = 0, int min = 0 , int sec = 0) : relCalendar(cal)
86            , year(yr), month(mth), day(d), hour(hr), minute(min), second(sec)
87         {/* Ne rien faire de plus */}
88
89         Date(const Date& d) : relCalendar(d.relCalendar)
90            , year(d.year), month(d.month), day(d.day), hour(d.hour), minute(d.minute), second(d.second)
91         {/* Ne rien faire de plus */}
92
93         operator Time(void); // Retourne le nombre de secondes écoulées depuis la date initiale définie dans le calendrier.
94
95         friend std::ostream& operator<<(std::ostream& out, const Date& d)
96         {
97            out << d.month << "/"   << d.day    << "/"     << d.year   << " - "
98                << d.hour  << "h. " << d.minute << "min. " << d.second << "sec. ";
99            return (out);
100         }
101
102         friend std::istream& operator>>(std::istream& in, Date& d) // Non testée.
103         {
104            char c = '/'; // Le caractÚre c est utilisé pour "recueillir" le séparateur "/".
105            in >> d.month >> c >> d.day >> c  >> d.year;
106            in.seekg(3, std::ios_base::cur); // On passe la lecture de la chaîne " - "
107            in >> d.hour;   in.seekg(3, std::ios_base::cur); // On passe la lecture de la chaîne "h. "
108            in >> d.minute; in.seekg(5, std::ios_base::cur); // On passe la lecture de la chaîne "min. "
109            in >> d.second; in.seekg(5, std::ios_base::cur); // On passe la lecture de la chaîne "sec. "
110            return (in);
111         }
112
113         /// Divers accesseurs.
114         int getYear  (void) const { return (year); }
115         int getMonth (void) const { return (month); }
116         int getDay   (void) const { return (day); }
117         int getHour  (void) const { return (hour); }
118         int getMinute(void) const { return (minute); }
119         int getSecond(void) const { return (second); }
120
121         void setMonth (int newmonth) { month = newmonth; }
122         void setYear  (int newyear)  { year  = newyear; }
123
124         const AbstractCalendar& getRelCalendar(void) const { return (relCalendar); }
125
126         ~Date()
127         {/* Ne rien faire de plus */}
128
129      protected :
130
131      private :
132
133         const AbstractCalendar& relCalendar; // Calendrier lié à la Date.
134         int year, month, day, hour, minute, second; // Année, mois, ...
135
136   }; // class Date
137
138   Duration operator-(const Date& dt0, const Date& dt1)
139   {
140      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
141      Duration dur =
142      { dt0.getYear() - dt1.getYear(), dt0.getMonth()  - dt1.getMonth() , dt0.getDay()    - dt1.getDay(),
143        dt0.getHour() - dt1.getHour(), dt0.getMinute() - dt1.getMinute(), dt0.getSecond() - dt1.getSecond() };
144      return (dur.resolve());
145   }
146
147   /// Les opérateurs de comparaison. (Non testés pour le moment)
148   bool operator==(const Date& dt0, const Date& dt1)
149   {
150      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
151      return ((dt0.getYear() == dt1.getYear()) && (dt0.getMonth()  == dt1.getMonth())  && (dt1.getDay()    == dt0.getDay()) &&
152              (dt0.getHour() == dt1.getHour()) && (dt0.getMinute() == dt1.getMinute()) && (dt1.getSecond() == dt0.getSecond()));
153   }
154
155   bool operator<(const Date& dt0, const Date& dt1)
156   {
157      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
158      if (dt0.getYear()   < dt1.getYear())   return true; if (dt0.getMonth()  < dt1.getMonth())  return true;
159      if (dt0.getDay()    < dt1.getDay())    return true; if (dt0.getHour()   < dt1.getHour())   return true;
160      if (dt0.getMinute() < dt1.getMinute()) return true; if (dt0.getSecond() < dt1.getSecond()) return true;
161      return false;
162   }
163
164   bool operator!=(const Date& dt0, const Date& dt1) { return !(dt1 == dt0); }
165   bool operator> (const Date& dt0, const Date& dt1) { return (dt1 < dt0); }
166   bool operator>=(const Date& dt0, const Date& dt1) { return ((dt1 > dt0) || (dt1 == dt0)); }
167   bool operator<=(const Date& dt0, const Date& dt1) { return ((dt1 < dt0) || (dt1 == dt0)); }
168
169} // namespace XMLIOSERVER
170
171#endif // __XMLIO_DATE__
Note: See TracBrowser for help on using the repository browser.