use crate::tag::Tag;
pub type Value = isize;
pub type Intnat = isize;
pub type Uintnat = usize;
pub type Size = Uintnat;
pub type Color = Uintnat;
pub type Mark = Uintnat;
pub type Header = Uintnat;
#[cfg(target_endian = "big")]
#[inline]
pub const unsafe fn tag_val(val: Value) -> Tag {
*(val as *const u8).offset(-1)
}
#[cfg(target_endian = "little")]
#[inline]
pub unsafe fn tag_val(val: Value) -> Tag {
*(val as *const u8).offset(-(core::mem::size_of::<Value>() as isize))
}
#[inline]
pub unsafe fn hd_val(val: Value) -> Header {
*(val as *const Header).offset(-1)
}
#[inline]
pub unsafe fn wosize_val(val: Value) -> Size {
hd_val(val) >> 10
}
pub const unsafe fn val_int(i: isize) -> Value {
((i as isize) << 1) + 1
}
pub const unsafe fn int_val(val: Value) -> isize {
((val as isize) >> 1) as isize
}
pub fn is_block(v: Value) -> bool {
(v & 1) == 0
}
pub const fn is_long(v: Value) -> bool {
(v & 1) != 0
}
pub const MAX_FIXNUM: Intnat = (1 << (8 * core::mem::size_of::<Intnat>() - 2)) - 1;
pub const MIN_FIXNUM: Intnat = -(1 << (8 * core::mem::size_of::<Intnat>() - 2));
pub unsafe fn field(block: Value, index: usize) -> *mut Value {
(block as *mut Value).add(index)
}
pub const UNIT: Value = unsafe { val_int(0) };
pub const NONE: Value = unsafe { val_int(0) };
pub const EMPTY_LIST: Value = unsafe { val_int(0) };
pub const TRUE: Value = unsafe { val_int(1) };
pub const FALSE: Value = unsafe { val_int(0) };
pub const TAG_CONS: Tag = 0;
pub const TAG_SOME: Tag = 0;
#[inline]
pub const unsafe fn bp_val(val: Value) -> *const u8 {
val as *const u8
}
#[inline]
pub const unsafe fn string_val(val: Value) -> *mut u8 {
val as *mut u8
}
extern "C" {
pub fn caml_string_length(value: Value) -> Size;
pub fn caml_array_length(value: Value) -> Size;
pub fn caml_hash_variant(tag: *const u8) -> Value;
pub fn caml_get_public_method(obj: Value, tag: Value) -> Value;
pub fn caml_sys_store_double_val(x: Value, f: f64);
pub fn caml_sys_double_val(x: Value) -> f64;
pub fn caml_sys_double_field(x: Value, i: Size) -> f64;
pub fn caml_sys_store_double_field(x: Value, index: Size, d: f64);
}