Kudu C++ client API
Loading...
Searching...
No Matches
monotime.h
1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements. See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership. The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License. You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied. See the License for the
15// specific language governing permissions and limitations
16// under the License.
17#ifndef KUDU_UTIL_MONOTIME_H
18#define KUDU_UTIL_MONOTIME_H
19
20// NOTE: using stdint.h instead of cstdint because this file is supposed
21// to be processed by a compiler lacking C++11 support.
22#include <stdint.h>
23
24#include <iosfwd>
25#include <string>
26
27#ifdef KUDU_HEADERS_NO_STUBS
28#include <gtest/gtest_prod.h>
29
30#include "kudu/gutil/port.h"
31#else
32// This is a poor module interdependency, but the stubs are header-only and
33// it's only for exported header builds, so we'll make an exception.
34#include "kudu/client/stubs.h"
35#endif
36
37#include "kudu/util/kudu_export.h"
38
39
40// The 'noexcept' specifier is recognized by a C++11-capable compiler, but this
41// file is targeted to compile by C++-98 compiler as well. As it turns out,
42// adding 'noexcept' doesn't affect the generated symbols in the exported
43// MonoTime class, so it's safe to turn it on when compiling in the C++11 mode.
44// The 'noexcept' specified is useful in cases when wrapping MonoTime into
45// std::atomic<> and the standard C++ library explicitly requires that.
46#ifdef LANG_CXX11
47#define KUDU_MONOTIME_NOEXCEPT noexcept
48#else
49#define KUDU_MONOTIME_NOEXCEPT
50#endif // #ifdef LANG_CXX11 ... #else ...
51
52namespace kudu {
53
58class KUDU_EXPORT MonoDelta {
59 public:
62
67 static MonoDelta FromSeconds(double seconds);
68
73 static MonoDelta FromMilliseconds(int64_t ms);
74
79 static MonoDelta FromMicroseconds(int64_t us);
80
85 static MonoDelta FromNanoseconds(int64_t ns);
87
93
95 bool Initialized() const;
96
105 bool LessThan(const MonoDelta& rhs) const
106 ATTRIBUTE_DEPRECATED("use operator<(const MonoDelta&, const MonoDelta&) instead");
107
116 bool MoreThan(const MonoDelta& rhs) const
117 ATTRIBUTE_DEPRECATED("use operator>(const MonoDelta&, const MonoDelta&) instead");
118
128 bool Equals(const MonoDelta& rhs) const ATTRIBUTE_DEPRECATED(
129 "use operator==(const MonoDelta&, const MonoDelta&) instead");
130
132 std::string ToString() const;
133
136
138 double ToSeconds() const;
139 int64_t ToMilliseconds() const;
140 int64_t ToMicroseconds() const;
141 int64_t ToNanoseconds() const;
143
149 void ToTimeVal(struct timeval* tv) const;
150
156 void ToTimeSpec(struct timespec* ts) const;
157
164 static void NanosToTimeSpec(int64_t nanos, struct timespec* ts);
165
168
175
183
184 private:
185 static const int64_t kUninitialized;
186
187 friend class MonoTime;
188
189 friend MonoDelta operator-(const class MonoTime&, const class MonoTime&);
190 friend MonoDelta operator-(const MonoDelta&, const MonoDelta&);
191 friend MonoDelta operator+(const MonoDelta&, const MonoDelta&);
192 friend class MonoTime operator-(const class MonoTime&, const class MonoDelta&);
193 friend class MonoTime operator+(const class MonoTime&, const class MonoDelta&);
194 friend bool operator==(const MonoDelta&, const MonoDelta&);
195 friend bool operator<(const MonoDelta&, const MonoDelta&);
196 friend bool operator>(const MonoDelta&, const MonoDelta&);
197
198 FRIEND_TEST(TestMonoTime, TestDeltaConversions);
199
200 explicit MonoDelta(int64_t delta);
201 int64_t nano_delta_;
202};
203
211class KUDU_EXPORT MonoTime {
212 public:
215
217 static const int64_t kNanosecondsPerSecond = 1000000000L;
218
220 static const int64_t kNanosecondsPerMillisecond = 1000000L;
221
223 static const int64_t kNanosecondsPerMicrosecond = 1000L;
224
226 static const int64_t kMicrosecondsPerSecond = 1000000L;
228
232 static MonoTime Now();
233
235 static MonoTime Max();
236
238 static MonoTime Min();
239
249 static const MonoTime& Earliest(const MonoTime& a, const MonoTime& b)
250 ATTRIBUTE_DEPRECATED("use std::min() instead");
251
254 MonoTime() KUDU_MONOTIME_NOEXCEPT;
255
257 bool Initialized() const;
258
269 MonoDelta GetDeltaSince(const MonoTime& rhs) const ATTRIBUTE_DEPRECATED(
270 "use kudu::operator-(const MonoTime&, const MonoTime&) instead");
271
278 void AddDelta(const MonoDelta& delta) ATTRIBUTE_DEPRECATED(
279 "use operator+=(const MonoDelta&) instead");
280
290 bool ComesBefore(const MonoTime& rhs) const ATTRIBUTE_DEPRECATED(
291 "use operator<(const MonoTime&, const MonoTime&) instead");
292
294 std::string ToString() const;
295
301 void ToTimeSpec(struct timespec* ts) const;
302
311 bool Equals(const MonoTime& other) const ATTRIBUTE_DEPRECATED(
312 "use operator==(const MonoTime&, const MonoTime&) instead");
313
319 MonoTime& operator+=(const MonoDelta& delta);
320
326 MonoTime& operator-=(const MonoDelta& delta);
327
328 private:
329 friend class MonoDelta;
330 friend MonoDelta operator-(const MonoTime&, const MonoTime&);
331 friend MonoTime operator-(const MonoTime&, const MonoDelta&);
332 friend MonoTime operator+(const MonoTime&, const MonoDelta&);
333 friend bool operator==(const MonoTime&, const MonoTime&);
334 friend bool operator<(const MonoTime&, const MonoTime&);
335
336 FRIEND_TEST(TestMonoTime, TestTimeSpec);
337 FRIEND_TEST(TestMonoTime, TestDeltaConversions);
338
339 explicit MonoTime(const struct timespec& ts) KUDU_MONOTIME_NOEXCEPT;
340 explicit MonoTime(int64_t nanos) KUDU_MONOTIME_NOEXCEPT;
341 double ToSeconds() const;
342 int64_t nanos_;
343};
344
355void KUDU_EXPORT SleepFor(const MonoDelta& delta);
356
359
366bool KUDU_EXPORT operator==(const MonoDelta& lhs, const MonoDelta& rhs);
367
374bool KUDU_EXPORT operator!=(const MonoDelta& lhs, const MonoDelta& rhs);
375
382bool KUDU_EXPORT operator<(const MonoDelta& lhs, const MonoDelta& rhs);
383
390bool KUDU_EXPORT operator<=(const MonoDelta& lhs, const MonoDelta& rhs);
391
398bool KUDU_EXPORT operator>(const MonoDelta& lhs, const MonoDelta& rhs);
399
406bool KUDU_EXPORT operator>=(const MonoDelta& lhs, const MonoDelta& rhs);
407
413MonoDelta KUDU_EXPORT operator-(const MonoDelta& lhs, const MonoDelta& rhs);
414
420MonoDelta KUDU_EXPORT operator+(const MonoDelta& lhs, const MonoDelta& rhs);
422
425
436bool KUDU_EXPORT operator==(const MonoTime& lhs, const MonoTime& rhs);
437
449bool KUDU_EXPORT operator!=(const MonoTime& lhs, const MonoTime& rhs);
450
457bool KUDU_EXPORT operator<(const MonoTime& lhs, const MonoTime& rhs);
458
465bool KUDU_EXPORT operator<=(const MonoTime& lhs, const MonoTime& rhs);
466
473bool KUDU_EXPORT operator>(const MonoTime& lhs, const MonoTime& rhs);
474
481bool KUDU_EXPORT operator>=(const MonoTime& lhs, const MonoTime& rhs);
483
486
494MonoTime KUDU_EXPORT operator+(const MonoTime& t, const MonoDelta& delta);
495
503MonoTime KUDU_EXPORT operator-(const MonoTime& t, const MonoDelta& delta);
504
515MonoDelta KUDU_EXPORT operator-(const MonoTime& t_end, const MonoTime& t_begin);
517
519
530std::ostream& operator<<(std::ostream& os, const kudu::MonoTime& time);
532
533} // namespace kudu
534
535#endif
friend MonoDelta operator+(const MonoDelta &, const MonoDelta &)
int64_t ToNanoseconds() const
MonoDelta & operator-=(const MonoDelta &delta)
MonoDelta & operator+=(const MonoDelta &delta)
void ToTimeVal(struct timeval *tv) const
bool Initialized() const
friend MonoDelta operator-(const MonoDelta &, const MonoDelta &)
int64_t ToMicroseconds() const
static void NanosToTimeSpec(int64_t nanos, struct timespec *ts)
bool LessThan(const MonoDelta &rhs) const
friend bool operator<(const MonoDelta &, const MonoDelta &)
friend bool operator>(const MonoDelta &, const MonoDelta &)
static MonoDelta FromSeconds(double seconds)
std::string ToString() const
int64_t ToMilliseconds() const
friend bool operator==(const MonoDelta &, const MonoDelta &)
double ToSeconds() const
static MonoDelta FromMilliseconds(int64_t ms)
static MonoDelta FromMicroseconds(int64_t us)
void ToTimeSpec(struct timespec *ts) const
bool MoreThan(const MonoDelta &rhs) const
static MonoDelta FromNanoseconds(int64_t ns)
bool Equals(const MonoDelta &rhs) const
bool ComesBefore(const MonoTime &rhs) const
void AddDelta(const MonoDelta &delta)
static MonoTime Max()
MonoTime() KUDU_MONOTIME_NOEXCEPT
bool Equals(const MonoTime &other) const
static const int64_t kNanosecondsPerSecond
Nanoseconds per second.
Definition monotime.h:217
static MonoTime Now()
std::string ToString() const
void ToTimeSpec(struct timespec *ts) const
static const int64_t kNanosecondsPerMicrosecond
Nanoseconds per microseconds.
Definition monotime.h:223
bool Initialized() const
static const int64_t kNanosecondsPerMillisecond
Nanoseconds per millisecond.
Definition monotime.h:220
static MonoTime Min()
static const int64_t kMicrosecondsPerSecond
Microseconds per second.
Definition monotime.h:226
MonoDelta GetDeltaSince(const MonoTime &rhs) const
static const MonoTime & Earliest(const MonoTime &a, const MonoTime &b)