Changeset 118
- Timestamp:
- 07/20/10 10:09:45 (14 years ago)
- Location:
- XMLIO_V2/dev/dev_rv/src/XMLIO
- Files:
-
- 3 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
XMLIO_V2/dev/dev_rv/src/XMLIO/c_interface.cpp
r117 r118 28 28 Date ddd(*calendar, 2030, 11, 02, 10, 33, 40) ; 29 29 30 Date d1 (*calendar, 2007, 11, 12, 00, 00, 00) ; 31 Date d2 (*calendar, 2008, 11, 12, 00, 00, 00) ; 32 33 string sttr("12/07/2005 - 10:11:30"); 34 Date d3 = Date::FromString(sttr, *calendar); 35 30 36 // Les mois sont considérés comme des entiers mais stockés comme des flottants. 31 37 Duration sc0 = Second * -65.3 + Minute * 117.5 + Hour * 65.9 + Day * 417.8 + Month * 16.0 - Year * 17.5; … … 38 44 std::cout << boolalpha << (calendar->getInitDate() != calendar->getCurrentDate()) << std::endl; 39 45 40 std::cout << sc0 << std::endl; 41 std::cout << sc1 << std::endl; 42 std::cout << sc1 - sc0 << std::endl; 46 std::cout << (Time)d2 - (Time)(d1 + 365 * Day) << std::endl; 47 std::cout << sc0 << std::endl << sc1 << std::endl << sc1 - sc0 << std::endl; 43 48 std::cout << ddd - dd << std::endl; 44 49 std::cout << dd << std::endl; … … 47 52 48 53 std::cout << (dd+sc2) << std::endl; 54 std::cout << (d3) << std::endl; 49 55 50 56 delete calendar; -
XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp
r117 r118 2 2 #define __XMLIO_CALENDAR__ 3 3 4 #include "date.hpp"5 6 4 namespace XMLIOSERVER 7 5 { 8 9 typedef enum _monthEnum10 { 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 AbstractObject14 {15 public :16 17 virtual int getMonthLength(const Date& d) const18 { // 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) const31 { // 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) const42 {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) const50 { 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 AbstractCalendar71 72 6 class JulianCalendar : public AbstractCalendar 73 7 { … … 141 75 { if (d.getMonth() == 2) return (29); return AbstractCalendar::getMonthLength(d); } 142 76 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); } 144 78 145 79 virtual ~AllLeapCalendar() … … 154 88 {/* Ne rien faire de plus */} 155 89 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); } 157 91 virtual int getMonthLength(const Date& d) const { return (30); } 158 92 … … 162 96 }; // class D360Calendar 163 97 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 ici238 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 256 98 } // namespace XMLIOSERVER 257 99 -
XMLIO_V2/dev/dev_rv/src/XMLIO/date.hpp
r117 r118 4 4 namespace XMLIOSERVER 5 5 { 6 class AbstractCalendar;7 8 typedef long long int Time;9 10 typedef struct _duration11 {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(const AbstractCalendar&);21 22 /// Propriétés associées à la structure.23 double year, month, day, hour, minute, second;24 25 } Duration;26 27 /// Opérateurs associés à la structure Duration.28 Duration operator*(const Duration& ddr, const double& scal)29 {30 Duration 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 Duration operator*(const double& scal, const Duration& ddr)37 { return (ddr * scal); }38 39 Duration operator-(const Duration& ddr, const Duration& dr)40 {41 Duration dur(ddr);42 dur.year -= dr.year; dur.month -= dr.month ; dur.day -= dr.day;43 dur.hour -= dr.hour; dur.minute -= dr.minute; dur.second -= dr.second;44 return (dur);45 }46 47 Duration operator-(const Duration& ddr)48 {49 Duration dur(ddr);50 dur.year = -dur.year; dur.month = -dur.month ; dur.day = -dur.day;51 dur.hour = -dur.hour; dur.minute = -dur.minute; dur.second = -dur.second;52 return (dur);53 }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);61 }62 63 // Les principales durées constantes : année, mois, jour, ...64 static const Duration Year = {1.0, 0.0, 0.0, 0.0, 0.0, 0.0},65 Month = {0.0, 1.0, 0.0, 0.0, 0.0, 0.0},66 Day = {0.0, 0.0, 1.0, 0.0, 0.0, 0.0},67 Hour = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0},68 Minute = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0},69 Second = {0.0, 0.0, 0.0, 0.0, 0.0, 1.0};70 71 ///////////////////////////////////////////////////72 73 6 class Date 74 7 { … … 87 20 friend std::ostream& operator<<(std::ostream& out, const Date& d) 88 21 { 89 out << d. month << "/" << d.day << "/" << d.year << " -"90 << d.hour << "h. " << d.minute << "min. " << d.second << "sec. ";22 out << d.day << "/" << d.month << "/" << d.year << "-" 23 << d.hour << ":" << d.minute << ":" << d.second; 91 24 return (out); 92 25 } … … 94 27 friend std::istream& operator>>(std::istream& in, Date& d) // Non testée. 95 28 { 96 char c = '/'; // Le caractÚre c est utilisé pour "recueillir" le séparateur "/". 97 in >> d.month >> c >> d.day >> c >> d.year; 98 in.seekg(3, std::ios_base::cur); // On passe la lecture de la chaîne " - " 99 in >> d.hour; in.seekg(3, std::ios_base::cur); // On passe la lecture de la chaîne "h. " 100 in >> d.minute; in.seekg(5, std::ios_base::cur); // On passe la lecture de la chaîne "min. " 101 in >> d.second; in.seekg(5, std::ios_base::cur); // On passe la lecture de la chaîne "sec. " 29 char c = '/'; // Le caractÚre c est utilisé pour "recueillir" les séparateurs "/" et ":". 30 in >> d.day >> c >> d.month >> c >> d.year >> c; 31 in >> d.hour >> c >> d.minute >> c >> d.second; 102 32 return (in); 103 33 } 34 35 static Date FromString(const string& str, const AbstractCalendar& cal); 104 36 105 37 /// Divers accesseurs. … … 133 65 }; // class Date 134 66 135 Duration operator-(const Date& dt0, const Date& dt1)136 {137 // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.138 Duration dur =139 { dt0.getYear() - dt1.getYear(), dt0.getMonth() - dt1.getMonth() , dt0.getDay() - dt1.getDay(),140 dt0.getHour() - dt1.getHour(), dt0.getMinute() - dt1.getMinute(), dt0.getSecond() - dt1.getSecond() };141 return (dur.resolve(dt0.getRelCalendar()));142 }143 144 /// Les opérateurs de comparaison. (Non testés pour le moment)145 bool operator==(const Date& dt0, const Date& dt1)146 {147 // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.148 return ((dt0.getYear() == dt1.getYear()) && (dt0.getMonth() == dt1.getMonth()) && (dt1.getDay() == dt0.getDay()) &&149 (dt0.getHour() == dt1.getHour()) && (dt0.getMinute() == dt1.getMinute()) && (dt1.getSecond() == dt0.getSecond()));150 }151 152 bool operator<(const Date& dt0, const Date& dt1)153 {154 // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.155 if (dt0.getYear() < dt1.getYear()) return true; if (dt0.getMonth() < dt1.getMonth()) return true;156 if (dt0.getDay() < dt1.getDay()) return true; if (dt0.getHour() < dt1.getHour()) return true;157 if (dt0.getMinute() < dt1.getMinute()) return true; if (dt0.getSecond() < dt1.getSecond()) return true;158 return false;159 }160 161 bool operator!=(const Date& dt0, const Date& dt1) { return !(dt1 == dt0); }162 bool operator> (const Date& dt0, const Date& dt1) { return (dt1 < dt0); }163 bool operator>=(const Date& dt0, const Date& dt1) { return ((dt1 > dt0) || (dt1 == dt0)); }164 bool operator<=(const Date& dt0, const Date& dt1) { return ((dt1 < dt0) || (dt1 == dt0)); }165 166 67 } // namespace XMLIOSERVER 167 68 -
XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio.hpp
r115 r118 27 27 #include "abstract_object.hpp" 28 28 29 // Gestion du calendrier 30 #include "duration.hpp" 31 #include "date.hpp" 32 #include "abstract_calendar.hpp" 29 33 #include "calendar.hpp" 34 #include "calendar_utils.hpp" 30 35 31 36 #include "xml_node.hpp"
Note: See TracChangeset
for help on using the changeset viewer.