133d722a9Sopenharmony_ci#![cfg(feature = "alloc")]
233d722a9Sopenharmony_ci
333d722a9Sopenharmony_ciuse alloc::borrow::ToOwned;
433d722a9Sopenharmony_ciuse alloc::string::String;
533d722a9Sopenharmony_ciuse core::mem::{ManuallyDrop, MaybeUninit};
633d722a9Sopenharmony_ciuse core::ptr;
733d722a9Sopenharmony_ciuse core::slice;
833d722a9Sopenharmony_ciuse core::str;
933d722a9Sopenharmony_ci
1033d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$new"]
1133d722a9Sopenharmony_ciunsafe extern "C" fn string_new(this: &mut MaybeUninit<String>) {
1233d722a9Sopenharmony_ci    let this = this.as_mut_ptr();
1333d722a9Sopenharmony_ci    let new = String::new();
1433d722a9Sopenharmony_ci    unsafe { ptr::write(this, new) }
1533d722a9Sopenharmony_ci}
1633d722a9Sopenharmony_ci
1733d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$clone"]
1833d722a9Sopenharmony_ciunsafe extern "C" fn string_clone(this: &mut MaybeUninit<String>, other: &String) {
1933d722a9Sopenharmony_ci    let this = this.as_mut_ptr();
2033d722a9Sopenharmony_ci    let clone = other.clone();
2133d722a9Sopenharmony_ci    unsafe { ptr::write(this, clone) }
2233d722a9Sopenharmony_ci}
2333d722a9Sopenharmony_ci
2433d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$from_utf8"]
2533d722a9Sopenharmony_ciunsafe extern "C" fn string_from_utf8(
2633d722a9Sopenharmony_ci    this: &mut MaybeUninit<String>,
2733d722a9Sopenharmony_ci    ptr: *const u8,
2833d722a9Sopenharmony_ci    len: usize,
2933d722a9Sopenharmony_ci) -> bool {
3033d722a9Sopenharmony_ci    let slice = unsafe { slice::from_raw_parts(ptr, len) };
3133d722a9Sopenharmony_ci    match str::from_utf8(slice) {
3233d722a9Sopenharmony_ci        Ok(s) => {
3333d722a9Sopenharmony_ci            let this = this.as_mut_ptr();
3433d722a9Sopenharmony_ci            let owned = s.to_owned();
3533d722a9Sopenharmony_ci            unsafe { ptr::write(this, owned) }
3633d722a9Sopenharmony_ci            true
3733d722a9Sopenharmony_ci        }
3833d722a9Sopenharmony_ci        Err(_) => false,
3933d722a9Sopenharmony_ci    }
4033d722a9Sopenharmony_ci}
4133d722a9Sopenharmony_ci
4233d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$from_utf8_lossy"]
4333d722a9Sopenharmony_ciunsafe extern "C" fn string_from_utf8_lossy(
4433d722a9Sopenharmony_ci    this: &mut MaybeUninit<String>,
4533d722a9Sopenharmony_ci    ptr: *const u8,
4633d722a9Sopenharmony_ci    len: usize,
4733d722a9Sopenharmony_ci) {
4833d722a9Sopenharmony_ci    let slice = unsafe { slice::from_raw_parts(ptr, len) };
4933d722a9Sopenharmony_ci    let owned = String::from_utf8_lossy(slice).into_owned();
5033d722a9Sopenharmony_ci    let this = this.as_mut_ptr();
5133d722a9Sopenharmony_ci    unsafe { ptr::write(this, owned) }
5233d722a9Sopenharmony_ci}
5333d722a9Sopenharmony_ci
5433d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$from_utf16"]
5533d722a9Sopenharmony_ciunsafe extern "C" fn string_from_utf16(
5633d722a9Sopenharmony_ci    this: &mut MaybeUninit<String>,
5733d722a9Sopenharmony_ci    ptr: *const u16,
5833d722a9Sopenharmony_ci    len: usize,
5933d722a9Sopenharmony_ci) -> bool {
6033d722a9Sopenharmony_ci    let slice = unsafe { slice::from_raw_parts(ptr, len) };
6133d722a9Sopenharmony_ci    match String::from_utf16(slice) {
6233d722a9Sopenharmony_ci        Ok(s) => {
6333d722a9Sopenharmony_ci            let this = this.as_mut_ptr();
6433d722a9Sopenharmony_ci            unsafe { ptr::write(this, s) }
6533d722a9Sopenharmony_ci            true
6633d722a9Sopenharmony_ci        }
6733d722a9Sopenharmony_ci        Err(_) => false,
6833d722a9Sopenharmony_ci    }
6933d722a9Sopenharmony_ci}
7033d722a9Sopenharmony_ci
7133d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$from_utf16_lossy"]
7233d722a9Sopenharmony_ciunsafe extern "C" fn string_from_utf16_lossy(
7333d722a9Sopenharmony_ci    this: &mut MaybeUninit<String>,
7433d722a9Sopenharmony_ci    ptr: *const u16,
7533d722a9Sopenharmony_ci    len: usize,
7633d722a9Sopenharmony_ci) {
7733d722a9Sopenharmony_ci    let slice = unsafe { slice::from_raw_parts(ptr, len) };
7833d722a9Sopenharmony_ci    let owned = String::from_utf16_lossy(slice);
7933d722a9Sopenharmony_ci    let this = this.as_mut_ptr();
8033d722a9Sopenharmony_ci    unsafe { ptr::write(this, owned) }
8133d722a9Sopenharmony_ci}
8233d722a9Sopenharmony_ci
8333d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$drop"]
8433d722a9Sopenharmony_ciunsafe extern "C" fn string_drop(this: &mut ManuallyDrop<String>) {
8533d722a9Sopenharmony_ci    unsafe { ManuallyDrop::drop(this) }
8633d722a9Sopenharmony_ci}
8733d722a9Sopenharmony_ci
8833d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$ptr"]
8933d722a9Sopenharmony_ciunsafe extern "C" fn string_ptr(this: &String) -> *const u8 {
9033d722a9Sopenharmony_ci    this.as_ptr()
9133d722a9Sopenharmony_ci}
9233d722a9Sopenharmony_ci
9333d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$len"]
9433d722a9Sopenharmony_ciunsafe extern "C" fn string_len(this: &String) -> usize {
9533d722a9Sopenharmony_ci    this.len()
9633d722a9Sopenharmony_ci}
9733d722a9Sopenharmony_ci
9833d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$capacity"]
9933d722a9Sopenharmony_ciunsafe extern "C" fn string_capacity(this: &String) -> usize {
10033d722a9Sopenharmony_ci    this.capacity()
10133d722a9Sopenharmony_ci}
10233d722a9Sopenharmony_ci
10333d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$reserve_additional"]
10433d722a9Sopenharmony_ciunsafe extern "C" fn string_reserve_additional(this: &mut String, additional: usize) {
10533d722a9Sopenharmony_ci    this.reserve(additional);
10633d722a9Sopenharmony_ci}
10733d722a9Sopenharmony_ci
10833d722a9Sopenharmony_ci#[export_name = "cxxbridge1$string$reserve_total"]
10933d722a9Sopenharmony_ciunsafe extern "C" fn string_reserve_total(this: &mut String, new_cap: usize) {
11033d722a9Sopenharmony_ci    if new_cap > this.capacity() {
11133d722a9Sopenharmony_ci        let additional = new_cap - this.len();
11233d722a9Sopenharmony_ci        this.reserve(additional);
11333d722a9Sopenharmony_ci    }
11433d722a9Sopenharmony_ci}
115