use super::UnknownUnit;
use length::Length;
use num::Zero;
use core::fmt;
use core::ops::Add;
use core::marker::PhantomData;
#[derive(EuclidMatrix)]
#[repr(C)]
pub struct TypedSideOffsets2D<T, U> {
pub top: T,
pub right: T,
pub bottom: T,
pub left: T,
#[doc(hidden)]
pub _unit: PhantomData<U>,
}
impl<T: fmt::Debug, U> fmt::Debug for TypedSideOffsets2D<T, U> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"({:?},{:?},{:?},{:?})",
self.top, self.right, self.bottom, self.left
)
}
}
impl<T: Default, U> Default for TypedSideOffsets2D<T, U> {
fn default() -> Self {
TypedSideOffsets2D {
top: Default::default(),
right: Default::default(),
bottom: Default::default(),
left: Default::default(),
_unit: PhantomData,
}
}
}
pub type SideOffsets2D<T> = TypedSideOffsets2D<T, UnknownUnit>;
impl<T: Copy, U> TypedSideOffsets2D<T, U> {
pub fn new(top: T, right: T, bottom: T, left: T) -> Self {
TypedSideOffsets2D {
top,
right,
bottom,
left,
_unit: PhantomData,
}
}
pub fn from_lengths(
top: Length<T, U>,
right: Length<T, U>,
bottom: Length<T, U>,
left: Length<T, U>,
) -> Self {
TypedSideOffsets2D::new(top.0, right.0, bottom.0, left.0)
}
pub fn top_typed(&self) -> Length<T, U> {
Length::new(self.top)
}
pub fn right_typed(&self) -> Length<T, U> {
Length::new(self.right)
}
pub fn bottom_typed(&self) -> Length<T, U> {
Length::new(self.bottom)
}
pub fn left_typed(&self) -> Length<T, U> {
Length::new(self.left)
}
pub fn new_all_same(all: T) -> Self {
TypedSideOffsets2D::new(all, all, all, all)
}
pub fn from_length_all_same(all: Length<T, U>) -> Self {
TypedSideOffsets2D::new_all_same(all.0)
}
}
impl<T, U> TypedSideOffsets2D<T, U>
where
T: Add<T, Output = T> + Copy,
{
pub fn horizontal(&self) -> T {
self.left + self.right
}
pub fn vertical(&self) -> T {
self.top + self.bottom
}
pub fn horizontal_typed(&self) -> Length<T, U> {
Length::new(self.horizontal())
}
pub fn vertical_typed(&self) -> Length<T, U> {
Length::new(self.vertical())
}
}
impl<T, U> Add for TypedSideOffsets2D<T, U>
where
T: Copy + Add<T, Output = T>,
{
type Output = Self;
fn add(self, other: Self) -> Self {
TypedSideOffsets2D::new(
self.top + other.top,
self.right + other.right,
self.bottom + other.bottom,
self.left + other.left,
)
}
}
impl<T: Copy + Zero, U> TypedSideOffsets2D<T, U> {
pub fn zero() -> Self {
TypedSideOffsets2D::new(Zero::zero(), Zero::zero(), Zero::zero(), Zero::zero())
}
}