voodoo 0.3.1

An intuitive, idiomatic, unopinionated, zero-overhead Vulkan API
Documentation

use std::fmt;

#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Version([u16; 3]);

impl Version {
    #[inline]
    pub fn new(major: u16, minor: u16, patch: u16) -> Version {
        Version([major, minor, patch])
    }
}

impl From<u32> for Version {
    fn from(val: u32) -> Version {
        Version([
            ((val & 0xffc00000) >> 22) as u16,
            ((val & 0x003ff000) >> 12) as u16,
            (val & 0x00000fff) as u16
        ])
    }
}

impl From<[u16; 3]> for Version {
    fn from(ver: [u16; 3]) -> Version {
        Version([ver[0], ver[1], ver[2]])
    }
}

impl From<(u16, u16, u16)> for Version {
    fn from(ver: (u16, u16, u16)) -> Version {
        Version([ver.0, ver.1, ver.2])
    }
}

impl From<Version> for u32 {
    fn from(ver: Version) -> u32 {
        (ver.0[0] as u32) << 22 | (ver.0[1] as u32) << 12 | (ver.0[2] as u32)
    }
}

impl fmt::Display for Version {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}.{}.{}", self.0[0], self.0[1], self.0[2])
    }
}