iceoryx_doc  1.0.1
duration.hpp
1 // Copyright (c) 2019, 2021 by Robert Bosch GmbH, Apex.AI Inc. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // SPDX-License-Identifier: Apache-2.0
16 #ifndef IOX_UTILS_UNITS_DURATION_HPP
17 #define IOX_UTILS_UNITS_DURATION_HPP
18 
19 #include "iceoryx_utils/cxx/expected.hpp"
20 #include "iceoryx_utils/cxx/smart_c.hpp"
21 #include "iceoryx_utils/platform/time.hpp" // required for QNX
22 
23 #include <chrono>
24 #include <cmath>
25 #include <iostream>
26 #include <numeric>
27 
28 namespace iox
29 {
30 namespace units
31 {
32 enum class TimeSpecReference
33 {
34  None,
35  Epoch,
36  Monotonic
37 };
38 
39 class Duration;
40 
41 inline namespace duration_literals
42 {
44 constexpr Duration operator"" _ns(unsigned long long int) noexcept; // PRQA S 48
45 
47 constexpr Duration operator"" _us(unsigned long long int) noexcept; // PRQA S 48
48 
50 constexpr Duration operator"" _ms(unsigned long long int) noexcept; // PRQA S 48
51 
53 constexpr Duration operator"" _s(unsigned long long int) noexcept; // PRQA S 48
54 
56 constexpr Duration operator"" _m(unsigned long long int) noexcept; // PRQA S 48
57 
59 constexpr Duration operator"" _h(unsigned long long int) noexcept; // PRQA S 48
60 
62 constexpr Duration operator"" _d(unsigned long long int) noexcept; // PRQA S 48
63 } // namespace duration_literals
64 
76 class Duration
77 {
78  public:
79  // BEGIN CREATION FROM STATIC FUNCTIONS
80 
86  template <typename T>
87  static constexpr Duration fromNanoseconds(const T value) noexcept;
88 
94  template <typename T>
95  static constexpr Duration fromMicroseconds(const T value) noexcept;
96 
102  template <typename T>
103  static constexpr Duration fromMilliseconds(const T value) noexcept;
104 
110  template <typename T>
111  static constexpr Duration fromSeconds(const T value) noexcept;
112 
118  template <typename T>
119  static constexpr Duration fromMinutes(const T value) noexcept;
120 
126  template <typename T>
127  static constexpr Duration fromHours(const T value) noexcept;
128 
134  template <typename T>
135  static constexpr Duration fromDays(const T value) noexcept;
136 
137  // END CREATION FROM STATIC FUNCTIONS
138 
139  // BEGIN CONSTRUCTORS AND ASSIGNMENT
140 
143  constexpr explicit Duration(const struct timeval& value) noexcept;
144 
147  constexpr explicit Duration(const struct timespec& value) noexcept;
148 
152  constexpr explicit Duration(const struct itimerspec& value) noexcept;
153 
157  constexpr explicit Duration(const std::chrono::milliseconds& value) noexcept;
158 
162  constexpr explicit Duration(const std::chrono::nanoseconds& value) noexcept;
163 
168  Duration& operator=(const std::chrono::milliseconds& rhs) noexcept;
169 
170  // END CONSTRUCTORS AND ASSIGNMENT
171 
172  // BEGIN COMPARISON
173 
177  constexpr bool operator==(const Duration& rhs) const noexcept;
178 
182  constexpr bool operator!=(const Duration& rhs) const noexcept;
183 
187  constexpr bool operator<(const Duration& rhs) const noexcept;
188 
192  constexpr bool operator<=(const Duration& rhs) const noexcept;
193 
197  constexpr bool operator>(const Duration& rhs) const noexcept;
198 
202  constexpr bool operator>=(const Duration& rhs) const noexcept;
203 
204  // END COMPARISON
205 
206  // BEGIN ARITHMETIC
207 
211  constexpr Duration operator+(const Duration& rhs) const noexcept;
212 
217  constexpr Duration operator-(const Duration& rhs) const noexcept;
218 
228  template <typename T>
229  constexpr Duration operator*(const T& rhs) const noexcept;
230 
231  // END ARITHMETIC
232 
233  // BEGIN CONVERSION
234 
238  constexpr uint64_t toNanoseconds() const noexcept;
239 
244  constexpr uint64_t toMicroseconds() const noexcept;
245 
250  constexpr uint64_t toMilliseconds() const noexcept;
251 
254  constexpr uint64_t toSeconds() const noexcept;
255 
258  constexpr uint64_t toMinutes() const noexcept;
259 
262  constexpr uint64_t toHours() const noexcept;
263 
266  constexpr uint64_t toDays() const noexcept;
267 
269  struct timespec timespec(const TimeSpecReference& reference = TimeSpecReference::None) const noexcept;
270 
274  constexpr operator struct timeval() const noexcept;
275 
276  // END CONVERSION
277 
278  friend constexpr Duration duration_literals::operator"" _ns(unsigned long long int) noexcept; // PRQA S 48
279  friend constexpr Duration duration_literals::operator"" _us(unsigned long long int) noexcept; // PRQA S 48
280  friend constexpr Duration duration_literals::operator"" _ms(unsigned long long int) noexcept; // PRQA S 48
281  friend constexpr Duration duration_literals::operator"" _s(unsigned long long int) noexcept; // PRQA S 48
282  friend constexpr Duration duration_literals::operator"" _m(unsigned long long int) noexcept; // PRQA S 48
283  friend constexpr Duration duration_literals::operator"" _h(unsigned long long int) noexcept; // PRQA S 48
284  friend constexpr Duration duration_literals::operator"" _d(unsigned long long int) noexcept; // PRQA S 48
285 
286  template <typename T>
287  friend constexpr Duration operator*(const T& lhs, const Duration& rhs) noexcept;
288 
289  friend std::ostream& operator<<(std::ostream& stream, const Duration& t) noexcept;
290 
291  static constexpr uint32_t SECS_PER_MINUTE{60U};
292  static constexpr uint32_t SECS_PER_HOUR{3600U};
293  static constexpr uint32_t HOURS_PER_DAY{24U};
294 
295  static constexpr uint32_t MILLISECS_PER_SEC{1000U};
296  static constexpr uint32_t MICROSECS_PER_SEC{MILLISECS_PER_SEC * 1000U};
297 
298  static constexpr uint32_t NANOSECS_PER_MICROSEC{1000U};
299  static constexpr uint32_t NANOSECS_PER_MILLISEC{NANOSECS_PER_MICROSEC * 1000U};
300  static constexpr uint32_t NANOSECS_PER_SEC{NANOSECS_PER_MILLISEC * 1000U};
301 
302  protected:
303  using Seconds_t = uint64_t;
304  using Nanoseconds_t = uint32_t;
305 
310  constexpr Duration(const Seconds_t seconds, const Nanoseconds_t nanoseconds) noexcept;
311 
314  static constexpr Duration createDuration(const Seconds_t seconds, const Nanoseconds_t nanoseconds) noexcept;
315 
316  static constexpr Duration max() noexcept;
317  static constexpr Duration zero() noexcept;
318 
319  private:
320  template <typename T, typename String>
321  static constexpr unsigned long long int positiveValueOrClampToZero(const T value, const String fromMethod) noexcept;
322 
323  template <typename T>
324  constexpr Duration fromFloatingPointSeconds(const T floatingPointSeconds) const noexcept;
325  template <typename From, typename To>
326  constexpr bool wouldCastFromFloatingPointProbablyOverflow(const From floatingPoint) const noexcept;
327 
328  template <typename T>
329  constexpr Duration multiplyWith(const std::enable_if_t<!std::is_floating_point<T>::value, T>& rhs) const noexcept;
330 
331  template <typename T>
332  constexpr Duration multiplyWith(const std::enable_if_t<std::is_floating_point<T>::value, T>& rhs) const noexcept;
333 
334  private:
335  Seconds_t m_seconds{0U};
336  Nanoseconds_t m_nanoseconds{0U};
337 };
338 
345 template <typename T>
346 constexpr Duration operator*(const T& lhs, const Duration& rhs) noexcept;
347 
349 std::ostream& operator<<(std::ostream& stream, const Duration& t) noexcept;
350 
351 } // namespace units
352 } // namespace iox
353 
354 #include "iceoryx_utils/internal/units/duration.inl"
355 
356 #endif // IOX_UTILS_UNITS_DURATION_HPP
Definition: duration.hpp:77
constexpr Duration operator+(const Duration &rhs) const noexcept
Creates Duration object by addition.
Definition: duration.inl:261
constexpr bool operator>=(const Duration &rhs) const noexcept
Greater than or equal to operator.
Definition: duration.inl:256
constexpr Duration operator*(const T &rhs) const noexcept
Creates Duration object by multiplication.
Definition: duration.inl:443
constexpr uint64_t toNanoseconds() const noexcept
returns the duration in nanoseconds
Definition: duration.inl:144
constexpr Duration operator-(const Duration &rhs) const noexcept
Creates Duration object by subtraction.
Definition: duration.inl:281
struct timespec timespec(const TimeSpecReference &reference=TimeSpecReference::None) const noexcept
converts duration in a timespec c struct
constexpr bool operator<(const Duration &rhs) const noexcept
Less than operator.
Definition: duration.inl:241
constexpr uint64_t toMicroseconds() const noexcept
returns the duration in microseconds
Definition: duration.inl:161
constexpr Duration(const struct timeval &value) noexcept
Construct a Duration object from timeval.
Definition: duration.inl:113
static constexpr Duration fromMicroseconds(const T value) noexcept
Constructs a new Duration object from microseconds.
Definition: duration.inl:83
constexpr bool operator==(const Duration &rhs) const noexcept
Equal to operator.
Definition: duration.inl:231
static constexpr Duration fromHours(const T value) noexcept
Constructs a new Duration object from hours.
Definition: duration.inl:103
static constexpr Duration fromMilliseconds(const T value) noexcept
Constructs a new Duration object from milliseconds.
Definition: duration.inl:88
static constexpr Duration fromDays(const T value) noexcept
Constructs a new Duration object from days.
Definition: duration.inl:108
constexpr uint64_t toDays() const noexcept
returns the duration in days
Definition: duration.inl:212
Duration & operator=(const std::chrono::milliseconds &rhs) noexcept
Assigns a std::chrono::milliseconds to an duration object.
Definition: duration.inl:138
constexpr bool operator>(const Duration &rhs) const noexcept
Greater than operator.
Definition: duration.inl:251
static constexpr Duration fromSeconds(const T value) noexcept
Constructs a new Duration object from seconds.
Definition: duration.inl:93
constexpr bool operator!=(const Duration &rhs) const noexcept
Not equal to operator.
Definition: duration.inl:236
constexpr uint64_t toSeconds() const noexcept
returns the duration in seconds
Definition: duration.inl:197
static constexpr Duration fromNanoseconds(const T value) noexcept
Constructs a new Duration object from nanoseconds.
Definition: duration.inl:78
constexpr uint64_t toMilliseconds() const noexcept
returns the duration in milliseconds
Definition: duration.inl:179
static constexpr Duration fromMinutes(const T value) noexcept
Constructs a new Duration object from minutes.
Definition: duration.inl:98
static constexpr Duration createDuration(const Seconds_t seconds, const Nanoseconds_t nanoseconds) noexcept
Definition: duration.inl:47
constexpr uint64_t toHours() const noexcept
returns the duration in hours
Definition: duration.inl:207
constexpr bool operator<=(const Duration &rhs) const noexcept
Less than or equal to operator.
Definition: duration.inl:246
constexpr uint64_t toMinutes() const noexcept
returns the duration in minutes
Definition: duration.inl:202
building block to easily create free function for logging in a library context
Definition: lockfree_queue.hpp:28