#![allow(clippy::inline_always)]
#![allow(clippy::cast_possible_truncation)]
use core::ffi::c_void;
use crate::repr::LeanClosureObjectRepr;
use crate::types::{b_lean_obj_arg, lean_obj_arg, lean_obj_res, lean_object, u_lean_obj_arg};
unsafe extern "C" {
pub fn lean_apply_1(f: *mut lean_object, a1: *mut lean_object) -> *mut lean_object;
pub fn lean_apply_2(f: *mut lean_object, a1: *mut lean_object, a2: *mut lean_object) -> *mut lean_object;
pub fn lean_apply_3(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_4(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_5(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_6(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_7(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_8(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_9(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_10(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_11(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
a11: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_12(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
a11: *mut lean_object,
a12: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_13(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
a11: *mut lean_object,
a12: *mut lean_object,
a13: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_14(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
a11: *mut lean_object,
a12: *mut lean_object,
a13: *mut lean_object,
a14: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_15(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
a11: *mut lean_object,
a12: *mut lean_object,
a13: *mut lean_object,
a14: *mut lean_object,
a15: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_16(
f: *mut lean_object,
a1: *mut lean_object,
a2: *mut lean_object,
a3: *mut lean_object,
a4: *mut lean_object,
a5: *mut lean_object,
a6: *mut lean_object,
a7: *mut lean_object,
a8: *mut lean_object,
a9: *mut lean_object,
a10: *mut lean_object,
a11: *mut lean_object,
a12: *mut lean_object,
a13: *mut lean_object,
a14: *mut lean_object,
a15: *mut lean_object,
a16: *mut lean_object,
) -> *mut lean_object;
pub fn lean_apply_n(f: *mut lean_object, n: u32, args: *mut *mut lean_object) -> *mut lean_object;
pub fn lean_apply_m(f: *mut lean_object, n: u32, args: *mut *mut lean_object) -> *mut lean_object;
}
#[inline(always)]
unsafe fn as_closure<'a>(o: *mut lean_object) -> &'a LeanClosureObjectRepr {
unsafe { &*o.cast::<LeanClosureObjectRepr>() }
}
#[inline(always)]
pub unsafe fn lean_closure_fun(o: *mut lean_object) -> *mut c_void {
unsafe { as_closure(o).fun }
}
#[inline(always)]
pub unsafe fn lean_closure_arity(o: *mut lean_object) -> u16 {
unsafe { as_closure(o).arity }
}
#[inline(always)]
pub unsafe fn lean_closure_num_fixed(o: *mut lean_object) -> u16 {
unsafe { as_closure(o).num_fixed }
}
#[inline(always)]
pub unsafe fn lean_closure_arg_cptr(o: *mut lean_object) -> *mut *mut lean_object {
unsafe { (&raw mut (*o.cast::<LeanClosureObjectRepr>()).objs).cast::<*mut lean_object>() }
}
#[inline(always)]
pub unsafe fn lean_closure_get(o: b_lean_obj_arg, i: u32) -> *mut lean_object {
unsafe { *lean_closure_arg_cptr(o).add(i as usize) }
}
#[inline(always)]
pub unsafe fn lean_closure_set(o: u_lean_obj_arg, i: u32, a: lean_obj_arg) {
unsafe { *lean_closure_arg_cptr(o).add(i as usize) = a }
}
#[inline(always)]
pub unsafe fn lean_alloc_closure(fun: *mut c_void, arity: u32, num_fixed: u32) -> lean_obj_res {
debug_assert!(arity > 0);
debug_assert!(num_fixed < arity);
let captured_bytes = core::mem::size_of::<*mut lean_object>().strict_mul(num_fixed as usize);
let size = core::mem::size_of::<LeanClosureObjectRepr>().strict_add(captured_bytes);
unsafe {
let raw = crate::object::lean_alloc_object(size);
let repr = raw.cast::<LeanClosureObjectRepr>();
(*repr).header.m_rc = 1;
(*repr).header.m_tag = crate::consts::LEAN_CLOSURE;
(*repr).header.m_other = 0;
(*repr).header.m_cs_sz = 0;
(*repr).fun = fun;
(*repr).arity = arity as u16;
(*repr).num_fixed = num_fixed as u16;
raw
}
}