diff options
Diffstat (limited to 'src/format.rs')
-rwxr-xr-x | src/format.rs | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/format.rs b/src/format.rs new file mode 100755 index 0000000..984f0f5 --- /dev/null +++ b/src/format.rs @@ -0,0 +1,104 @@ +pub fn change(pct: f64, signed: bool) -> String { + if signed { + format!("{:>+6}%", signed_short(pct * 1e2)) + } else { + format!("{:>6}%", short(pct * 1e2)) + } +} + +pub fn time(ns: f64) -> String { + if ns < 1.0 { + format!("{:>6} ps", short(ns * 1e3)) + } else if ns < 10f64.powi(3) { + format!("{:>6} ns", short(ns)) + } else if ns < 10f64.powi(6) { + format!("{:>6} us", short(ns / 1e3)) + } else if ns < 10f64.powi(9) { + format!("{:>6} ms", short(ns / 1e6)) + } else { + format!("{:>6} s", short(ns / 1e9)) + } +} + +pub fn short(n: f64) -> String { + if n < 10.0 { + format!("{:.4}", n) + } else if n < 100.0 { + format!("{:.3}", n) + } else if n < 1000.0 { + format!("{:.2}", n) + } else if n < 10000.0 { + format!("{:.1}", n) + } else { + format!("{:.0}", n) + } +} + +fn signed_short(n: f64) -> String { + let n_abs = n.abs(); + + if n_abs < 10.0 { + format!("{:+.4}", n) + } else if n_abs < 100.0 { + format!("{:+.3}", n) + } else if n_abs < 1000.0 { + format!("{:+.2}", n) + } else if n_abs < 10000.0 { + format!("{:+.1}", n) + } else { + format!("{:+.0}", n) + } +} + +pub fn iter_count(iterations: u64) -> String { + if iterations < 10_000 { + format!("{} iterations", iterations) + } else if iterations < 1_000_000 { + format!("{:.0}k iterations", (iterations as f64) / 1000.0) + } else if iterations < 10_000_000 { + format!("{:.1}M iterations", (iterations as f64) / (1000.0 * 1000.0)) + } else if iterations < 1_000_000_000 { + format!("{:.0}M iterations", (iterations as f64) / (1000.0 * 1000.0)) + } else if iterations < 10_000_000_000 { + format!( + "{:.1}B iterations", + (iterations as f64) / (1000.0 * 1000.0 * 1000.0) + ) + } else { + format!( + "{:.0}B iterations", + (iterations as f64) / (1000.0 * 1000.0 * 1000.0) + ) + } +} + +pub fn integer(n: f64) -> String { + format!("{}", n as u64) +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn short_max_len() { + let mut float = 1.0; + while float < 999_999.9 { + let string = short(float); + println!("{}", string); + assert!(string.len() <= 6); + float *= 2.0; + } + } + + #[test] + fn signed_short_max_len() { + let mut float = -1.0; + while float > -999_999.9 { + let string = signed_short(float); + println!("{}", string); + assert!(string.len() <= 7); + float *= 2.0; + } + } +} |