use std::fmt;
#[cfg(target_pointer_width = "64")]
pub const WORD_SIZE: usize = 64;
#[cfg(target_pointer_width = "32")]
pub const WORD_SIZE: usize = 32;
pub const INVALID_LINK_ID: u32 = u32::MAX;
pub const INVALID_KEY_ID: u32 = u32::MAX;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
#[derive(Default)]
pub enum TailMode {
#[default]
TextTail = 0x01000,
BinaryTail = 0x02000,
}
pub const INVALID_EXTRA: u32 = u32::MAX >> 8;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorCode {
Ok = 0,
StateError = 1,
NullError = 2,
BoundError = 3,
RangeError = 4,
CodeError = 5,
ResetError = 6,
SizeError = 7,
MemoryError = 8,
IoError = 9,
FormatError = 10,
}
impl fmt::Display for ErrorCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ErrorCode::Ok => write!(f, "OK"),
ErrorCode::StateError => write!(f, "STATE_ERROR"),
ErrorCode::NullError => write!(f, "NULL_ERROR"),
ErrorCode::BoundError => write!(f, "BOUND_ERROR"),
ErrorCode::RangeError => write!(f, "RANGE_ERROR"),
ErrorCode::CodeError => write!(f, "CODE_ERROR"),
ErrorCode::ResetError => write!(f, "RESET_ERROR"),
ErrorCode::SizeError => write!(f, "SIZE_ERROR"),
ErrorCode::MemoryError => write!(f, "MEMORY_ERROR"),
ErrorCode::IoError => write!(f, "IO_ERROR"),
ErrorCode::FormatError => write!(f, "FORMAT_ERROR"),
}
}
}
impl std::error::Error for ErrorCode {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MapFlags(pub u32);
impl MapFlags {
pub const POPULATE: MapFlags = MapFlags(1 << 0);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NumTries(pub u32);
impl NumTries {
pub const MIN: u32 = 0x00001;
pub const MAX: u32 = 0x0007F;
pub const DEFAULT: u32 = 0x00003;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[repr(u32)]
pub enum CacheLevel {
Huge = 0x00080,
Large = 0x00100,
#[default]
Normal = 0x00200,
Small = 0x00400,
Tiny = 0x00800,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[repr(u32)]
pub enum NodeOrder {
Label = 0x10000,
#[default]
Weight = 0x20000,
}
pub mod config_mask {
pub const NUM_TRIES: u32 = 0x0007F;
pub const CACHE_LEVEL: u32 = 0x00F80;
pub const TAIL_MODE: u32 = 0x0F000;
pub const NODE_ORDER: u32 = 0xF0000;
pub const CONFIG: u32 = 0xFFFFF;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[allow(clippy::assertions_on_constants)]
fn test_word_size() {
assert!(WORD_SIZE == 32 || WORD_SIZE == 64);
assert_eq!(WORD_SIZE, std::mem::size_of::<usize>() * 8);
}
#[test]
fn test_invalid_constants() {
assert_eq!(INVALID_LINK_ID, u32::MAX);
assert_eq!(INVALID_KEY_ID, u32::MAX);
assert_eq!(INVALID_EXTRA, u32::MAX >> 8);
}
#[test]
fn test_error_code_display() {
assert_eq!(ErrorCode::Ok.to_string(), "OK");
assert_eq!(ErrorCode::StateError.to_string(), "STATE_ERROR");
assert_eq!(ErrorCode::IoError.to_string(), "IO_ERROR");
}
#[test]
fn test_default_values() {
assert_eq!(CacheLevel::default(), CacheLevel::Normal);
assert_eq!(TailMode::default(), TailMode::TextTail);
assert_eq!(NodeOrder::default(), NodeOrder::Weight);
}
}