diff options
Diffstat (limited to 'src/symbols/rust_string.rs')
-rw-r--r-- | src/symbols/rust_string.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/symbols/rust_string.rs b/src/symbols/rust_string.rs new file mode 100644 index 00000000..63d4ba76 --- /dev/null +++ b/src/symbols/rust_string.rs @@ -0,0 +1,45 @@ +use std::mem::{ManuallyDrop, MaybeUninit}; +use std::ptr; +use std::slice; +use std::str; + +#[export_name = "cxxbridge03$string$new"] +unsafe extern "C" fn string_new(this: &mut MaybeUninit<String>) { + ptr::write(this.as_mut_ptr(), String::new()); +} + +#[export_name = "cxxbridge03$string$clone"] +unsafe extern "C" fn string_clone(this: &mut MaybeUninit<String>, other: &String) { + ptr::write(this.as_mut_ptr(), other.clone()); +} + +#[export_name = "cxxbridge03$string$from"] +unsafe extern "C" fn string_from( + this: &mut MaybeUninit<String>, + ptr: *const u8, + len: usize, +) -> bool { + let slice = slice::from_raw_parts(ptr, len); + match str::from_utf8(slice) { + Ok(s) => { + ptr::write(this.as_mut_ptr(), s.to_owned()); + true + } + Err(_) => false, + } +} + +#[export_name = "cxxbridge03$string$drop"] +unsafe extern "C" fn string_drop(this: &mut ManuallyDrop<String>) { + ManuallyDrop::drop(this); +} + +#[export_name = "cxxbridge03$string$ptr"] +unsafe extern "C" fn string_ptr(this: &String) -> *const u8 { + this.as_ptr() +} + +#[export_name = "cxxbridge03$string$len"] +unsafe extern "C" fn string_len(this: &String) -> usize { + this.len() +} |