use std::cmp::Ordering;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd)]
pub struct Version {
major: u16,
minor: u16,
patch: u16
}
impl Version {
pub fn new(major: u16, minor: u16, patch: u16) -> Self {
Self { major, minor, patch }
}
pub fn major(&self) -> u16 {
self.major
}
pub fn minor(&self) -> u16 {
self.minor
}
pub fn patch(&self) -> u16 {
self.patch
}
}
impl Ord for Version {
fn cmp(&self, other: &Self) -> Ordering {
let version_u64 = u64::from(self);
let other_u64 = u64::from(other);
version_u64.cmp(&other_u64)
}
}
impl From<Version> for u64 {
fn from(version: Version) -> Self {
Self::from(&version)
}
}
impl<'a> From<&'a Version> for u64 {
fn from(version: &Version) -> Self {
let major = Self::from(version.major) << 32;
let minor = Self::from(version.minor) << 16;
let patch = Self::from(version.patch);
major + minor + patch
}
}
impl From<Version> for u32 {
fn from(version: Version) -> Self {
Self::from(&version)
}
}
impl<'a> From<&'a Version> for u32 {
fn from(version: &Version) -> Self {
let major = Self::from(version.major) << 16;
let minor = Self::from(version.minor / 2) << 8;
let patch = Self::from(version.patch / 2);
major + minor + patch
}
}
impl From<Version> for u16 {
fn from(version: Version) -> Self {
Self::from(&version)
}
}
impl<'a> From<&'a Version> for u16 {
fn from(version: &Version) -> Self {
let major = version.major << 8;
let minor = (version.minor / 3) << 4;
let patch = version.patch / 3;
major + minor + patch
}
}