1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*! External objects */
use crate::*;

#[inline]
pub unsafe fn lean_alloc_external(
    cls: *mut lean_external_class,
    data: *mut c_void,
) -> *mut lean_object {
    let o = lean_alloc_small_object(core::mem::size_of::<lean_external_object>() as c_uint);
    lean_set_st_header(o, LeanExternal as u32, 0);
    (raw_field!(o, lean_external_object, m_class) as *mut *mut lean_external_class).write(cls);
    (raw_field!(o, lean_external_object, m_data) as *mut *mut c_void).write(data);
    o
}

#[inline(always)]
pub unsafe fn lean_get_external_class(o: *mut lean_object) -> *mut lean_external_class {
    *raw_field!(lean_to_external(o), lean_external_object, m_class)
}

#[inline(always)]
pub unsafe fn lean_get_external_data(o: *mut lean_object) -> *mut c_void {
    *raw_field!(lean_to_external(o), lean_external_object, m_data)
}

extern "C" {
    pub fn lean_register_external_class(
        _: lean_external_finalize_proc,
        _: lean_external_foreach_proc,
    ) -> *mut lean_external_class;
}