Kudu C++ client API
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 
52 namespace kudu {
53 
58 class 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 
211 class 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 
355 void KUDU_EXPORT SleepFor(const MonoDelta& delta);
356 
359 
366 bool KUDU_EXPORT operator==(const MonoDelta& lhs, const MonoDelta& rhs);
367 
374 bool KUDU_EXPORT operator!=(const MonoDelta& lhs, const MonoDelta& rhs);
375 
382 bool KUDU_EXPORT operator<(const MonoDelta& lhs, const MonoDelta& rhs);
383 
390 bool KUDU_EXPORT operator<=(const MonoDelta& lhs, const MonoDelta& rhs);
391 
398 bool KUDU_EXPORT operator>(const MonoDelta& lhs, const MonoDelta& rhs);
399 
406 bool KUDU_EXPORT operator>=(const MonoDelta& lhs, const MonoDelta& rhs);
407 
413 MonoDelta KUDU_EXPORT operator-(const MonoDelta& lhs, const MonoDelta& rhs);
414 
420 MonoDelta KUDU_EXPORT operator+(const MonoDelta& lhs, const MonoDelta& rhs);
422 
425 
436 bool KUDU_EXPORT operator==(const MonoTime& lhs, const MonoTime& rhs);
437 
449 bool KUDU_EXPORT operator!=(const MonoTime& lhs, const MonoTime& rhs);
450 
457 bool KUDU_EXPORT operator<(const MonoTime& lhs, const MonoTime& rhs);
458 
465 bool KUDU_EXPORT operator<=(const MonoTime& lhs, const MonoTime& rhs);
466 
473 bool KUDU_EXPORT operator>(const MonoTime& lhs, const MonoTime& rhs);
474 
481 bool KUDU_EXPORT operator>=(const MonoTime& lhs, const MonoTime& rhs);
483 
486 
494 MonoTime KUDU_EXPORT operator+(const MonoTime& t, const MonoDelta& delta);
495 
503 MonoTime KUDU_EXPORT operator-(const MonoTime& t, const MonoDelta& delta);
504 
515 MonoDelta KUDU_EXPORT operator-(const MonoTime& t_end, const MonoTime& t_begin);
517 
519 
530 std::ostream& operator<<(std::ostream& os, const kudu::MonoTime& time);
532 
533 } // namespace kudu
534 
535 #endif
A representation of a time interval.
Definition: monotime.h:58
friend MonoDelta operator+(const MonoDelta &, const MonoDelta &)
int64_t ToNanoseconds() const
void ToTimeVal(struct timeval *tv) const
bool Initialized() const
friend bool operator==(const MonoDelta &, const MonoDelta &)
int64_t ToMicroseconds() const
static void NanosToTimeSpec(int64_t nanos, struct timespec *ts)
bool LessThan(const MonoDelta &rhs) const
static MonoDelta FromSeconds(double seconds)
std::string ToString() const
MonoDelta & operator+=(const MonoDelta &delta)
friend MonoDelta operator-(const MonoDelta &, const MonoDelta &)
MonoDelta & operator-=(const MonoDelta &delta)
friend bool operator>(const MonoDelta &, const MonoDelta &)
int64_t ToMilliseconds() const
double ToSeconds() const
static MonoDelta FromMilliseconds(int64_t ms)
static MonoDelta FromMicroseconds(int64_t us)
friend bool operator<(const MonoDelta &, const MonoDelta &)
void ToTimeSpec(struct timespec *ts) const
bool MoreThan(const MonoDelta &rhs) const
static MonoDelta FromNanoseconds(int64_t ns)
bool Equals(const MonoDelta &rhs) const
Representation of a particular point in time.
Definition: monotime.h:211
static MonoTime Max()
MonoTime() KUDU_MONOTIME_NOEXCEPT
static MonoTime Now()
static const MonoTime & Earliest(const MonoTime &a, const MonoTime &b)
static MonoTime Min()