1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use crate::{ConversionError, Period};
use core::{convert::TryFrom, convert::TryInto, fmt};
/// The core inner-type trait for time-related types
pub trait TimeInt:
Copy
+ num::Integer
+ num::Bounded
+ num::traits::WrappingAdd
+ num::traits::WrappingSub
+ num::CheckedAdd
+ num::CheckedSub
+ num::CheckedMul
+ num::CheckedDiv
+ From<u32>
+ TryFrom<u32>
+ TryInto<u32>
+ TryFrom<u64>
+ TryInto<u64>
+ Into<u64>
+ TryFrom<u128>
+ fmt::Display
+ fmt::Debug
{
/// Checked integer * [`Period`] = integer
///
/// Returns truncated integer
///
/// # Examples
///
/// ```rust
/// # use embedded_time::{Period, traits::*};
/// assert_eq!(8_u32.checked_mul_period(&<Period>::new(1,2)), Ok(4_u32));
///
/// // the result is not rounded, but truncated
/// assert_eq!(8_u32.checked_mul_period(&<Period>::new(1,3)), Ok(2_u32));
/// ```
fn checked_mul_period(&self, period: &Period) -> Result<Self, ConversionError> {
<Self as num::CheckedDiv>::checked_div(
&<Self as num::CheckedMul>::checked_mul(&self, &(*period.numerator()).into())
.ok_or(ConversionError::Overflow)?,
&(*period.denominator()).into(),
)
.ok_or(ConversionError::DivByZero)
}
/// Checked integer / [`Period`] = integer
///
/// Returns truncated integer
///
/// # Examples
///
/// ```rust
/// # use embedded_time::{Period, traits::*};
/// assert_eq!(8_u32.checked_div_period(&<Period>::new(1,2)), Ok(16_u32));
/// assert_eq!(8_u32.checked_div_period(&<Period>::new(3,2)), Ok(5_u32));
/// ```
fn checked_div_period(&self, period: &Period) -> Result<Self, ConversionError> {
<Self as num::CheckedDiv>::checked_div(
&<Self as num::CheckedMul>::checked_mul(&self, &(*period.denominator()).into())
.ok_or(ConversionError::Overflow)?,
&(*period.numerator()).into(),
)
.ok_or(ConversionError::DivByZero)
}
}
impl TimeInt for u32 {}
impl TimeInt for u64 {}