pub trait AsVector<'a, U: 'a> {
fn vec_size(&self) -> usize;
fn vec_at(&self, i: usize) -> U;
}
impl<'a, U: 'a> AsVector<'a, U> for Vec<U>
where
U: 'a + Copy,
{
fn vec_size(&self) -> usize {
self.len()
}
fn vec_at(&self, i: usize) -> U {
self[i]
}
}
impl<'a, U> AsVector<'a, U> for &'a [U]
where
U: 'a + Copy,
{
fn vec_size(&self) -> usize {
self.len()
}
fn vec_at(&self, i: usize) -> U {
self[i]
}
}
impl<'a, U, const M: usize> AsVector<'a, U> for [U; M]
where
U: 'a + Copy,
{
fn vec_size(&self) -> usize {
self.len()
}
fn vec_at(&self, i: usize) -> U {
self[i]
}
}
#[cfg(test)]
mod tests {
use super::AsVector;
use std::fmt::Write;
fn vector_str<'a, T, U>(array: &'a T) -> String
where
T: AsVector<'a, U>,
U: 'a + std::fmt::Display,
{
let mut buf = String::new();
let m = array.vec_size();
for i in 0..m {
write!(&mut buf, "{},", array.vec_at(i)).unwrap();
}
write!(&mut buf, "\n").unwrap();
buf
}
#[test]
fn as_vector_works() {
let x = vec![1.0, 2.0, 3.0];
assert_eq!(vector_str(&x), "1,2,3,\n");
let y: &[f64] = &[10.0, 20.0, 30.0];
assert_eq!(vector_str(&y), "10,20,30,\n");
let z = [100.0, 200.0, 300.0];
assert_eq!(vector_str(&z), "100,200,300,\n");
}
}