use crate::ffi::bridge as sys;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[non_exhaustive]
pub enum IsaLevel {
Baseline,
Avx,
V3,
V4,
}
impl IsaLevel {
pub const ALL: &'static [IsaLevel] = &[
IsaLevel::Baseline,
IsaLevel::Avx,
IsaLevel::V3,
IsaLevel::V4,
];
fn from_raw(level: i32) -> IsaLevel {
IsaLevel::ALL[level.clamp(0, IsaLevel::ALL.len() as i32 - 1) as usize]
}
fn raw(self) -> i32 {
self as i32
}
pub fn name(self) -> &'static str {
sys::isa_level_name(self.raw())
}
pub fn is_available(self) -> bool {
sys::isa_level_available(self.raw())
}
}
pub fn current() -> IsaLevel {
IsaLevel::from_raw(sys::isa_current_level())
}
pub fn max_supported() -> IsaLevel {
IsaLevel::from_raw(sys::isa_max_supported_level())
}
#[doc(hidden)]
pub fn set(level: IsaLevel) -> bool {
sys::isa_set_level(level.raw())
}
pub fn simd_level() -> &'static str {
sys::simd_level()
}