Coverage Report

Created: 2025-08-29 06:10

/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