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