4#ifndef TETL_CHRONO_DURATION_CAST_HPP
5#define TETL_CHRONO_DURATION_CAST_HPP
7#include <etl/_chrono/duration.hpp>
8#include <etl/_chrono/treat_as_floating_point.hpp>
9#include <etl/_type_traits/bool_constant.hpp>
10#include <etl/_type_traits/common_type.hpp>
11#include <etl/_type_traits/is_arithmetic.hpp>
17struct is_duration :
etl::false_type { };
19template <
typename Rep,
typename Period>
23inline constexpr auto is_duration_v = is_duration<T>::value;
25template <
typename ToDuration,
typename CF,
typename CR,
bool NumIsOne =
false,
bool DenIsOne =
false>
26struct duration_cast_impl {
27 template <
typename Rep,
typename Period>
28 [[nodiscard]]
static constexpr auto cast(
29 duration<Rep, Period>
const& duration
30 )
noexcept(is_arithmetic_v<Rep>
and is_arithmetic_v<
typename ToDuration::rep>) -> ToDuration
32 using to_rep =
typename ToDuration::rep;
34 static_cast<to_rep>(
static_cast<CR>(duration.count()) *
static_cast<CR>(CF::num) /
static_cast<CR>(CF::den))
39template <
typename ToDuration,
typename CF,
typename CR>
40struct duration_cast_impl<ToDuration, CF, CR,
true,
false> {
41 template <
typename Rep,
typename Period>
42 [[nodiscard]]
static constexpr auto cast(
43 duration<Rep, Period>
const& duration
44 )
noexcept(is_arithmetic_v<Rep>
and is_arithmetic_v<
typename ToDuration::rep>) -> ToDuration
46 using to_rep =
typename ToDuration::rep;
47 return ToDuration(
static_cast<to_rep>(
static_cast<CR>(duration.count()) /
static_cast<CR>(CF::den)));
51template <
typename ToDuration,
typename CF,
typename CR>
52struct duration_cast_impl<ToDuration, CF, CR,
false,
true> {
53 template <
typename Rep,
typename Period>
54 [[nodiscard]]
static constexpr auto cast(
55 duration<Rep, Period>
const& duration
56 )
noexcept(is_arithmetic_v<Rep>
and is_arithmetic_v<
typename ToDuration::rep>) -> ToDuration
58 using to_rep =
typename ToDuration::rep;
59 return ToDuration(
static_cast<to_rep>(
static_cast<CR>(duration.count()) *
static_cast<CR>(CF::num)));
63template <
typename ToDuration,
typename CF,
typename CR>
64struct duration_cast_impl<ToDuration, CF, CR,
true,
true> {
65 template <
typename Rep,
typename Period>
66 [[nodiscard]]
static constexpr auto cast(
67 duration<Rep, Period>
const& duration
68 )
noexcept(is_arithmetic_v<Rep>
and is_arithmetic_v<
typename ToDuration::rep>) -> ToDuration
70 using to_rep =
typename ToDuration::rep;
71 return ToDuration(
static_cast<to_rep>(duration.count()));
80template <
typename ToDur,
typename Rep,
typename Period>
81 requires(detail::is_duration_v<ToDur>)
83 duration<Rep, Period>
const& duration
86 using detail::duration_cast_impl;
87 using cf = ratio_divide<Period,
typename ToDur::period>;
88 using cr = common_type_t<
typename ToDur::rep, Rep, intmax_t>;
89 using impl = duration_cast_impl<ToDur, cf, cr, cf::num == 1, cf::den == 1>;
90 return impl::cast(duration);
constexpr auto duration_cast(duration< Rep, Period > const &duration) noexcept(is_arithmetic_v< Rep > and is_arithmetic_v< typename ToDur::rep >) -> ToDur
Converts a duration to a duration of different type ToDur.
Definition duration_cast.hpp:82
Definition adjacent_find.hpp:9
Class template etl::chrono::duration represents a time interval.
Definition duration.hpp:32