1 //
2 // Timespan.h
3 //
4 // Library: Foundation
5 // Package: DateTime
6 // Module: Timespan
7 //
8 // Definition of the Timespan class.
9 //
10 // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11 // and Contributors.
12 //
13 // SPDX-License-Identifier: BSL-1.0
14 //
15
16
17 #ifndef Foundation_Timespan_INCLUDED
18 #define Foundation_Timespan_INCLUDED
19
20
21 #include "Poco/Foundation.h"
22 #include "Poco/Timestamp.h"
23
24
25 namespace Poco {
26
27
28 class Foundation_API Timespan
29 /// A class that represents time spans up to microsecond resolution.
30 {
31 public:
32 using TimeDiff = Timestamp::TimeDiff;
33
34 Timespan();
35 /// Creates a zero Timespan.
36
37 Timespan(TimeDiff microseconds);
38 /// Creates a Timespan.
39
40 Timespan(long seconds, long microseconds);
41 /// Creates a Timespan. Useful for creating
42 /// a Timespan from a struct timeval.
43
44 Timespan(int days, int hours, int minutes, int seconds, int microSeconds);
45 /// Creates a Timespan.
46
47 Timespan(const Timespan& timespan);
48 /// Creates a Timespan from another one.
49
50 ~Timespan();
51 /// Destroys the Timespan.
52
53 Timespan& operator = (const Timespan& timespan);
54 /// Assignment operator.
55
56 Timespan& operator = (TimeDiff microseconds);
57 /// Assignment operator.
58
59 Timespan& assign(int days, int hours, int minutes, int seconds, int microSeconds);
60 /// Assigns a new span.
61
62 Timespan& assign(long seconds, long microseconds);
63 /// Assigns a new span. Useful for assigning
64 /// from a struct timeval.
65
66 void swap(Timespan& timespan);
67 /// Swaps the Timespan with another one.
68
69 bool operator == (const Timespan& ts) const;
70 bool operator != (const Timespan& ts) const;
71 bool operator > (const Timespan& ts) const;
72 bool operator >= (const Timespan& ts) const;
73 bool operator < (const Timespan& ts) const;
74 bool operator <= (const Timespan& ts) const;
75
76 bool operator == (TimeDiff microSeconds) const;
77 bool operator != (TimeDiff microSeconds) const;
78 bool operator > (TimeDiff microSeconds) const;
79 bool operator >= (TimeDiff microSeconds) const;
80 bool operator < (TimeDiff microSeconds) const;
81 bool operator <= (TimeDiff microSeconds) const;
82
83 Timespan operator + (const Timespan& d) const;
84 Timespan operator - (const Timespan& d) const;
85 Timespan& operator += (const Timespan& d);
86 Timespan& operator -= (const Timespan& d);
87
88 Timespan operator + (TimeDiff microSeconds) const;
89 Timespan operator - (TimeDiff microSeconds) const;
90 Timespan& operator += (TimeDiff microSeconds);
91 Timespan& operator -= (TimeDiff microSeconds);
92
93 int days() const;
94 /// Returns the number of days.
95
96 int hours() const;
97 /// Returns the number of hours (0 to 23).
98
99 int totalHours() const;
100 /// Returns the total number of hours.
101
102 int minutes() const;
103 /// Returns the number of minutes (0 to 59).
104
105 int totalMinutes() const;
106 /// Returns the total number of minutes.
107
108 int seconds() const;
109 /// Returns the number of seconds (0 to 59).
110
111 int totalSeconds() const;
112 /// Returns the total number of seconds.
113
114 int milliseconds() const;
115 /// Returns the number of milliseconds (0 to 999).
116
117 TimeDiff totalMilliseconds() const;
118 /// Returns the total number of milliseconds.
119
120 int microseconds() const;
121 /// Returns the fractions of a millisecond
122 /// in microseconds (0 to 999).
123
124 int useconds() const;
125 /// Returns the fractions of a second
126 /// in microseconds (0 to 999999).
127
128 TimeDiff totalMicroseconds() const;
129 /// Returns the total number of microseconds.
130
131 static const TimeDiff MILLISECONDS; /// The number of microseconds in a millisecond.
132 static const TimeDiff SECONDS; /// The number of microseconds in a second.
133 static const TimeDiff MINUTES; /// The number of microseconds in a minute.
134 static const TimeDiff HOURS; /// The number of microseconds in a hour.
135 static const TimeDiff DAYS; /// The number of microseconds in a day.
136
137 private:
138 TimeDiff _span;
139 };
140
141
142 //
143 // inlines
144 //
days()145 inline int Timespan::days() const
146 {
147 return int(_span/DAYS);
148 }
149
150
hours()151 inline int Timespan::hours() const
152 {
153 return int((_span/HOURS) % 24);
154 }
155
156
totalHours()157 inline int Timespan::totalHours() const
158 {
159 return int(_span/HOURS);
160 }
161
162
minutes()163 inline int Timespan::minutes() const
164 {
165 return int((_span/MINUTES) % 60);
166 }
167
168
totalMinutes()169 inline int Timespan::totalMinutes() const
170 {
171 return int(_span/MINUTES);
172 }
173
174
seconds()175 inline int Timespan::seconds() const
176 {
177 return int((_span/SECONDS) % 60);
178 }
179
180
totalSeconds()181 inline int Timespan::totalSeconds() const
182 {
183 return int(_span/SECONDS);
184 }
185
186
milliseconds()187 inline int Timespan::milliseconds() const
188 {
189 return int((_span/MILLISECONDS) % 1000);
190 }
191
192
totalMilliseconds()193 inline Timespan::TimeDiff Timespan::totalMilliseconds() const
194 {
195 return _span/MILLISECONDS;
196 }
197
198
microseconds()199 inline int Timespan::microseconds() const
200 {
201 return int(_span % 1000);
202 }
203
204
useconds()205 inline int Timespan::useconds() const
206 {
207 return int(_span % 1000000);
208 }
209
210
totalMicroseconds()211 inline Timespan::TimeDiff Timespan::totalMicroseconds() const
212 {
213 return _span;
214 }
215
216
217 inline bool Timespan::operator == (const Timespan& ts) const
218 {
219 return _span == ts._span;
220 }
221
222
223 inline bool Timespan::operator != (const Timespan& ts) const
224 {
225 return _span != ts._span;
226 }
227
228
229 inline bool Timespan::operator > (const Timespan& ts) const
230 {
231 return _span > ts._span;
232 }
233
234
235 inline bool Timespan::operator >= (const Timespan& ts) const
236 {
237 return _span >= ts._span;
238 }
239
240
241 inline bool Timespan::operator < (const Timespan& ts) const
242 {
243 return _span < ts._span;
244 }
245
246
247 inline bool Timespan::operator <= (const Timespan& ts) const
248 {
249 return _span <= ts._span;
250 }
251
252
253 inline bool Timespan::operator == (TimeDiff microSeconds) const
254 {
255 return _span == microSeconds;
256 }
257
258
259 inline bool Timespan::operator != (TimeDiff microSeconds) const
260 {
261 return _span != microSeconds;
262 }
263
264
265 inline bool Timespan::operator > (TimeDiff microSeconds) const
266 {
267 return _span > microSeconds;
268 }
269
270
271 inline bool Timespan::operator >= (TimeDiff microSeconds) const
272 {
273 return _span >= microSeconds;
274 }
275
276
277 inline bool Timespan::operator < (TimeDiff microSeconds) const
278 {
279 return _span < microSeconds;
280 }
281
282
283 inline bool Timespan::operator <= (TimeDiff microSeconds) const
284 {
285 return _span <= microSeconds;
286 }
287
288
swap(Timespan & s1,Timespan & s2)289 inline void swap(Timespan& s1, Timespan& s2)
290 {
291 s1.swap(s2);
292 }
293
294
~Timespan()295 inline Timespan::~Timespan()
296 {
297 }
298
299
300 } // namespace Poco
301
302
303 #endif // Foundation_Timespan_INCLUDED
304