/src/muduo/muduo/base/Timestamp.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Use of this source code is governed by a BSD-style license |
2 | | // that can be found in the License file. |
3 | | // |
4 | | // Author: Shuo Chen (chenshuo at chenshuo dot com) |
5 | | |
6 | | #ifndef MUDUO_BASE_TIMESTAMP_H |
7 | | #define MUDUO_BASE_TIMESTAMP_H |
8 | | |
9 | | #include "muduo/base/copyable.h" |
10 | | #include "muduo/base/Types.h" |
11 | | |
12 | | #include <boost/operators.hpp> |
13 | | |
14 | | namespace muduo |
15 | | { |
16 | | |
17 | | /// |
18 | | /// Time stamp in UTC, in microseconds resolution. |
19 | | /// |
20 | | /// This class is immutable. |
21 | | /// It's recommended to pass it by value, since it's passed in register on x64. |
22 | | /// |
23 | | class Timestamp : public muduo::copyable, |
24 | | public boost::equality_comparable<Timestamp>, |
25 | | public boost::less_than_comparable<Timestamp> |
26 | | { |
27 | | public: |
28 | | /// |
29 | | /// Constucts an invalid Timestamp. |
30 | | /// |
31 | | Timestamp() |
32 | 1.93k | : microSecondsSinceEpoch_(0) |
33 | 1.93k | { |
34 | 1.93k | } |
35 | | |
36 | | /// |
37 | | /// Constucts a Timestamp at specific time |
38 | | /// |
39 | | /// @param microSecondsSinceEpoch |
40 | | explicit Timestamp(int64_t microSecondsSinceEpochArg) |
41 | 1.93k | : microSecondsSinceEpoch_(microSecondsSinceEpochArg) |
42 | 1.93k | { |
43 | 1.93k | } |
44 | | |
45 | | void swap(Timestamp& that) |
46 | 0 | { |
47 | 0 | std::swap(microSecondsSinceEpoch_, that.microSecondsSinceEpoch_); |
48 | 0 | } |
49 | | |
50 | | // default copy/assignment/dtor are Okay |
51 | | |
52 | | string toString() const; |
53 | | string toFormattedString(bool showMicroseconds = true) const; |
54 | | |
55 | 0 | bool valid() const { return microSecondsSinceEpoch_ > 0; } |
56 | | |
57 | | // for internal usage. |
58 | 0 | int64_t microSecondsSinceEpoch() const { return microSecondsSinceEpoch_; } |
59 | | time_t secondsSinceEpoch() const |
60 | 0 | { return static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); } |
61 | | |
62 | | /// |
63 | | /// Get time of now. |
64 | | /// |
65 | | static Timestamp now(); |
66 | | static Timestamp invalid() |
67 | 0 | { |
68 | 0 | return Timestamp(); |
69 | 0 | } |
70 | | |
71 | | static Timestamp fromUnixTime(time_t t) |
72 | 0 | { |
73 | 0 | return fromUnixTime(t, 0); |
74 | 0 | } |
75 | | |
76 | | static Timestamp fromUnixTime(time_t t, int microseconds) |
77 | 0 | { |
78 | 0 | return Timestamp(static_cast<int64_t>(t) * kMicroSecondsPerSecond + microseconds); |
79 | 0 | } |
80 | | |
81 | | static const int kMicroSecondsPerSecond = 1000 * 1000; |
82 | | |
83 | | private: |
84 | | int64_t microSecondsSinceEpoch_; |
85 | | }; |
86 | | |
87 | | inline bool operator<(Timestamp lhs, Timestamp rhs) |
88 | 0 | { |
89 | 0 | return lhs.microSecondsSinceEpoch() < rhs.microSecondsSinceEpoch(); |
90 | 0 | } |
91 | | |
92 | | inline bool operator==(Timestamp lhs, Timestamp rhs) |
93 | 0 | { |
94 | 0 | return lhs.microSecondsSinceEpoch() == rhs.microSecondsSinceEpoch(); |
95 | 0 | } |
96 | | |
97 | | /// |
98 | | /// Gets time difference of two timestamps, result in seconds. |
99 | | /// |
100 | | /// @param high, low |
101 | | /// @return (high-low) in seconds |
102 | | /// @c double has 52-bit precision, enough for one-microsecond |
103 | | /// resolution for next 100 years. |
104 | | inline double timeDifference(Timestamp high, Timestamp low) |
105 | 0 | { |
106 | 0 | int64_t diff = high.microSecondsSinceEpoch() - low.microSecondsSinceEpoch(); |
107 | 0 | return static_cast<double>(diff) / Timestamp::kMicroSecondsPerSecond; |
108 | 0 | } |
109 | | |
110 | | /// |
111 | | /// Add @c seconds to given timestamp. |
112 | | /// |
113 | | /// @return timestamp+seconds as Timestamp |
114 | | /// |
115 | | inline Timestamp addTime(Timestamp timestamp, double seconds) |
116 | 0 | { |
117 | 0 | int64_t delta = static_cast<int64_t>(seconds * Timestamp::kMicroSecondsPerSecond); |
118 | 0 | return Timestamp(timestamp.microSecondsSinceEpoch() + delta); |
119 | 0 | } |
120 | | |
121 | | } // namespace muduo |
122 | | |
123 | | #endif // MUDUO_BASE_TIMESTAMP_H |