GCS  0.2.3
gu_datetime.hpp
1 /*
2  * Copyright (C) 2009 Codership Oy <info@codership.com>
3  *
4  * $Id$
5  */
6 
11 #ifndef __GU_DATETIME__
12 #define __GU_DATETIME__
13 
14 
15 #include "gu_exception.hpp"
16 #include "gu_regex.hpp"
17 #include "gu_time.h"
18 
19 #include <iostream>
20 #include <string>
21 #include <limits>
22 
23 namespace gu
24 {
25  namespace datetime
26  {
27  /* Multiplier constants */
28  const long long NSec = 1;
29  const long long USec = 1000*NSec;
30  const long long MSec = 1000*USec;
31  const long long Sec = 1000*MSec;
32  const long long Min = 60*Sec;
33  const long long Hour = 60*Min;
34  const long long Day = 24*Hour;
35  const long long Month = 30*Day;
36  const long long Year = 12*Month;
37 
42  class Period
43  {
44  public:
57  Period(const std::string& str = "") :
58  nsecs()
59  {
60  if (str != "") parse(str);
61  }
62 
63  Period(const long long nsecs_) : nsecs(nsecs_) { }
64 
65  static Period min() { return 0; }
66  static Period max() { return std::numeric_limits<long long>::max();}
67 
68  bool operator==(const Period& cmp) const
69  { return (nsecs == cmp.nsecs); }
70 
71  bool operator<(const Period& cmp) const
72  { return (nsecs < cmp.nsecs); }
73 
74  bool operator>=(const Period& cmp) const
75  { return !(*this < cmp); }
76 
77  Period operator+(const long long add) const
78  { return (nsecs + add); }
79 
80  Period operator-(const long long dec) const
81  { return (nsecs - dec); }
82 
83  Period operator*(const long long mul) const
84  { return (nsecs*mul); }
85 
86  Period operator/(const long long div) const
87  { return (nsecs/div); }
88 
89  long long get_nsecs() const { return nsecs; }
90 
91  private:
92 
93  friend class Date;
94  friend std::istream& operator>>(std::istream&, Period&);
95 
96  static const char* const period_regex;
97  static RegEx const regex;
102  void parse(const std::string&);
103 
104  long long nsecs;
105  };
106 
107 
115  class Date
116  {
117  public:
118 
124  static inline Date now() { return gu_time_monotonic(); }
125 
129  static inline Date calendar() { return gu_time_calendar(); }
130 
134  static inline Date monotonic() { return gu_time_monotonic(); }
135 
139  static inline Date max()
140  { return std::numeric_limits<long long>::max(); }
141 
145  static inline Date zero() { return 0; }
146 
151  long long get_utc() const { return utc; }
152 
153  /* Standard comparision operators */
154  bool operator==(const Date cmp) const
155  { return (utc == cmp.utc); }
156 
157  bool operator<(const Date cmp) const
158  { return (utc < cmp.utc); }
159 
163  Date operator+(const Period& add) const
164  { return (utc + add.get_nsecs()); }
165 
169  Date operator-(const Period& dec) const
170  { return (utc - dec.get_nsecs()); }
171 
172 
173  Period operator-(const Date& dec) const
174  { return (utc - dec.utc); }
175 
176 
177  Date(const long long utc_ = 0) : utc(utc_) { }
178 
180  void _timespec(timespec& ts) const
181  {
182  ts.tv_sec = utc / 1000000000L;
183  ts.tv_nsec = utc % 1000000000L;
184  }
185 
186  private:
187 
188  long long utc;
194  void parse(const std::string& str_);
195  };
196 
201  std::ostream& operator<<(std::ostream&, const Date&);
202 
206  std::ostream& operator<<(std::ostream&, const Period&);
207 
208  inline std::string to_string(const Period& p)
209  {
210  std::ostringstream os;
211  os << p;
212  return os.str();
213  }
214 
215  inline std::istream& operator>>(std::istream& is, Period& p)
216  {
217  std::string str;
218  is >> str;
219  p.parse(str);
220  return is;
221  }
222 
223  } // namespace datetime
224 } // namespace gu
225 
226 #endif // __GU_DATETIME__
std::string to_string(const T &x, std::ios_base &(*f)(std::ios_base &)=std::dec)
Definition: gu_utils.hpp:27
Date operator-(const Period &dec) const
Decrement period from Date.
Definition: gu_datetime.hpp:169
static Date zero()
Get zero time.
Definition: gu_datetime.hpp:145
void _timespec(timespec &ts) const
Definition: gu_datetime.hpp:180
static Date calendar()
Get time from system-wide realtime clock.
Definition: gu_datetime.hpp:129
Period(const std::string &str="")
Constructor.
Definition: gu_datetime.hpp:57
Date/time representation.
Definition: gu_datetime.hpp:115
static Date max()
Get maximum representable timestamp.
Definition: gu_datetime.hpp:139
static Date monotonic()
Get time from monotonic clock.
Definition: gu_datetime.hpp:134
long long get_utc() const
Definition: gu_datetime.hpp:151
Date operator+(const Period &add) const
Add period to Date.
Definition: gu_datetime.hpp:163
static Date now()
Get system time.
Definition: gu_datetime.hpp:124
Class representing time periods instead of system clock time.
Definition: gu_datetime.hpp:42