fiber
Loading...
Searching...
No Matches
rounding_duration_cast.hpp
Go to the documentation of this file.
1#pragma once
2
3namespace fiber
4{
5
6 enum class RoundingMethod{
10 };
11
15 template<class ToDuration, RoundingMethod rounding_type = RoundingMethod::Up, class Rep = unsigned int, fiber::CRatio Period = std::ratio<1>>
16 constexpr ToDuration rounding_duration_cast( const std::chrono::duration<Rep, Period>& d ){
17 using conversion = typename std::ratio_divide<Period, typename ToDuration::period>::type;
18 if constexpr (rounding_type == RoundingMethod::Nearest){
19 if constexpr (std::is_unsigned_v<Rep>){
20 const auto mul = d.count() * conversion::num;
21 const auto round = mul + conversion::den/2;
22 const auto new_count = round / conversion::den;
23 ToDuration result(static_cast<ToDuration::rep>(new_count));
24 return result;
25 }else{
26 const auto mul = d.count() * conversion::num;
27 const auto round = ((d.count() > 0) ? (mul + conversion::den/2) : (mul - conversion::den/2));
28 const auto new_count = round / conversion::den;
29 ToDuration result(static_cast<ToDuration::rep>(new_count));
30 return result;
31 }
32 }else if constexpr (rounding_type == RoundingMethod::Up){
33 if constexpr (std::is_unsigned_v<Rep>){
34 const auto mul = d.count() * conversion::num;
35 const auto round = mul + (conversion::den-1);
36 const auto new_count = round / conversion::den;
37 ToDuration result(static_cast<ToDuration::rep>(new_count));
38 return result;
39 }else{
40 const auto mul = d.count() * conversion::num;
41 const auto round = ((d.count() > 0) ? (mul + (conversion::den-1)) : (mul - (conversion::den-1)));
42 const auto new_count = round / conversion::den;
43 ToDuration result(static_cast<ToDuration::rep>(new_count));
44 return result;
45 }
46 }else /*if constexpr (rounding_type == RoundingMethod::Down)*/{
47 const auto mul = d.count() * conversion::num;
48 const auto round = mul;
49 const auto new_count = round / conversion::den;
50 ToDuration result(static_cast<ToDuration::rep>(new_count));
51 return result;
52 }
53
54 }
55
56} // namespace fiber
57
Definition Duration.hpp:17
RoundingMethod
Definition rounding_duration_cast.hpp:6
@ Down
Definition rounding_duration_cast.hpp:8
@ Up
Definition rounding_duration_cast.hpp:7
@ Nearest
Definition rounding_duration_cast.hpp:9
constexpr ToDuration rounding_duration_cast(const std::chrono::duration< Rep, Period > &d)
duration cast that round to the nearest tick of the new ToDuration
Definition rounding_duration_cast.hpp:16