#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct EfTensorPlane {
pub handle: i64,
pub offset: u64,
pub stride: u64,
pub size: u64,
pub used: u64,
pub modifier: u64,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EfDtype {
U8 = 0,
I8 = 1,
U16 = 2,
I16 = 3,
U32 = 4,
I32 = 5,
U64 = 6,
I64 = 7,
F16 = 8,
F32 = 9,
F64 = 10,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EfStorageKind {
Mem = 0,
Shm = 1,
DmaBuf = 2,
IoSurface = 3,
Pbo = 4,
Cuda = 5,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EfCpuAccess {
None = 0,
Read = 1,
Write = 2,
ReadWrite = 3,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum EfCompression {
#[default]
None = 0,
Ubwc = 1,
Afbc = 2,
Pvric = 3,
Dcc = 4,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum EfErrorClass {
#[default]
Unspecified = 0,
InvalidArgument = 1,
InvalidShape = 2,
InsufficientCapacity = 3,
BatchIndexOutOfBounds = 4,
RegionOutOfBounds = 5,
NotSupported = 6,
InvalidOperation = 7,
AllocationFailed = 8,
QuantizationInvalid = 9,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct EfImageDescView {
pub width: u64,
pub height: u64,
pub format: u32,
pub dtype: u32,
pub access: u32,
pub memory: u32,
pub has_memory: u32,
pub compression: u32,
pub has_compression: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct EfViewOrigin {
pub parent_width: u64,
pub parent_height: u64,
pub parent_row_stride: u64,
pub x: u64,
pub y: u64,
pub has_origin: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct EfQuantizationInfo {
pub axis: i32,
pub count: u32,
pub has_quantization: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct EfTensorView {
pub ptr: *mut u8,
pub len: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn plane_layout_is_the_48_byte_scalar_block_the_blob_assumes() {
assert_eq!(std::mem::size_of::<EfTensorPlane>(), 48);
assert_eq!(std::mem::align_of::<EfTensorPlane>(), 8);
}
#[test]
fn vocabulary_enums_are_u32() {
assert_eq!(std::mem::size_of::<EfDtype>(), 4);
assert_eq!(std::mem::size_of::<EfStorageKind>(), 4);
}
#[test]
fn tensor_view_is_two_pointers_wide_and_frozen() {
assert_eq!(std::mem::size_of::<EfTensorView>(), 16);
assert_eq!(std::mem::align_of::<EfTensorView>(), 8);
}
#[test]
fn image_desc_view_layout_is_pinned() {
assert_eq!(std::mem::size_of::<EfImageDescView>(), 48);
assert_eq!(std::mem::align_of::<EfImageDescView>(), 8);
}
#[test]
fn view_origin_layout_is_pinned() {
assert_eq!(std::mem::size_of::<EfViewOrigin>(), 48);
assert_eq!(std::mem::align_of::<EfViewOrigin>(), 8);
}
#[test]
fn error_class_is_u32_and_unspecified_is_zero() {
assert_eq!(std::mem::size_of::<EfErrorClass>(), 4);
assert_eq!(EfErrorClass::Unspecified as u32, 0);
assert_eq!(EfErrorClass::default(), EfErrorClass::Unspecified);
}
#[test]
fn compression_is_u32_and_none_is_zero() {
assert_eq!(std::mem::size_of::<EfCompression>(), 4);
assert_eq!(EfCompression::None as u32, 0);
assert_eq!(EfCompression::default(), EfCompression::None);
}
#[test]
fn cpu_access_is_u32() {
assert_eq!(std::mem::size_of::<EfCpuAccess>(), 4);
}
#[test]
fn quantization_info_layout_is_pinned() {
assert_eq!(std::mem::size_of::<EfQuantizationInfo>(), 12);
assert_eq!(std::mem::align_of::<EfQuantizationInfo>(), 4);
}
#[test]
fn this_crate_has_no_dependencies_and_never_may() {
let manifest = include_str!("../Cargo.toml");
assert!(
!manifest.contains("[dependencies."),
"dependency sub-tables are dependencies too"
);
let deps = manifest
.split("[dependencies]")
.nth(1)
.expect("manifest has a [dependencies] table");
let table_body = deps.split("\n[").next().unwrap_or(deps);
let non_comment_lines: Vec<&str> = table_body
.lines()
.map(str::trim)
.filter(|l| !l.is_empty() && !l.starts_with('#'))
.collect();
assert!(
non_comment_lines.is_empty(),
"edgefirst-tensor-abi grew dependencies: {non_comment_lines:?}"
);
}
}