use crate::geometry::Vector3;
#[derive(Clone, Copy)]
pub struct ControlPoint {
point: Vector3,
shift: u8,
}
impl ControlPoint {
pub fn new(point: Vector3) -> Self {
Self { point, shift: 0 }
}
pub fn with_shift(self, shift: u8) -> Self {
Self { shift, ..self }
}
pub fn point(&self) -> &Vector3 {
&self.point
}
pub fn shift(&self) -> u8 {
self.shift
}
}
impl From<Vector3> for ControlPoint {
fn from(point: Vector3) -> Self {
Self::new(point)
}
}
impl From<(Vector3, u8)> for ControlPoint {
fn from((point, shift): (Vector3, u8)) -> Self {
Self::new(point).with_shift(shift)
}
}
impl From<&Vector3> for ControlPoint {
fn from(point: &Vector3) -> Self {
Self::new(*point)
}
}
impl From<&(Vector3, u8)> for ControlPoint {
fn from((point, shift): &(Vector3, u8)) -> Self {
Self::new(*point).with_shift(*shift)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn control_point() {
let c = ControlPoint::from(Vector3::new(1., 2., 3.));
assert_eq!(c.point().x, 1.);
assert_eq!(c.point().y, 2.);
assert_eq!(c.point().z, 3.);
assert_eq!(c.shift(), 0);
let c = ControlPoint::from((Vector3::new(1., 2., 3.), 4));
assert_eq!(c.point().x, 1.);
assert_eq!(c.point().y, 2.);
assert_eq!(c.point().z, 3.);
assert_eq!(c.shift(), 4);
let c = ControlPoint::from(&Vector3::new(1., 2., 3.));
assert_eq!(c.point().x, 1.);
assert_eq!(c.point().y, 2.);
assert_eq!(c.point().z, 3.);
assert_eq!(c.shift(), 0);
let c = ControlPoint::from(&(Vector3::new(1., 2., 3.), 4));
assert_eq!(c.point().x, 1.);
assert_eq!(c.point().y, 2.);
assert_eq!(c.point().z, 3.);
assert_eq!(c.shift(), 4);
let cc = Clone::clone(&c);
assert_eq!(cc.point().x, 1.);
assert_eq!(cc.point().y, 2.);
assert_eq!(cc.point().z, 3.);
assert_eq!(cc.shift(), 4);
}
}