#[derive(Copy, Clone, Debug)]
pub struct GeometricSequence {
current: f64,
factor: f64,
}
impl GeometricSequence {
pub fn new(start: u64, factor: f64) -> Self {
GeometricSequence { current: start as f64, factor }
}
}
impl Iterator for GeometricSequence {
type Item = u64;
fn next(&mut self) -> Option<Self::Item> {
let start = self.current as u64;
while self.current as u64 == start { self.current *= self.factor; }
Some(start)
}
}
#[cfg(feature="nightly")]
pub fn black_box<T>(dummy: T) -> T {
use std::hint;
hint::black_box(dummy)
}
#[cfg(not(feature="nightly"))]
pub fn black_box<T>(dummy: T) -> T {
use std::mem;
use std::ptr;
unsafe {
let value = ptr::read_volatile(&dummy);
mem::forget(dummy);
value
}
}
pub fn format_number(number: f64, precision: usize, separator: char) -> String {
let mut integral = String::new();
let mut counter = 0;
for digit in (number as u64).to_string().chars().rev() {
if counter == 3 {
integral.insert(0, separator);
counter = 0;
}
counter += 1;
integral.insert(0, digit);
}
let fractional = format!("{:.*}", precision, number.fract());
format!("{}.{}", integral, &fractional[2..])
}