use std::fmt::Display;
#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)]
pub struct Size {
width: f64,
height: f64,
}
impl Size {
#[must_use]
pub const fn new(width: f64, height: f64) -> Self {
Self {
width,
height,
}
}
#[must_use]
pub const fn width(&self) -> f64 {
self.width
}
#[must_use]
pub const fn height(&self) -> f64 {
self.height
}
}
impl Display for Size {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{}x{}", self.width, self.height))
}
}
impl From<(f64, f64)> for Size {
fn from(value: (f64, f64)) -> Self {
Self::new(value.0, value.1)
}
}
impl From<(f32, f32)> for Size {
fn from(value: (f32, f32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i8, i8)> for Size {
fn from(value: (i8, i8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i16, i16)> for Size {
fn from(value: (i16, i16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i32, i32)> for Size {
fn from(value: (i32, i32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i64, i64)> for Size {
fn from(value: (i64, i64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(isize, isize)> for Size {
fn from(value: (isize, isize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u8, i8)> for Size {
fn from(value: (u8, i8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u16, i16)> for Size {
fn from(value: (u16, i16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u32, i32)> for Size {
fn from(value: (u32, i32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u64, i64)> for Size {
fn from(value: (u64, i64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(usize, isize)> for Size {
fn from(value: (usize, isize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i8, u8)> for Size {
fn from(value: (i8, u8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i16, u16)> for Size {
fn from(value: (i16, u16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i32, u32)> for Size {
fn from(value: (i32, u32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i64, u64)> for Size {
fn from(value: (i64, u64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(isize, usize)> for Size {
fn from(value: (isize, usize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u8, u8)> for Size {
fn from(value: (u8, u8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u16, u16)> for Size {
fn from(value: (u16, u16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u32, u32)> for Size {
fn from(value: (u32, u32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u64, u64)> for Size {
fn from(value: (u64, u64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(usize, usize)> for Size {
fn from(value: (usize, usize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}