1#![allow(clippy::inline_always)]
4
5use core::ffi::c_char;
6
7use crate::repr::LeanStringObjectRepr;
8use crate::types::{b_lean_obj_arg, lean_obj_arg, lean_obj_res, lean_object};
9
10unsafe extern "C" {
11 pub fn lean_utf8_strlen(s: *const c_char) -> usize;
12 pub fn lean_utf8_n_strlen(s: *const c_char, n: usize) -> usize;
13
14 pub fn lean_mk_string(s: *const c_char) -> lean_obj_res;
15 pub fn lean_mk_string_unchecked(s: *const c_char, sz: usize, len: usize) -> lean_obj_res;
16 pub fn lean_mk_string_from_bytes(s: *const c_char, sz: usize) -> lean_obj_res;
17 pub fn lean_mk_string_from_bytes_unchecked(s: *const c_char, sz: usize) -> lean_obj_res;
18 pub fn lean_mk_ascii_string_unchecked(s: *const c_char) -> lean_obj_res;
19
20 pub fn lean_string_push(s: lean_obj_arg, c: u32) -> lean_obj_res;
21 pub fn lean_string_append(s1: lean_obj_arg, s2: b_lean_obj_arg) -> lean_obj_res;
22 pub fn lean_string_mk(cs: lean_obj_arg) -> lean_obj_res;
23 pub fn lean_string_data(s: lean_obj_arg) -> lean_obj_res;
24
25 pub fn lean_string_utf8_get(s: b_lean_obj_arg, i: b_lean_obj_arg) -> u32;
26 pub fn lean_string_utf8_next(s: b_lean_obj_arg, i: b_lean_obj_arg) -> lean_obj_res;
27 pub fn lean_string_utf8_prev(s: b_lean_obj_arg, i: b_lean_obj_arg) -> lean_obj_res;
28 pub fn lean_string_utf8_set(s: lean_obj_arg, i: b_lean_obj_arg, c: u32) -> lean_obj_res;
29 pub fn lean_string_utf8_extract(s: b_lean_obj_arg, b: b_lean_obj_arg, e: b_lean_obj_arg) -> lean_obj_res;
30
31 pub fn lean_string_eq_cold(s1: b_lean_obj_arg, s2: b_lean_obj_arg) -> bool;
32 pub fn lean_string_lt(s1: b_lean_obj_arg, s2: b_lean_obj_arg) -> bool;
33 pub fn lean_string_hash(s: b_lean_obj_arg) -> u64;
34}
35
36#[inline(always)]
37unsafe fn as_string<'a>(o: *mut lean_object) -> &'a LeanStringObjectRepr {
38 unsafe { &*o.cast::<LeanStringObjectRepr>() }
40}
41
42#[inline(always)]
48pub unsafe fn lean_string_size(o: b_lean_obj_arg) -> usize {
49 unsafe { as_string(o).size }
51}
52
53#[inline(always)]
59pub unsafe fn lean_string_len(o: b_lean_obj_arg) -> usize {
60 unsafe { as_string(o).length }
62}
63
64#[inline(always)]
70pub unsafe fn lean_string_capacity(o: *mut lean_object) -> usize {
71 unsafe { as_string(o).capacity }
73}
74
75#[inline(always)]
82pub unsafe fn lean_string_cstr(o: b_lean_obj_arg) -> *const c_char {
83 unsafe { as_string(o).data.as_ptr().cast::<c_char>() }
85}
86
87#[inline(always)]
100pub unsafe fn lean_string_byte_size(o: *mut lean_object) -> usize {
101 unsafe { core::mem::size_of::<LeanStringObjectRepr>().strict_add(lean_string_capacity(o)) }
105}