use crate::vector::Vector;
const MIN_HEIGHT: f64 = 1.0e-5;
#[derive(Debug, Default, Copy, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Coordinate<V>
where
V: Vector,
{
vector: V,
error: f64,
height: f64,
}
impl<V> Coordinate<V>
where
V: Vector,
{
pub fn error(&self) -> f64 {
self.error
}
pub fn vector(&self) -> &V {
&self.vector
}
pub fn height(&self) -> f64 {
if self.height < MIN_HEIGHT {
return MIN_HEIGHT;
}
self.height
}
pub(crate) fn new(vector: V, error: f64, height: f64) -> Self {
Coordinate {
vector,
error,
height,
}
}
}
#[cfg(feature = "serde")]
#[cfg(test)]
mod tests {
use super::*;
use crate::vector::Dimension3;
#[test]
fn serde() {
let c = Coordinate::new(Dimension3::default(), 1.0, 2.0);
let encoded = serde_json::to_string(&c).unwrap();
let decoded: Coordinate<Dimension3> = serde_json::from_str(&encoded).unwrap();
assert_eq!(decoded.vector(), c.vector());
assert_eq!(decoded.error(), c.error());
assert_eq!(decoded.height(), c.height());
}
}