#![allow(clippy::inline_always)]
use core::ffi::c_char;
use crate::repr::LeanStringObjectRepr;
use crate::types::{b_lean_obj_arg, lean_obj_arg, lean_obj_res, lean_object};
unsafe extern "C" {
pub fn lean_utf8_strlen(s: *const c_char) -> usize;
pub fn lean_utf8_n_strlen(s: *const c_char, n: usize) -> usize;
pub fn lean_mk_string(s: *const c_char) -> lean_obj_res;
pub fn lean_mk_string_unchecked(s: *const c_char, sz: usize, len: usize) -> lean_obj_res;
pub fn lean_mk_string_from_bytes(s: *const c_char, sz: usize) -> lean_obj_res;
pub fn lean_mk_string_from_bytes_unchecked(s: *const c_char, sz: usize) -> lean_obj_res;
pub fn lean_mk_ascii_string_unchecked(s: *const c_char) -> lean_obj_res;
pub fn lean_string_push(s: lean_obj_arg, c: u32) -> lean_obj_res;
pub fn lean_string_append(s1: lean_obj_arg, s2: b_lean_obj_arg) -> lean_obj_res;
pub fn lean_string_mk(cs: lean_obj_arg) -> lean_obj_res;
pub fn lean_string_data(s: lean_obj_arg) -> lean_obj_res;
pub fn lean_string_utf8_get(s: b_lean_obj_arg, i: b_lean_obj_arg) -> u32;
pub fn lean_string_utf8_next(s: b_lean_obj_arg, i: b_lean_obj_arg) -> lean_obj_res;
pub fn lean_string_utf8_prev(s: b_lean_obj_arg, i: b_lean_obj_arg) -> lean_obj_res;
pub fn lean_string_utf8_set(s: lean_obj_arg, i: b_lean_obj_arg, c: u32) -> lean_obj_res;
pub fn lean_string_utf8_extract(s: b_lean_obj_arg, b: b_lean_obj_arg, e: b_lean_obj_arg) -> lean_obj_res;
pub fn lean_string_eq_cold(s1: b_lean_obj_arg, s2: b_lean_obj_arg) -> bool;
pub fn lean_string_lt(s1: b_lean_obj_arg, s2: b_lean_obj_arg) -> bool;
pub fn lean_string_hash(s: b_lean_obj_arg) -> u64;
}
#[inline(always)]
unsafe fn as_string<'a>(o: *mut lean_object) -> &'a LeanStringObjectRepr {
unsafe { &*o.cast::<LeanStringObjectRepr>() }
}
#[inline(always)]
pub unsafe fn lean_string_size(o: b_lean_obj_arg) -> usize {
unsafe { as_string(o).size }
}
#[inline(always)]
pub unsafe fn lean_string_len(o: b_lean_obj_arg) -> usize {
unsafe { as_string(o).length }
}
#[inline(always)]
pub unsafe fn lean_string_capacity(o: *mut lean_object) -> usize {
unsafe { as_string(o).capacity }
}
#[inline(always)]
pub unsafe fn lean_string_cstr(o: b_lean_obj_arg) -> *const c_char {
unsafe { as_string(o).data.as_ptr().cast::<c_char>() }
}
#[inline(always)]
pub unsafe fn lean_string_byte_size(o: *mut lean_object) -> usize {
unsafe { core::mem::size_of::<LeanStringObjectRepr>().strict_add(lean_string_capacity(o)) }
}