1use crate::*;
3
4#[inline(always)]
5pub unsafe fn lean_ctor_num_objs(o: *mut lean_object) -> c_uint {
6 debug_assert!(lean_is_ctor(o));
7 lean_ptr_other(o)
8}
9
10#[inline(always)]
11pub unsafe fn lean_ctor_obj_cptr(o: *mut lean_object) -> *mut *mut lean_object {
12 debug_assert!(lean_is_ctor(o));
13 raw_field!(lean_to_ctor(o), lean_ctor_object, m_objs) as *mut _
14}
15
16#[inline]
17pub unsafe fn lean_ctor_scalar_cptr(o: *mut lean_object) -> *mut u8 {
18 debug_assert!(lean_is_ctor(o));
19 lean_ctor_obj_cptr(o).add(lean_ctor_num_objs(o) as usize) as *mut u8
20}
21
22#[inline]
23pub unsafe fn lean_alloc_ctor(
24 tag: c_uint,
25 num_objs: c_uint,
26 scalar_sz: c_uint,
27) -> *mut lean_object {
28 debug_assert!(
29 tag <= LeanMaxCtorTag as c_uint
30 && num_objs < LEAN_MAX_CTOR_FIELDS
31 && scalar_sz < LEAN_MAX_CTOR_SCALARS_SIZE
32 );
33 let o = lean_alloc_ctor_memory(
34 core::mem::size_of::<lean_ctor_object>() as c_uint
35 + (core::mem::size_of::<*const ()>() as c_uint) * num_objs
36 + scalar_sz,
37 );
38 lean_set_st_header(o, tag, num_objs);
39 o
40}
41
42#[inline(always)]
43pub unsafe fn lean_ctor_get(o: b_lean_obj_arg, i: c_uint) -> b_lean_obj_res {
44 debug_assert!(i < lean_ctor_num_objs(o));
45 *lean_ctor_obj_cptr(o).add(i as usize)
46}
47
48#[inline(always)]
49pub unsafe fn lean_ctor_set(o: b_lean_obj_arg, i: c_uint, v: lean_obj_arg) {
50 debug_assert!(i < lean_ctor_num_objs(o));
51 *lean_ctor_obj_cptr(o).add(i as usize) = v;
52}
53
54#[inline(always)]
55pub unsafe fn lean_ctor_set_tag(o: b_lean_obj_arg, new_tag: u8) {
56 debug_assert!(new_tag <= LeanMaxCtorTag);
57 (raw_field!(o, lean_object, m_tag) as *mut u8).write(new_tag)
58}
59
60#[inline]
61pub unsafe fn lean_ctor_release(o: b_lean_obj_arg, i: c_uint) {
62 debug_assert!(i < lean_ctor_num_objs(o));
63 let objs = lean_ctor_obj_cptr(o);
64 lean_dec(*objs.add(1));
65 *objs.add(i as usize) = lean_box(0)
66}
67
68#[inline(always)]
69pub unsafe fn lean_ctor_get_usize(o: b_lean_obj_arg, i: c_uint) -> usize {
70 debug_assert!(i >= lean_ctor_num_objs(o));
71 *(lean_ctor_obj_cptr(o).add(i as usize) as *const usize)
72}
73
74#[inline(always)]
75pub unsafe fn lean_ctor_get_uint8(o: b_lean_obj_arg, offset: c_uint) -> u8 {
76 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
77 *(lean_ctor_obj_cptr(o) as *const u8).add(offset as usize)
78}
79
80#[inline(always)]
81pub unsafe fn lean_ctor_get_uint16(o: b_lean_obj_arg, offset: c_uint) -> u16 {
82 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
83 ((lean_ctor_obj_cptr(o) as *const u8).add(offset as usize) as *const u16).read()
84}
85
86#[inline(always)]
87pub unsafe fn lean_ctor_get_uint32(o: b_lean_obj_arg, offset: c_uint) -> u32 {
88 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
89 ((lean_ctor_obj_cptr(o) as *const u8).add(offset as usize) as *const u32).read()
90}
91
92#[inline(always)]
93pub unsafe fn lean_ctor_get_uint64(o: b_lean_obj_arg, offset: c_uint) -> u64 {
94 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
95 ((lean_ctor_obj_cptr(o) as *const u8).add(offset as usize) as *const u64).read()
96}
97
98#[inline(always)]
99pub unsafe fn lean_ctor_get_float(o: b_lean_obj_arg, offset: c_uint) -> f64 {
100 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
101 ((lean_ctor_obj_cptr(o) as *const u8).add(offset as usize) as *const f64).read()
102}
103
104#[inline(always)]
105pub unsafe fn lean_ctor_get_float32(o: b_lean_obj_arg, offset: c_uint) -> f32 {
106 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
107 ((lean_ctor_obj_cptr(o) as *const u8).add(offset as usize) as *const f32).read()
108}
109
110#[inline(always)]
111pub unsafe fn lean_ctor_set_usize(o: b_lean_obj_arg, i: c_uint, v: usize) {
112 debug_assert!(i >= lean_ctor_num_objs(o));
113 (lean_ctor_obj_cptr(o).add(i as usize) as *mut usize).write(v)
114}
115
116#[inline(always)]
117pub unsafe fn lean_ctor_set_uint8(o: b_lean_obj_arg, offset: c_uint, v: u8) {
118 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
119 (lean_ctor_obj_cptr(o) as *mut u8)
120 .add(offset as usize)
121 .write(v)
122}
123
124#[inline(always)]
125pub unsafe fn lean_ctor_set_uint16(o: b_lean_obj_arg, offset: c_uint, v: u16) {
126 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
127 ((lean_ctor_obj_cptr(o) as *mut u8).add(offset as usize) as *mut u16).write(v)
128}
129
130#[inline(always)]
131pub unsafe fn lean_ctor_set_uint32(o: b_lean_obj_arg, offset: c_uint, v: u32) {
132 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
133 ((lean_ctor_obj_cptr(o) as *mut u8).add(offset as usize) as *mut u32).write(v)
134}
135
136#[inline(always)]
137pub unsafe fn lean_ctor_set_uint64(o: b_lean_obj_arg, offset: c_uint, v: u64) {
138 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
139 ((lean_ctor_obj_cptr(o) as *mut u8).add(offset as usize) as *mut u64).write(v)
140}
141
142#[inline(always)]
143pub unsafe fn lean_ctor_set_float(o: b_lean_obj_arg, offset: c_uint, v: f64) {
144 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
145 ((lean_ctor_obj_cptr(o) as *mut u8).add(offset as usize) as *mut f64).write(v)
146}
147
148#[inline(always)]
149pub unsafe fn lean_ctor_set_float32(o: b_lean_obj_arg, offset: c_uint, v: f32) {
150 debug_assert!(offset >= lean_ctor_num_objs(o) * core::mem::size_of::<*const ()>() as c_uint);
151 ((lean_ctor_obj_cptr(o) as *mut u8).add(offset as usize) as *mut f32).write(v)
152}