@@ -30,4 +30,262 @@ inline DOMHighResTimeStamp chronoToDOMHighResTimeStamp(
30
30
return chronoToDOMHighResTimeStamp (timePoint.time_since_epoch ());
31
31
}
32
32
33
+ class HighResTimeDuration ;
34
+ class HighResTimeStamp ;
35
+
36
+ /*
37
+ * A class representing a duration of time with high precision.
38
+ *
39
+ * @see __docs__/README.md for more information.
40
+ */
41
+ class HighResTimeDuration {
42
+ friend class HighResTimeStamp ;
43
+ friend HighResTimeDuration operator -(
44
+ const HighResTimeStamp& lhs,
45
+ const HighResTimeStamp& rhs);
46
+ friend HighResTimeStamp operator +(
47
+ const HighResTimeStamp& lhs,
48
+ const HighResTimeDuration& rhs);
49
+ friend HighResTimeStamp operator -(
50
+ const HighResTimeStamp& lhs,
51
+ const HighResTimeDuration& rhs);
52
+
53
+ public:
54
+ HighResTimeDuration ()
55
+ : chronoDuration_(std::chrono::steady_clock::duration()) {}
56
+ /* implicit */ HighResTimeDuration(std::chrono::nanoseconds nanoseconds)
57
+ : chronoDuration_(nanoseconds) {}
58
+ /* implicit */ HighResTimeDuration(std::chrono::microseconds microseconds)
59
+ : chronoDuration_(microseconds) {}
60
+ /* implicit */ HighResTimeDuration(std::chrono::milliseconds milliseconds)
61
+ : chronoDuration_(milliseconds) {}
62
+ /* implicit */ HighResTimeDuration(std::chrono::seconds seconds)
63
+ : chronoDuration_(seconds) {}
64
+
65
+ int64_t toNanoseconds () const {
66
+ return std::chrono::duration_cast<std::chrono::nanoseconds>(chronoDuration_)
67
+ .count ();
68
+ }
69
+
70
+ int64_t toMicroseconds () const {
71
+ return std::chrono::duration_cast<std::chrono::microseconds>(
72
+ chronoDuration_)
73
+ .count ();
74
+ }
75
+
76
+ double toMicrosecondsWithPrecision () const {
77
+ return static_cast <std::chrono::duration<double , std::micro>>(
78
+ chronoDuration_)
79
+ .count ();
80
+ }
81
+
82
+ int64_t toMilliseconds () const {
83
+ return std::chrono::duration_cast<std::chrono::milliseconds>(
84
+ chronoDuration_)
85
+ .count ();
86
+ }
87
+
88
+ double toMillisecondsWithPrecision () const {
89
+ return static_cast <std::chrono::duration<double , std::milli>>(
90
+ chronoDuration_)
91
+ .count ();
92
+ }
93
+
94
+ int64_t toSeconds () const {
95
+ return std::chrono::duration_cast<std::chrono::seconds>(chronoDuration_)
96
+ .count ();
97
+ }
98
+
99
+ double toSecondsWithPrecision () const {
100
+ return static_cast <std::chrono::duration<double >>(chronoDuration_).count ();
101
+ }
102
+
103
+ double toDOMHighResTimeStamp () const {
104
+ return toMillisecondsWithPrecision ();
105
+ }
106
+
107
+ HighResTimeDuration operator +(const HighResTimeDuration& rhs) const {
108
+ return {chronoDuration_ + rhs.chronoDuration_ };
109
+ }
110
+
111
+ HighResTimeDuration operator -(const HighResTimeDuration& rhs) const {
112
+ return {chronoDuration_ - rhs.chronoDuration_ };
113
+ }
114
+
115
+ HighResTimeDuration& operator +=(const HighResTimeDuration& rhs) {
116
+ chronoDuration_ += rhs.chronoDuration_ ;
117
+ return *this ;
118
+ }
119
+
120
+ HighResTimeDuration& operator -=(const HighResTimeDuration& rhs) {
121
+ chronoDuration_ -= rhs.chronoDuration_ ;
122
+ return *this ;
123
+ }
124
+
125
+ bool operator ==(const HighResTimeDuration& rhs) const {
126
+ return chronoDuration_ == rhs.chronoDuration_ ;
127
+ }
128
+
129
+ bool operator !=(const HighResTimeDuration& rhs) const {
130
+ return chronoDuration_ != rhs.chronoDuration_ ;
131
+ }
132
+
133
+ bool operator <(const HighResTimeDuration& rhs) const {
134
+ return chronoDuration_ < rhs.chronoDuration_ ;
135
+ }
136
+
137
+ bool operator <=(const HighResTimeDuration& rhs) const {
138
+ return chronoDuration_ <= rhs.chronoDuration_ ;
139
+ }
140
+
141
+ bool operator >(const HighResTimeDuration& rhs) const {
142
+ return chronoDuration_ > rhs.chronoDuration_ ;
143
+ }
144
+
145
+ bool operator >=(const HighResTimeDuration& rhs) const {
146
+ return chronoDuration_ >= rhs.chronoDuration_ ;
147
+ }
148
+
149
+ private:
150
+ std::chrono::steady_clock::duration chronoDuration_;
151
+ };
152
+
153
+ /*
154
+ * A class representing a specific point in time with high precision.
155
+ *
156
+ * @see __docs__/README.md for more information.
157
+ */
158
+ class HighResTimeStamp {
159
+ friend class HighResTimeClock ;
160
+ friend HighResTimeDuration operator -(
161
+ const HighResTimeStamp& lhs,
162
+ const HighResTimeStamp& rhs);
163
+ friend HighResTimeStamp operator +(
164
+ const HighResTimeStamp& lhs,
165
+ const HighResTimeDuration& rhs);
166
+ friend HighResTimeStamp operator -(
167
+ const HighResTimeStamp& lhs,
168
+ const HighResTimeDuration& rhs);
169
+
170
+ public:
171
+ HighResTimeStamp ()
172
+ : chronoTimeStamp_(std::chrono::steady_clock::time_point()) {}
173
+ explicit HighResTimeStamp (HighResTimeDuration duration)
174
+ : chronoTimeStamp_(duration.chronoDuration_) {}
175
+ /* implicit */ HighResTimeStamp(std::chrono::nanoseconds nanoseconds)
176
+ : chronoTimeStamp_(nanoseconds) {}
177
+ /* implicit */ HighResTimeStamp(std::chrono::microseconds microseconds)
178
+ : chronoTimeStamp_(microseconds) {}
179
+ /* implicit */ HighResTimeStamp(std::chrono::milliseconds milliseconds)
180
+ : chronoTimeStamp_(milliseconds) {}
181
+ /* implicit */ HighResTimeStamp(std::chrono::seconds seconds)
182
+ : chronoTimeStamp_(seconds) {}
183
+
184
+ HighResTimeDuration toDuration () const {
185
+ return {chronoTimeStamp_.time_since_epoch ()};
186
+ }
187
+
188
+ int64_t toNanoseconds () const {
189
+ return toDuration ().toNanoseconds ();
190
+ }
191
+
192
+ int64_t toMicroseconds () const {
193
+ return toDuration ().toMicroseconds ();
194
+ }
195
+
196
+ double toMicrosecondsWithPrecision () const {
197
+ return toDuration ().toMicrosecondsWithPrecision ();
198
+ }
199
+
200
+ int64_t toMilliseconds () const {
201
+ return toDuration ().toMilliseconds ();
202
+ }
203
+
204
+ double toMillisecondsWithPrecision () const {
205
+ return toDuration ().toMillisecondsWithPrecision ();
206
+ }
207
+
208
+ int64_t toSeconds () const {
209
+ return toDuration ().toSeconds ();
210
+ }
211
+
212
+ double toSecondsWithPrecision () const {
213
+ return toDuration ().toSecondsWithPrecision ();
214
+ }
215
+
216
+ double toDOMHighResTimeStamp () const {
217
+ return toDuration ().toDOMHighResTimeStamp ();
218
+ }
219
+
220
+ bool operator ==(const HighResTimeStamp& rhs) const {
221
+ return chronoTimeStamp_ == rhs.chronoTimeStamp_ ;
222
+ }
223
+
224
+ bool operator !=(const HighResTimeStamp& rhs) const {
225
+ return chronoTimeStamp_ != rhs.chronoTimeStamp_ ;
226
+ }
227
+
228
+ bool operator <(const HighResTimeStamp& rhs) const {
229
+ return chronoTimeStamp_ < rhs.chronoTimeStamp_ ;
230
+ }
231
+
232
+ bool operator <=(const HighResTimeStamp& rhs) const {
233
+ return chronoTimeStamp_ <= rhs.chronoTimeStamp_ ;
234
+ }
235
+
236
+ bool operator >(const HighResTimeStamp& rhs) const {
237
+ return chronoTimeStamp_ > rhs.chronoTimeStamp_ ;
238
+ }
239
+
240
+ bool operator >=(const HighResTimeStamp& rhs) const {
241
+ return chronoTimeStamp_ >= rhs.chronoTimeStamp_ ;
242
+ }
243
+
244
+ HighResTimeStamp& operator +=(const HighResTimeDuration& rhs) {
245
+ chronoTimeStamp_ += rhs.chronoDuration_ ;
246
+ return *this ;
247
+ }
248
+
249
+ HighResTimeStamp& operator -=(const HighResTimeDuration& rhs) {
250
+ chronoTimeStamp_ -= rhs.chronoDuration_ ;
251
+ return *this ;
252
+ }
253
+
254
+ private:
255
+ explicit HighResTimeStamp (std::chrono::steady_clock::time_point timeStamp)
256
+ : chronoTimeStamp_(timeStamp) {}
257
+
258
+ std::chrono::steady_clock::time_point chronoTimeStamp_;
259
+ };
260
+
261
+ /*
262
+ * A class providing a monotonic clock that won't be adjusted.
263
+ *
264
+ * @see __docs__/README.md for more information.
265
+ */
266
+ class HighResTimeClock {
267
+ public:
268
+ static HighResTimeStamp now () noexcept {
269
+ return HighResTimeStamp (std::chrono::steady_clock::now ());
270
+ }
271
+ };
272
+
273
+ inline HighResTimeDuration operator -(
274
+ const HighResTimeStamp& lhs,
275
+ const HighResTimeStamp& rhs) {
276
+ return {lhs.chronoTimeStamp_ - rhs.chronoTimeStamp_ };
277
+ }
278
+
279
+ inline HighResTimeStamp operator +(
280
+ const HighResTimeStamp& lhs,
281
+ const HighResTimeDuration& rhs) {
282
+ return HighResTimeStamp (lhs.chronoTimeStamp_ + rhs.chronoDuration_ );
283
+ }
284
+
285
+ inline HighResTimeStamp operator -(
286
+ const HighResTimeStamp& lhs,
287
+ const HighResTimeDuration& rhs) {
288
+ return HighResTimeStamp (lhs.chronoTimeStamp_ - rhs.chronoDuration_ );
289
+ }
290
+
33
291
} // namespace facebook::react
0 commit comments