use crate::intrinsics::{Felt, Word, WordAligned};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SmtGetResponse {
pub value: Word,
pub root: Word,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SmtSetResponse {
pub old_value: Word,
pub new_root: Word,
}
#[allow(improper_ctypes)]
unsafe extern "C" {
#[link_name = "miden::core::collections::smt::get"]
fn extern_smt_get(
k0: Felt,
k1: Felt,
k2: Felt,
k3: Felt,
r0: Felt,
r1: Felt,
r2: Felt,
r3: Felt,
ptr: *mut (Word, Word),
);
#[link_name = "miden::core::collections::smt::set"]
fn extern_smt_set(
v0: Felt,
v1: Felt,
v2: Felt,
v3: Felt,
k0: Felt,
k1: Felt,
k2: Felt,
k3: Felt,
r0: Felt,
r1: Felt,
r2: Felt,
r3: Felt,
ptr: *mut (Word, Word),
);
}
#[inline]
pub fn smt_get(key: Word, root: Word) -> SmtGetResponse {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<WordAligned<(Word, Word)>>::uninit();
let ptr = ret_area.as_mut_ptr() as *mut (Word, Word);
extern_smt_get(key[0], key[1], key[2], key[3], root[0], root[1], root[2], root[3], ptr);
let (value, returned_root) = ret_area.assume_init().into_inner();
SmtGetResponse {
value,
root: returned_root,
}
}
}
#[inline]
pub fn smt_set(value: Word, key: Word, root: Word) -> SmtSetResponse {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<WordAligned<(Word, Word)>>::uninit();
let ptr = ret_area.as_mut_ptr() as *mut (Word, Word);
extern_smt_set(
value[0], value[1], value[2], value[3], key[0], key[1], key[2], key[3], root[0],
root[1], root[2], root[3], ptr,
);
let (old_value, new_root) = ret_area.assume_init().into_inner();
SmtSetResponse {
old_value,
new_root,
}
}
}