tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
duration_cast.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_CHRONO_DURATION_CAST_HPP
4#define TETL_CHRONO_DURATION_CAST_HPP
5
11
12namespace etl::chrono {
13
14namespace detail {
15template <typename T>
16struct is_duration : etl::false_type { };
17
18template <typename Rep, typename Period>
19struct is_duration<etl::chrono::duration<Rep, Period>> : etl::true_type { };
20
21template <typename T>
22inline constexpr auto is_duration_v = is_duration<T>::value;
23
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)
29 {
30 using to_rep = typename ToDuration::rep;
31 return ToDuration(
32 static_cast<to_rep>(static_cast<CR>(duration.count()) * static_cast<CR>(CF::num) / static_cast<CR>(CF::den))
33 );
34 }
35};
36
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)
42 {
43 using to_rep = typename ToDuration::rep;
44 return ToDuration(static_cast<to_rep>(static_cast<CR>(duration.count()) / static_cast<CR>(CF::den)));
45 }
46};
47
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)
53 {
54 using to_rep = typename ToDuration::rep;
55 return ToDuration(static_cast<to_rep>(static_cast<CR>(duration.count()) * static_cast<CR>(CF::num)));
56 }
57};
58
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)
64 {
65 using to_rep = typename ToDuration::rep;
66 return ToDuration(static_cast<to_rep>(duration.count()));
67 }
68};
69
70} // namespace detail
71
75template <typename ToDur, typename Rep, typename Period>
76 requires(detail::is_duration_v<ToDur>)
77[[nodiscard]] constexpr auto duration_cast(duration<Rep, Period> const& duration)
79{
80 using detail::duration_cast_impl;
83 using impl = duration_cast_impl<ToDur, cf, cr, cf::num == 1, cf::den == 1>;
84 return impl::cast(duration);
85}
86
87} // namespace etl::chrono
88
89#endif // TETL_CHRONO_DURATION_CAST_HPP
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
Definition abs.hpp:11
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
static constexpr bool value
Definition integral_constant.hpp:10