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