led/src/utils.rs

64 lines
1.6 KiB
Rust

use time::Instant;
pub fn digit_count(mut n: u32, b: u32) -> u32 {
let mut d = 0;
loop {
n /= b;
d += 1;
if n == 0 {
return d;
}
}
}
#[derive(Copy, Clone)]
pub struct Timer {
last_instant: Instant,
}
impl Timer {
pub fn new() -> Timer {
Timer {
last_instant: Instant::now(),
}
}
/// Marks a new tick time and returns the time elapsed in milliseconds since
/// the last call to tick().
pub fn tick(&mut self) -> u64 {
let n = self.elapsed();
self.last_instant = Instant::now();
n
}
/// Returns the time elapsed in milliseconds since the last call to tick().
pub fn elapsed(self) -> u64 {
self.last_instant.elapsed().whole_milliseconds() as u64
}
}
//=============================================================
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn digit_count_base_10() {
assert_eq!(digit_count(0, 10), 1);
assert_eq!(digit_count(9, 10), 1);
assert_eq!(digit_count(10, 10), 2);
assert_eq!(digit_count(99, 10), 2);
assert_eq!(digit_count(100, 10), 3);
assert_eq!(digit_count(999, 10), 3);
assert_eq!(digit_count(1000, 10), 4);
assert_eq!(digit_count(9999, 10), 4);
assert_eq!(digit_count(10000, 10), 5);
assert_eq!(digit_count(99999, 10), 5);
assert_eq!(digit_count(100000, 10), 6);
assert_eq!(digit_count(999999, 10), 6);
assert_eq!(digit_count(1000000, 10), 7);
assert_eq!(digit_count(9999999, 10), 7);
}
}