source: XMLIO_V2/dev/common/src/xmlio/calendar_util.cpp @ 219

Last change on this file since 219 was 219, checked in by hozdoba, 13 years ago

Préparation nouvelle arborescence

File size: 5.8 KB
Line 
1#include "calendar_util.hpp"
2
3namespace xmlioserver
4{
5   namespace date
6   {
7      /// ////////////////////// Définitions ////////////////////// ///
8
9      CDuration operator*(const double & scal, const CDuration & ddr)
10      { return (ddr * scal); }
11
12      CDuration operator-(const CDuration & ddr , const CDuration & dr)
13      {
14         CDuration dur(ddr);
15         dur.year -= dr.year;  dur.month  -= dr.month ; dur.day    -= dr.day;
16         dur.hour -= dr.hour;  dur.minute -= dr.minute; dur.second -= dr.second;
17         return (dur);
18      }
19
20      CDuration operator+(const CDuration & ddr , const CDuration & dr)
21      {
22         CDuration dur(ddr);
23         dur.year += dr.year;  dur.month  += dr.month ; dur.day    += dr.day;
24         dur.hour += dr.hour;  dur.minute += dr.minute; dur.second += dr.second;
25         return (dur);
26      }
27
28      CDuration operator*(const CDuration & ddr , const double & scal)
29      {
30         CDuration dur(ddr);
31         dur.year *= scal;  dur.month  *= scal; dur.day    *= scal;
32         dur.hour *= scal;  dur.minute *= scal; dur.second *= scal;
33         return (dur);
34      }
35
36      CDuration operator-(const CDuration & ddr)
37      {
38         CDuration dur(ddr);
39         dur.year = -dur.year;  dur.month  = -dur.month ; dur.day    = -dur.day;
40         dur.hour = -dur.hour;  dur.minute = -dur.minute; dur.second = -dur.second;
41         return (dur);
42      }
43
44      //-----------------------------------------------------------------
45
46      CDate operator+(const CDate & dt, const CDuration & dr)
47      {
48         CDuration drr (dr);
49         int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
50         const CCalendar & c = dt.getRelCalendar();
51
52         drr.resolve(dt.getRelCalendar());
53
54         // Ajustement des minutes par rapport aux secondes.
55         second += dt.getSecond() + drr.second;
56         if (second <  0) { minute --; second += c.getMinuteLength(); }
57         if (second >= c.getMinuteLength()) { minute ++; second -= c.getMinuteLength(); }
58
59         // Ajustement des heures en fonction des minutes.
60         minute += dt.getMinute() + drr.minute;
61         if (minute < 0) { hour --; minute += c.getHourLength(); }
62         if (minute >= c.getHourLength()) { hour ++; minute -= c.getHourLength(); }
63
64         // Ajustement des jours en fonction des heures.
65         hour += dt.getHour() + drr.hour;
66         if (hour <  0) { drr.day --; hour += c.getDayLength(); }
67         if (hour >= c.getDayLength()) { drr.day ++; hour -= c.getDayLength(); }
68
69         // Ajustement des mois en fonction des jours.
70         int signVal = drr.day/fabs(drr.day);
71         CDate dtt(dt); dtt.addMonth (signVal);
72
73         for(; c.getMonthLength(dtt) < fabs(drr.day); dtt.addMonth (signVal))
74         { drr.day -= signVal * c.getMonthLength(dtt); drr.month += signVal; }
75
76         day += dt.getDay() + drr.day;
77         if (day <  0) { drr.month --; day += c.getMonthLength(dtt); }
78         if (day >= c.getMonthLength(dtt)) { drr.month ++; day -= c.getMonthLength(dtt); } // << ProblÚme ici
79         if (day == 0) day = c.getMonthLength(dtt);
80
81         drr.resolve(dt.getRelCalendar());
82
83         // Ajustement des années en fonction des mois.
84         month += dt.getMonth() + drr.month;
85         if (month <  0) { year --; month += c.getYearLength(); }
86         if (month >= c.getYearLength()) { year ++; month -= c.getYearLength(); }
87         if (month == 0) month = c.getYearLength();
88
89         year += dt.getYear() + drr.year;
90
91         return (CDate(dt.getRelCalendar(), year, month, day, hour, minute, second));
92      }
93
94      CDate operator-(const CDate & dt, const CDuration & dr) { return (dt + (-dr)); }
95
96      //-----------------------------------------------------------------
97
98      CDuration operator-(const CDate & dt0, const CDate & dt1)
99      {
100         // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
101         CDuration dur =
102         { dt0.getYear() - dt1.getYear(), dt0.getMonth()  - dt1.getMonth() , dt0.getDay()    - dt1.getDay(),
103           dt0.getHour() - dt1.getHour(), dt0.getMinute() - dt1.getMinute(), dt0.getSecond() - dt1.getSecond() };
104         return (dur.resolve(dt0.getRelCalendar()));
105      }
106
107      //-----------------------------------------------------------------
108
109      /// Les opérateurs de comparaison. (Non testés pour le moment)
110      bool operator==(const CDate& dt0, const CDate& dt1)
111      {
112         // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
113         return ((dt0.getYear() == dt1.getYear()) && (dt0.getMonth()  == dt1.getMonth())  && (dt1.getDay()    == dt0.getDay()) &&
114                 (dt0.getHour() == dt1.getHour()) && (dt0.getMinute() == dt1.getMinute()) && (dt1.getSecond() == dt0.getSecond()));
115      }
116
117      bool operator< (const CDate& dt0, const CDate& dt1)
118      {
119         // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
120         if (dt0.getYear()   < dt1.getYear())   return true; if (dt0.getMonth()  < dt1.getMonth())  return true;
121         if (dt0.getDay()    < dt1.getDay())    return true; if (dt0.getHour()   < dt1.getHour())   return true;
122         if (dt0.getMinute() < dt1.getMinute()) return true; if (dt0.getSecond() < dt1.getSecond()) return true;
123         return false;
124      }
125
126      //-----------------------------------------------------------------
127
128      bool operator!=(const CDate & dt0, const CDate & dt1){ return !(dt1 == dt0); }
129      bool operator> (const CDate & dt0, const CDate & dt1){ return (dt1 < dt0); }
130      bool operator>=(const CDate & dt0, const CDate & dt1){ return ((dt0 > dt1) || (dt1 == dt0)); }
131      bool operator<=(const CDate & dt0, const CDate & dt1){ return ((dt0 < dt1) || (dt1 == dt0)); }
132
133      ///----------------------------------------------------------------
134
135   } // namespace date
136} // namespace xmlioserver
137
138
139
140
141
142
Note: See TracBrowser for help on using the repository browser.