3#ifndef TETL_CHRONO_DURATION_CAST_HPP
4#define TETL_CHRONO_DURATION_CAST_HPP
18template <
typename Rep,
typename Period>
19struct is_duration<etl::chrono::duration<Rep, Period>> :
etl::true_type { };
24template <
typename ToDuration,
typename CF,
typename CR,
bool NumIsOne = false,
bool DenIsOne = false>
25struct duration_cast_impl {
26 template <
typename Rep,
typename Period>
27 [[nodiscard]]
static constexpr auto cast(duration<Rep, Period>
const& duration)
30 using to_rep =
typename ToDuration::rep;
32 static_cast<to_rep
>(
static_cast<CR
>(duration.count()) *
static_cast<CR
>(CF::num) /
static_cast<CR
>(CF::den))
37template <
typename ToDuration,
typename CF,
typename CR>
38struct duration_cast_impl<ToDuration, CF, CR, true, false> {
39 template <
typename Rep,
typename Period>
40 [[nodiscard]]
static constexpr auto cast(duration<Rep, Period>
const& duration)
43 using to_rep =
typename ToDuration::rep;
44 return ToDuration(
static_cast<to_rep
>(
static_cast<CR
>(duration.count()) /
static_cast<CR
>(CF::den)));
48template <
typename ToDuration,
typename CF,
typename CR>
49struct duration_cast_impl<ToDuration, CF, CR, false, true> {
50 template <
typename Rep,
typename Period>
51 [[nodiscard]]
static constexpr auto cast(duration<Rep, Period>
const& duration)
54 using to_rep =
typename ToDuration::rep;
55 return ToDuration(
static_cast<to_rep
>(
static_cast<CR
>(duration.count()) *
static_cast<CR
>(CF::num)));
59template <
typename ToDuration,
typename CF,
typename CR>
60struct duration_cast_impl<ToDuration, CF, CR, true, true> {
61 template <
typename Rep,
typename Period>
62 [[nodiscard]]
static constexpr auto cast(duration<Rep, Period>
const& duration)
65 using to_rep =
typename ToDuration::rep;
66 return ToDuration(
static_cast<to_rep
>(duration.count()));
75template <
typename ToDur,
typename Rep,
typename Period>
76 requires(detail::is_duration_v<ToDur>)
80 using detail::duration_cast_impl;
83 using impl = duration_cast_impl<ToDur, cf, cr, cf::num == 1, cf::den == 1>;
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:77
ratio< R1::num *R2::den, R1::den *R2::num > ratio_divide
The alias template ratio_divide denotes the result of dividing two exact rational fractions represent...
Definition ratio_divide.hpp:15
bool_constant< true > true_type
Definition bool_constant.hpp:13
constexpr bool is_arithmetic_v
Definition is_arithmetic.hpp:21
typename common_type< T... >::type common_type_t
Definition common_type.hpp:50
bool_constant< false > false_type
Definition bool_constant.hpp:14
constexpr duration() noexcept=default
static constexpr bool value
Definition integral_constant.hpp:10