use std::num::NonZeroU32;
macro_rules! gl_objects {
($( $ident:ident ) +) => {
$(
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct $ident(NonZeroU32);
impl $ident {
pub const unsafe fn new(inner: u32) -> Self {
if inner != 0 {
Self::new_unchecked(inner)
} else {
panic!(stringify!(A $ident object id cannot be zero.)) }
}
pub const unsafe fn new_unchecked(inner: u32) -> Self {
Self(NonZeroU32::new_unchecked(inner))
}
pub const fn inner(&self) -> u32 {
self.0.get()
}
}
)*
};
}
gl_objects!(Buffer Shader Program VertexArray LinkedProgram PipeLine);
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct UniformLocation(u32);
impl UniformLocation {
pub const unsafe fn new_unchecked(inner: u32) -> Self {
Self(inner)
}
pub const fn inner(&self) -> u32 {
self.0
}
}