source: filezilla/trunk/fuentes/src/include/timeex.h @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 6.7 KB
Line 
1#ifndef __TIMEEX_H__
2#define __TIMEEX_H__
3
4#include <wx/time.h>
5
6#include <chrono>
7#include <ctime>
8
9#include <limits>
10
11class duration;
12
13// Represents a point of time in wallclock.
14// Internal representation is in milliseconds since 1970-01-01 00:00:00.000 UTC [*]
15//
16// As time may come from different sources that have different accuracy/precision,
17// this class keeps track of accuracy information.
18//
19// The Compare function can be used for accuracy-aware comparisons. Conceptually it works
20// as if naively comparing both timestamps after truncating them to the most common accuracy.
21//
22// [*] underlying type may be TAI on some *nix, we pretend there is no difference
23class CDateTime final
24{
25public:
26        enum Accuracy : char {
27                days,
28                hours,
29                minutes,
30                seconds,
31                milliseconds
32        };
33
34        enum Zone {
35                utc,
36                local
37        };
38
39        CDateTime() = default;
40
41        CDateTime(Zone z, int year, int month, int day, int hour = -1, int minute = -1, int second = -1, int millisecond = -1);
42
43        explicit CDateTime(time_t, Accuracy a);
44
45        // Parses string, looks for YYYYmmDDHHMMSSsss
46        // Ignores all non-digit characters between fields.
47        explicit CDateTime(wxString const& s, Zone z);
48
49#ifdef __WXMSW__
50        explicit CDateTime(FILETIME const& ft, Accuracy a);
51#endif
52
53        CDateTime(CDateTime const& op) = default;
54        CDateTime(CDateTime && op) noexcept = default;
55        CDateTime& operator=(CDateTime const& op) = default;
56        CDateTime& operator=(CDateTime && op) noexcept = default;
57
58        bool IsValid() const;
59        void clear();
60
61        Accuracy GetAccuracy() const { return a_; }
62
63        static CDateTime Now();
64
65        bool operator==(CDateTime const& op) const;
66        bool operator!=(CDateTime const& op) const { return !(*this == op); }
67        bool operator<(CDateTime const& op) const;
68        bool operator<=(CDateTime const& op) const;
69        bool operator>(CDateTime const& op) const { return op < *this; }
70
71        int Compare(CDateTime const& op) const;
72        bool IsEarlierThan(CDateTime const& op) const { return Compare(op) < 0; };
73        bool IsLaterThan(CDateTime const& op) const { return Compare(op) > 0; };
74
75        CDateTime& operator+=(duration const& op);
76        CDateTime operator+(duration const& op) const { CDateTime t(*this); t += op; return t; }
77
78        CDateTime& operator-=(duration const& op);
79        CDateTime operator-(duration const& op) const { CDateTime t(*this); t -= op; return t; }
80
81        friend duration operator-(CDateTime const& a, CDateTime const& b);
82
83        // Beware: month and day are 1-indexed!
84        bool Set(Zone z, int year, int month, int day, int hour = -1, int minute = -1, int second = -1, int millisecond = -1);
85
86        bool Set(wxString const& str, Zone z);
87
88#ifdef __WXMSW__
89        bool Set(FILETIME const& ft, Accuracy a);
90        bool Set(SYSTEMTIME const& ft, Accuracy a, Zone z);
91#else
92        // Careful: modifies passed structure
93        bool Set(tm & t, Accuracy a, Zone z);
94#endif
95
96        bool ImbueTime(int hour, int minute, int second = -1, int millisecond = -1);
97
98        static bool VerifyFormat(wxString const& fmt);
99
100        wxString Format(wxString const& format, Zone z) const;
101
102        int GetMilliseconds() const { return t_ % 1000; }
103
104        time_t GetTimeT() const;
105
106        tm GetTm(Zone z) const;
107
108#ifdef __WXMSW__
109        FILETIME GetFileTime() const;
110#endif
111
112private:
113        int CompareSlow( CDateTime const& op ) const;
114
115        bool IsClamped();
116
117        enum invalid_t : int64_t {
118                invalid = std::numeric_limits<int64_t>::min()
119        };
120
121        int64_t t_{invalid};
122        Accuracy a_{days};
123};
124
125class duration final
126{
127public:
128        duration() = default;
129
130        int64_t get_days() const { return ms_ / 1000 / 3600 / 24; }
131        int64_t get_hours() const { return ms_ / 1000 / 3600; }
132        int64_t get_minutes() const { return ms_ / 1000 / 60; }
133        int64_t get_seconds() const { return ms_ / 1000; }
134        int64_t get_milliseconds() const { return ms_; }
135
136        static duration from_minutes(int64_t m) {
137                return duration(m * 1000 * 60);
138        }
139        static duration from_seconds(int64_t m) {
140                return duration(m * 1000);
141        }
142        static duration from_milliseconds(int64_t m) {
143                return duration(m);
144        }
145
146        duration& operator-=(duration const& op) {
147                ms_ -= op.ms_;
148                return *this;
149        }
150
151        duration operator-() const {
152                return duration(-ms_);
153        }
154
155        explicit operator bool() const {
156                return ms_ != 0;
157        }
158
159        bool operator<(duration const& op) const { return ms_ < op.ms_; }
160        bool operator<=(duration const& op) const { return ms_ <= op.ms_; }
161        bool operator>(duration const& op) const { return ms_ > op.ms_; }
162        bool operator>=(duration const& op) const { return ms_ >= op.ms_; }
163
164        friend duration operator-(duration const& a, duration const& b);
165private:
166        explicit duration(int64_t ms) : ms_(ms) {}
167
168        int64_t ms_{};
169};
170
171inline duration operator-(duration const& a, duration const& b)
172{
173        return duration(a) -= b;
174}
175
176
177duration operator-(CDateTime const& a, CDateTime const& b);
178
179class CMonotonicClock final
180{
181public:
182        CMonotonicClock() = default;
183        CMonotonicClock(CMonotonicClock const&) = default;
184        CMonotonicClock(CMonotonicClock &&) noexcept = default;
185        CMonotonicClock& operator=(CMonotonicClock const&) = default;
186        CMonotonicClock& operator=(CMonotonicClock &&) noexcept = default;
187
188        CMonotonicClock const operator+(duration const& d) const
189        {
190                return CMonotonicClock(*this) += d;
191        }
192
193private:
194        typedef std::chrono::steady_clock clock_type;
195        static_assert(std::chrono::steady_clock::is_steady, "Nonconforming stdlib, your steady_clock isn't steady");
196
197public:
198        static CMonotonicClock now() {
199                return CMonotonicClock(clock_type::now());
200        }
201
202        explicit operator bool() const {
203                return t_ != clock_type::time_point();
204        }
205
206        CMonotonicClock& operator+=(duration const& d)
207        {
208                t_ += std::chrono::milliseconds(d.get_milliseconds());
209                return *this;
210        }
211
212private:
213        explicit CMonotonicClock(clock_type::time_point const& t)
214                : t_(t)
215        {}
216
217        clock_type::time_point t_;
218
219        friend duration operator-(CMonotonicClock const& a, CMonotonicClock const& b);
220        friend bool operator==(CMonotonicClock const& a, CMonotonicClock const& b);
221        friend bool operator<(CMonotonicClock const& a, CMonotonicClock const& b);
222        friend bool operator<=(CMonotonicClock const& a, CMonotonicClock const& b);
223        friend bool operator>(CMonotonicClock const& a, CMonotonicClock const& b);
224        friend bool operator>=(CMonotonicClock const& a, CMonotonicClock const& b);
225};
226
227inline duration operator-(CMonotonicClock const& a, CMonotonicClock const& b)
228{
229        return duration::from_milliseconds(std::chrono::duration_cast<std::chrono::milliseconds>(a.t_ - b.t_).count());
230}
231
232inline bool operator==(CMonotonicClock const& a, CMonotonicClock const& b)
233{
234        return a.t_ == b.t_;
235}
236
237inline bool operator<(CMonotonicClock const& a, CMonotonicClock const& b)
238{
239        return a.t_ < b.t_;
240}
241
242inline bool operator<=(CMonotonicClock const& a, CMonotonicClock const& b)
243{
244        return a.t_ <= b.t_;
245}
246
247inline bool operator>(CMonotonicClock const& a, CMonotonicClock const& b)
248{
249        return a.t_ > b.t_;
250}
251
252inline bool operator>=(CMonotonicClock const& a, CMonotonicClock const& b)
253{
254        return a.t_ >= b.t_;
255}
256
257#endif //__TIMEEX_H__
Note: See TracBrowser for help on using the repository browser.