use derive_more::{Add, Sub, Mul, Div};
#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
pub struct Byte(pub u32);
#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
pub struct KiloByte(pub u32);
#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
pub struct MegaByte(pub u32);
#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
pub struct GigaByte(pub u32);
#[allow(non_snake_case)]
impl Byte {
pub const fn from_kB(kb: u32) -> Self {
Byte(kb * 1_024)
}
pub const fn from_MB(mb: u32) -> Self {
Byte(mb * 1_024 * 1_024)
}
pub const fn from_GB(gb: u32) -> Self {
Byte(gb * 1_024 * 1_024 * 1_024)
}
}
#[allow(non_snake_case)]
pub trait ExtByte {
fn B(self) -> Byte;
fn kB(self) -> KiloByte;
fn MB(self) -> MegaByte;
fn GB(self) -> GigaByte;
}
#[allow(non_snake_case)]
impl ExtByte for u32 {
fn B(self) -> Byte {
Byte(self)
}
fn kB(self) -> KiloByte {
KiloByte(self)
}
fn MB(self) -> MegaByte {
MegaByte(self)
}
fn GB(self) -> GigaByte {
GigaByte(self)
}
}
impl Into<u32> for Byte {
fn into(self) -> u32 {
self.0
}
}
impl Into<usize> for Byte {
fn into(self) -> usize {
self.0 as usize
}
}
impl From<u32> for Byte {
fn from(b: u32) -> Self {
b.B()
}
}
impl From<KiloByte> for Byte {
fn from(kb: KiloByte) -> Self {
Self(kb.0 * 1_024)
}
}
impl From<MegaByte> for Byte {
fn from(mb: MegaByte) -> Self {
Self(mb.0 * 1_024 * 1_024)
}
}
impl From<MegaByte> for KiloByte {
fn from(mb: MegaByte) -> Self {
Self(mb.0 * 1_024)
}
}
impl From<GigaByte> for Byte {
fn from(gb: GigaByte) -> Self {
Self(gb.0 * 1_024 * 1_024 * 1_024)
}
}
impl From<GigaByte> for KiloByte {
fn from(gb: GigaByte) -> Self {
Self(gb.0 * 1_024 * 1_024)
}
}
impl From<GigaByte> for MegaByte {
fn from(gb: GigaByte) -> Self {
Self(gb.0 * 1_024)
}
}