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 <string>
25 
26 #ifdef KUDU_HEADERS_NO_STUBS
27 #include <gtest/gtest_prod.h>
28 
29 #include "kudu/gutil/port.h"
30 #else
31 // This is a poor module interdependency, but the stubs are header-only and
32 // it's only for exported header builds, so we'll make an exception.
33 #include "kudu/client/stubs.h"
34 #endif
35 
36 #include "kudu/util/kudu_export.h"
37 
38 
39 // The 'noexcept' specifier is recognized by a C++11-capable compiler, but this
40 // file is targeted to compile by C++-98 compiler as well. As it turns out,
41 // adding 'noexcept' doesn't affect the generated symbols in the exported
42 // MonoTime class, so it's safe to turn it on when compiling in the C++11 mode.
43 // The 'noexcept' specified is useful in cases when wrapping MonoTime into
44 // std::atomic<> and the standard C++ library explicitly requires that.
45 #ifdef LANG_CXX11
46 #define KUDU_MONOTIME_NOEXCEPT noexcept
47 #else
48 #define KUDU_MONOTIME_NOEXCEPT
49 #endif // #ifdef LANG_CXX11 ... #else ...
50 
51 namespace kudu {
52 
57 class KUDU_EXPORT MonoDelta {
58  public:
61 
66  static MonoDelta FromSeconds(double seconds);
67 
72  static MonoDelta FromMilliseconds(int64_t ms);
73 
78  static MonoDelta FromMicroseconds(int64_t us);
79 
84  static MonoDelta FromNanoseconds(int64_t ns);
86 
92 
94  bool Initialized() const;
95 
102  bool LessThan(const MonoDelta &rhs) const;
103 
110  bool MoreThan(const MonoDelta &rhs) const;
111 
119  bool Equals(const MonoDelta &rhs) const;
120 
122  std::string ToString() const;
123 
126 
128  double ToSeconds() const;
129  int64_t ToMilliseconds() const;
130  int64_t ToMicroseconds() const;
131  int64_t ToNanoseconds() const;
133 
139  void ToTimeVal(struct timeval *tv) const;
140 
146  void ToTimeSpec(struct timespec* ts) const;
147 
154  static void NanosToTimeSpec(int64_t nanos, struct timespec* ts);
155 
158 
165 
173 
174  private:
175  static const int64_t kUninitialized;
176 
177  friend class MonoTime;
178 
179  friend MonoDelta operator-(const class MonoTime&, const class MonoTime&);
180  friend MonoDelta operator-(const MonoDelta&, const MonoDelta&);
181  friend MonoDelta operator+(const MonoDelta&, const MonoDelta&);
182 
183  FRIEND_TEST(TestMonoTime, TestDeltaConversions);
184 
185  explicit MonoDelta(int64_t delta);
186  int64_t nano_delta_;
187 };
188 
196 class KUDU_EXPORT MonoTime {
197  public:
200 
202  static const int64_t kNanosecondsPerSecond = 1000000000L;
203 
205  static const int64_t kNanosecondsPerMillisecond = 1000000L;
206 
208  static const int64_t kNanosecondsPerMicrosecond = 1000L;
209 
211  static const int64_t kMicrosecondsPerSecond = 1000000L;
213 
217  static MonoTime Now();
218 
220  static MonoTime Max();
221 
223  static MonoTime Min();
224 
234  static const MonoTime& Earliest(const MonoTime& a, const MonoTime& b)
235  ATTRIBUTE_DEPRECATED("use std::min() instead");
236 
239  MonoTime() KUDU_MONOTIME_NOEXCEPT;
240 
242  bool Initialized() const;
243 
254  MonoDelta GetDeltaSince(const MonoTime &rhs) const ATTRIBUTE_DEPRECATED(
255  "use kudu::operator-(const MonoTime&, const MonoTime&) instead");
256 
261  void AddDelta(const MonoDelta &delta);
262 
270  bool ComesBefore(const MonoTime &rhs) const;
271 
273  std::string ToString() const;
274 
280  void ToTimeSpec(struct timespec* ts) const;
281 
288  bool Equals(const MonoTime& other) const;
289 
292 
298  MonoTime& operator+=(const MonoDelta& delta);
299 
305  MonoTime& operator-=(const MonoDelta& delta);
307 
308  private:
309  friend class MonoDelta;
310  friend MonoDelta operator-(const MonoTime&, const MonoTime&);
311  FRIEND_TEST(TestMonoTime, TestTimeSpec);
312  FRIEND_TEST(TestMonoTime, TestDeltaConversions);
313 
314  explicit MonoTime(const struct timespec& ts) KUDU_MONOTIME_NOEXCEPT;
315  explicit MonoTime(int64_t nanos) KUDU_MONOTIME_NOEXCEPT;
316  double ToSeconds() const;
317  int64_t nanos_;
318 };
319 
330 void KUDU_EXPORT SleepFor(const MonoDelta& delta);
331 
334 
341 bool KUDU_EXPORT operator==(const MonoDelta &lhs, const MonoDelta &rhs);
342 
349 bool KUDU_EXPORT operator!=(const MonoDelta &lhs, const MonoDelta &rhs);
350 
357 bool KUDU_EXPORT operator<(const MonoDelta &lhs, const MonoDelta &rhs);
358 
365 bool KUDU_EXPORT operator<=(const MonoDelta &lhs, const MonoDelta &rhs);
366 
373 bool KUDU_EXPORT operator>(const MonoDelta &lhs, const MonoDelta &rhs);
374 
381 bool KUDU_EXPORT operator>=(const MonoDelta &lhs, const MonoDelta &rhs);
382 
388 MonoDelta KUDU_EXPORT operator-(const MonoDelta& lhs, const MonoDelta& rhs);
389 
395 MonoDelta KUDU_EXPORT operator+(const MonoDelta& lhs, const MonoDelta& rhs);
397 
400 
411 bool KUDU_EXPORT operator==(const MonoTime& lhs, const MonoTime& rhs);
412 
424 bool KUDU_EXPORT operator!=(const MonoTime& lhs, const MonoTime& rhs);
425 
432 bool KUDU_EXPORT operator<(const MonoTime& lhs, const MonoTime& rhs);
433 
440 bool KUDU_EXPORT operator<=(const MonoTime& lhs, const MonoTime& rhs);
441 
448 bool KUDU_EXPORT operator>(const MonoTime& lhs, const MonoTime& rhs);
449 
456 bool KUDU_EXPORT operator>=(const MonoTime& lhs, const MonoTime& rhs);
458 
461 
469 MonoTime KUDU_EXPORT operator+(const MonoTime& t, const MonoDelta& delta);
470 
478 MonoTime KUDU_EXPORT operator-(const MonoTime& t, const MonoDelta& delta);
479 
490 MonoDelta KUDU_EXPORT operator-(const MonoTime& t_end, const MonoTime& t_begin);
492 
493 } // namespace kudu
494 
495 #endif
kudu::MonoDelta::Initialized
bool Initialized() const
kudu::MonoDelta::ToNanoseconds
int64_t ToNanoseconds() const
kudu::MonoDelta::ToString
std::string ToString() const
kudu::MonoDelta::operator-
friend MonoDelta operator-(const MonoDelta &, const MonoDelta &)
kudu::MonoDelta::ToTimeVal
void ToTimeVal(struct timeval *tv) const
kudu::MonoDelta::FromSeconds
static MonoDelta FromSeconds(double seconds)
kudu::MonoDelta::operator+
friend MonoDelta operator+(const MonoDelta &, const MonoDelta &)
kudu::MonoDelta::Equals
bool Equals(const MonoDelta &rhs) const
kudu::MonoDelta::NanosToTimeSpec
static void NanosToTimeSpec(int64_t nanos, struct timespec *ts)
kudu::MonoDelta::FromMicroseconds
static MonoDelta FromMicroseconds(int64_t us)
kudu::MonoTime
Representation of a particular point in time.
Definition: monotime.h:196
kudu::MonoDelta::operator+=
MonoDelta & operator+=(const MonoDelta &delta)
kudu::MonoDelta::ToMicroseconds
int64_t ToMicroseconds() const
kudu::MonoTime::Max
static MonoTime Max()
kudu::MonoDelta::ToSeconds
double ToSeconds() const
kudu::MonoDelta::LessThan
bool LessThan(const MonoDelta &rhs) const
kudu::MonoDelta::FromNanoseconds
static MonoDelta FromNanoseconds(int64_t ns)
kudu::MonoDelta
A representation of a time interval.
Definition: monotime.h:57
kudu::MonoDelta::ToTimeSpec
void ToTimeSpec(struct timespec *ts) const
kudu::MonoDelta::MonoDelta
MonoDelta()
kudu::MonoDelta::ToMilliseconds
int64_t ToMilliseconds() const
kudu::MonoTime::Now
static MonoTime Now()
kudu::MonoDelta::FromMilliseconds
static MonoDelta FromMilliseconds(int64_t ms)
kudu::MonoDelta::operator-=
MonoDelta & operator-=(const MonoDelta &delta)
kudu::MonoTime::Min
static MonoTime Min()
kudu::MonoDelta::MoreThan
bool MoreThan(const MonoDelta &rhs) const