use rayforce_sys as sys;
pub(crate) type Raw = *mut sys::ray_t;
#[inline]
pub(crate) unsafe fn hdr<'a>(v: Raw) -> &'a sys::ray_t__bindgen_ty_1 {
(*v).__bindgen_anon_1.as_ref()
}
#[inline]
unsafe fn val<'a>(v: Raw) -> &'a sys::ray_t__bindgen_ty_1__bindgen_ty_2 {
&hdr(v).__bindgen_anon_2
}
#[inline]
pub(crate) unsafe fn type_code(v: Raw) -> i8 {
hdr(v).type_
}
#[inline]
pub(crate) unsafe fn attrs(v: Raw) -> u8 {
hdr(v).attrs
}
#[inline]
pub(crate) unsafe fn set_attrs(v: Raw, a: u8) {
(*v).__bindgen_anon_1.as_mut().attrs = a;
}
#[inline]
pub(crate) unsafe fn sym_domain(v: Raw) -> *mut sys::ray_sym_domain_s {
let h = hdr(v);
if h.attrs & sys::RAY_ATTR_SLICE as u8 != 0 {
let parent = h.__bindgen_anon_1.__bindgen_anon_1.slice_parent;
if !parent.is_null() {
return sym_domain(parent);
}
}
let d = h.__bindgen_anon_1.__bindgen_anon_3.sym_domain;
if d.is_null() {
sys::ray_sym_runtime_domain()
} else {
d
}
}
#[inline]
pub(crate) unsafe fn rc(v: Raw) -> u32 {
hdr(v).rc
}
#[inline]
pub(crate) unsafe fn abs_type(v: Raw) -> i8 {
let t = type_code(v);
if t < 0 {
-t
} else {
t
}
}
#[inline]
pub(crate) unsafe fn is_atom(v: Raw) -> bool {
let t = type_code(v);
t < 0 || t >= sys::RAY_LAMBDA as i8
}
#[inline]
pub(crate) unsafe fn is_vec(v: Raw) -> bool {
let t = type_code(v);
t >= sys::RAY_BOOL as i8 && t <= sys::RAY_STR as i8
}
#[inline]
pub(crate) unsafe fn len(v: Raw) -> i64 {
val(v).len
}
#[inline]
pub(crate) unsafe fn as_i64(v: Raw) -> i64 {
val(v).i64_
}
#[inline]
pub(crate) unsafe fn as_i32(v: Raw) -> i32 {
val(v).i32_
}
#[inline]
pub(crate) unsafe fn as_i16(v: Raw) -> i16 {
val(v).i16_
}
#[inline]
pub(crate) unsafe fn as_u8(v: Raw) -> u8 {
val(v).u8_
}
#[inline]
pub(crate) unsafe fn as_b8(v: Raw) -> bool {
val(v).b8 != 0
}
#[inline]
pub(crate) unsafe fn as_f64(v: Raw) -> f64 {
val(v).f64_
}
#[inline]
pub(crate) unsafe fn child_obj(v: Raw) -> Raw {
val(v).obj
}
#[inline]
pub(crate) unsafe fn data(v: Raw) -> *mut u8 {
if attrs(v) & sys::RAY_ATTR_SLICE as u8 != 0 {
sys::ray_data_slice_path(v) as *mut u8
} else {
hdr(v).data.as_ptr() as *mut u8
}
}
#[inline]
pub(crate) fn null_obj() -> Raw {
std::ptr::addr_of_mut!(sys::__ray_null)
}
#[inline]
pub(crate) fn is_null_singleton(v: Raw) -> bool {
v == null_obj()
}
#[inline]
pub(crate) unsafe fn is_err(v: Raw) -> bool {
!v.is_null() && (v as usize) > 31 && type_code(v) == sys::RAY_ERROR as i8
}
#[inline]
unsafe fn sso_len(v: Raw) -> u8 {
val(v).__bindgen_anon_1.slen
}
#[inline]
pub(crate) unsafe fn guid_bytes(v: Raw) -> Option<[u8; 16]> {
let obj = child_obj(v);
if obj.is_null() {
return None;
}
Some(*(data(obj) as *const [u8; 16]))
}
#[inline]
pub(crate) unsafe fn atom_is_null(v: Raw) -> bool {
if is_null_singleton(v) {
return true;
}
let t = type_code(v);
if t >= 0 {
return false;
}
match (-t) as u32 {
sys::RAY_F64 => as_f64(v).is_nan(),
sys::RAY_F32 => (as_f64(v) as f32).is_nan(),
sys::RAY_I64 | sys::RAY_TIMESTAMP => as_i64(v) == i64::MIN,
sys::RAY_I32 | sys::RAY_DATE | sys::RAY_TIME => as_i32(v) == i32::MIN,
sys::RAY_I16 => as_i16(v) == i16::MIN,
sys::RAY_SYM => as_i64(v) == 0,
sys::RAY_STR => sso_len(v) == 0 && child_obj(v).is_null(),
sys::RAY_GUID => match guid_bytes(v) {
None => true,
Some(b) => b.iter().all(|&x| x == 0),
},
_ => hdr(v).__bindgen_anon_1.aux[0] & 1 != 0,
}
}