#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Realm {
Host,
Device,
}
impl Realm {
pub const COUNT: usize = 2;
pub const ALL: [Realm; Self::COUNT] = [Realm::Host, Realm::Device];
pub const fn index(self) -> usize {
self as usize
}
pub const fn name(self) -> &'static str {
match self {
Realm::Host => "RAM",
Realm::Device => "VRAM",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum MemTag {
Textures,
Meshes,
Chunks,
Shaders,
Audio,
Physics,
Ui,
Scratch,
Other,
}
impl MemTag {
pub const COUNT: usize = 9;
pub const ALL: [MemTag; Self::COUNT] = [
MemTag::Textures,
MemTag::Meshes,
MemTag::Chunks,
MemTag::Shaders,
MemTag::Audio,
MemTag::Physics,
MemTag::Ui,
MemTag::Scratch,
MemTag::Other,
];
pub const fn index(self) -> usize {
self as usize
}
pub const fn name(self) -> &'static str {
match self {
MemTag::Textures => "Textures",
MemTag::Meshes => "Meshes",
MemTag::Chunks => "Chunks",
MemTag::Shaders => "Shaders",
MemTag::Audio => "Audio",
MemTag::Physics => "Physics",
MemTag::Ui => "UI",
MemTag::Scratch => "Scratch",
MemTag::Other => "Other",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tag_indices_are_dense_and_match_their_position() {
assert_eq!(MemTag::ALL.len(), MemTag::COUNT);
for (i, tag) in MemTag::ALL.iter().enumerate() {
assert_eq!(tag.index(), i);
}
}
#[test]
fn realm_indices_are_dense_and_match_their_position() {
assert_eq!(Realm::ALL.len(), Realm::COUNT);
for (i, realm) in Realm::ALL.iter().enumerate() {
assert_eq!(realm.index(), i);
}
}
#[test]
fn every_tag_names_itself_distinctly() {
for (i, a) in MemTag::ALL.iter().enumerate() {
assert!(!a.name().is_empty());
for b in &MemTag::ALL[i + 1..] {
assert_ne!(a.name(), b.name());
}
}
}
}