#ifndef __XMLIO_DURATION__ #define __XMLIO_DURATION__ namespace XMLIOSERVER { class AbstractCalendar; typedef long long int Time; typedef struct _duration { public : struct _duration& operator=(const struct _duration& ddr) { year = ddr.year; month = ddr.month ; day = ddr.day; hour = ddr.hour; minute = ddr.minute; second = ddr.second; return (*this); } friend std::ostream& operator<<(std::ostream& _out, const struct _duration& d) { std::ostringstream out; bool testValue = true; if(d.year != 0.0) { testValue = false; out << d.year << "y " ; } if(d.month != 0.0) { testValue = false; out << d.month << "mo "; } if(d.day != 0.0) { testValue = false; out << d.day << "d " ; } if(d.hour != 0.0) { testValue = false; out << d.hour << "h " ; } if(d.minute != 0.0) { testValue = false; out << d.minute << "mi "; } if(d.second != 0.0 || testValue) { out << d.second << "s " ; } _out << (out.str().substr(0, out.str().size()-1)); // << suppression de l'espace en fin de chaîne. return (_out); } friend std::istream& operator>>(std::istream& in, struct _duration& d) { d.year = d.month = d.day = d.hour = d.minute = d.second = 0.0; double v = 1.0; char c = '/'; while (!in.eof()) { in >> v >> c; switch (c) { case 'y': d.year = v; continue; case 'd': d.day = v; continue; case 'h': d.hour = v; continue; case 's': d.second = v; continue; case 'm': in >> c; if (c == 'i') d.minute = v; else if(c == 'o') d.month = v; else { string valc("m"); valc.append(1, c); WARNING("La chaine \""+valc+"\" ne permet pas de définir une unité de durée."); continue; } continue; default: string valc; valc.append(1, c); WARNING("La chaine \""+valc+"\" ne permet pas de définir une unité de durée."); continue; } } return (in); } bool isNone(void) const { if ((year==0) && (month ==0) && (day ==0) && (hour==0) && (minute==0) && (second==0)) return (true); return (false); } struct _duration& resolve(const AbstractCalendar&); std::string toString(void) const { const struct _duration& own = *this; std::ostringstream oss; oss << own; return (oss.str()); } public: /* static */ static struct _duration FromString(const string& str) { struct _duration dr = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; std::istringstream iss(str); iss >> dr; return dr; } double year, month, day, hour, minute, second; } Duration; // Les principales durées constantes : année, mois, jour, ... static const Duration Year = {1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, Month = {0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, Week = {0.0, 0.0, 7.0, 0.0, 0.0, 0.0}, Day = {0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, Hour = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, Minute = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, Second = {0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, NoneDu = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; } // namespace XMLIOSERVER #endif // __XMLIO_DURATION__