00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BOOSTER_POSIX_TIME_H
00009 #define BOOSTER_POSIX_TIME_H
00010
00011 #include <booster/config.h>
00012 #include <ctime>
00013 #include <iosfwd>
00014 #include <math.h>
00015
00016 namespace booster {
00017
00026 class BOOSTER_API ptime {
00027 public:
00031 explicit
00032 ptime(long long seconds=0,int nano=0) :
00033 sec(seconds),
00034 nsec(nano)
00035 {
00036 normalize();
00037 }
00038
00042 long long get_seconds() const
00043 {
00044 return sec;
00045 }
00049 int get_nanoseconds() const
00050 {
00051 return nsec;
00052 }
00056 int get_milliseconds() const
00057 {
00058 return nsec / one_e6;
00059 }
00063 int get_microseconds() const
00064 {
00065 return nsec / one_e3;
00066 }
00067
00071 static long long seconds(ptime const &p)
00072 {
00073 return p.sec;
00074 }
00078 static ptime seconds(long long v)
00079 {
00080 return ptime(v);
00081 }
00082
00087 static long long milliseconds(ptime const &p)
00088 {
00089 return p.get_seconds() * one_e3 + p.get_milliseconds();
00090 }
00094 static ptime milliseconds(long long v)
00095 {
00096 return ptime(v/one_e3,v%one_e3 * one_e6);
00097 }
00102 static long long microseconds(ptime const &p)
00103 {
00104 return p.get_seconds() * one_e6 + p.get_nanoseconds() / one_e3;
00105 }
00109 static ptime microseconds(long long v)
00110 {
00111 return ptime(v/one_e6,v%one_e6 * one_e3);
00112 }
00117 static long long nanoseconds(ptime const &p)
00118 {
00119 return p.get_seconds() * one_e9 + p.get_nanoseconds();
00120 }
00124 static ptime nanoseconds(long long v)
00125 {
00126 return ptime(v/one_e9,v%one_e9);
00127 }
00131 static ptime minutes(long long v)
00132 {
00133 return ptime(v*60);
00134 }
00138 static long long minutes(ptime const &p)
00139 {
00140 return p.get_seconds() / 60;
00141 }
00145 static long long hours(ptime const &p)
00146 {
00147 return p.get_seconds() / 3600;
00148 }
00152 static ptime hours(long long v)
00153 {
00154 return ptime(v*3600);
00155 }
00159 static long long days(ptime const &p)
00160 {
00161 return p.get_seconds() / (3600*24);
00162 }
00166 static ptime days(long long v)
00167 {
00168 return ptime(v*(3600*24));
00169 }
00170
00174 static double to_number(ptime const &t)
00175 {
00176 return double(t.sec) + double(t.nsec) * 1e-9;
00177 }
00181 static ptime from_number(double d)
00182 {
00183 double sec = floor(d);
00184 double subsec = d-sec;
00185 long long seconds = static_cast<long long>(sec);
00186 int nano = static_cast<int>(floor(subsec * 1e9));
00187 if(nano < 0) nano = 0;
00188 if(nano >= one_e9) nano = one_e9-1;
00189 return ptime(seconds,nano);
00190 }
00191
00195 ptime operator+(ptime const &other) const
00196 {
00197 return ptime(sec+other.sec,nsec+other.nsec);
00198 }
00202 ptime operator-(ptime const &other) const
00203 {
00204 return ptime(sec-other.sec,nsec-other.nsec);
00205 }
00206
00207 bool operator==(ptime const &other) const
00208 {
00209 return sec==other.sec && nsec == other.nsec;
00210 }
00211 bool operator!=(ptime const &other) const
00212 {
00213 return !((*this)==other);
00214 }
00215 bool operator<(ptime const &other) const
00216 {
00217 if(sec < other.sec)
00218 return true;
00219 if(sec > other.sec)
00220 return false;
00221 return nsec < other.nsec;
00222 }
00223 bool operator>(ptime const &other) const
00224 {
00225 return other < *this;
00226 }
00227 bool operator <= (ptime const &other) const
00228 {
00229 return !(*this > other);
00230 }
00231 bool operator >=(ptime const &other) const
00232 {
00233 return !(*this < other);
00234 }
00235
00239 static ptime local_time(std::tm const &v);
00243 static ptime universal_time(std::tm const &v);
00247 static std::tm local_time(ptime const &v);
00251 static std::tm universal_time(ptime const &v);
00252
00256 static ptime now();
00257
00261 static ptime const zero;
00262
00266 static void millisleep(long long v)
00267 {
00268 sleep(milliseconds(v));
00269 }
00273 static void nanosleep(long long v)
00274 {
00275 sleep(nanoseconds(v));
00276 }
00280 static void sleep(ptime const &v );
00281
00282 private:
00283 void normalize()
00284 {
00285 if(nsec > one_e9) {
00286 sec += nsec / one_e9;
00287 nsec = nsec % one_e9;
00288 }
00289 else if(nsec < 0) {
00290 while(nsec < 0) {
00291 nsec += one_e9;
00292 sec -= 1;
00293 }
00294 }
00295 }
00296 static const int one_e3 = 1000;
00297 static const int one_e6 = 1000000;
00298 static const int one_e9 = 1000000000;
00299 long long sec;
00300 int nsec;
00301 };
00302
00307 BOOSTER_API std::ostream &operator<<(std::ostream &,ptime const &);
00312 BOOSTER_API std::istream &operator>>(std::istream &,ptime &);
00313
00314 }
00315
00316 #endif
00317