use geo_types::{CoordNum, Line};
use geometry_coords::CoordinateScalar;
use geometry_tag::SegmentTag;
use geometry_trait::{Geometry, IndexedAccess, Segment};
use crate::geo_coord::GeoCoord;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct GeoLine<T: CoordNum>(Line<T>);
impl<T: CoordNum> GeoLine<T> {
#[inline]
#[must_use]
pub const fn new(inner: Line<T>) -> Self {
Self(inner)
}
#[inline]
#[must_use]
pub fn into_inner(self) -> Line<T> {
self.0
}
}
impl<T: CoordinateScalar + CoordNum> Geometry for GeoLine<T> {
type Kind = SegmentTag;
type Point = GeoCoord<T>;
}
impl<T: CoordinateScalar + CoordNum> IndexedAccess for GeoLine<T> {
#[inline]
fn get_indexed<const I: usize, const D: usize>(&self) -> T {
let coord = if I == 0 { self.0.start } else { self.0.end };
if D == 0 { coord.x } else { coord.y }
}
#[inline]
fn set_indexed<const I: usize, const D: usize>(&mut self, value: T) {
let coord = if I == 0 {
&mut self.0.start
} else {
&mut self.0.end
};
if D == 0 {
coord.x = value;
} else {
coord.y = value;
}
}
}
impl<T: CoordinateScalar + CoordNum> Segment for GeoLine<T> {}