Return &str from c_char_to_string rather than String to avoid unnecessary allocations.

This commit is contained in:
Emily Toop 2018-05-11 12:23:32 +01:00
parent 31556023e5
commit c2dbf2c304
2 changed files with 7 additions and 8 deletions

View file

@ -296,7 +296,7 @@ pub unsafe extern "C" fn tx_report_get_tx_instant(tx_report: *mut TxReport) -> c
pub unsafe extern "C" fn tx_report_entity_for_temp_id(tx_report: *mut TxReport, tempid: *const c_char) -> *mut c_longlong { pub unsafe extern "C" fn tx_report_entity_for_temp_id(tx_report: *mut TxReport, tempid: *const c_char) -> *mut c_longlong {
let tx_report = &*tx_report; let tx_report = &*tx_report;
let key = c_char_to_string(tempid); let key = c_char_to_string(tempid);
if let Some(entid) = tx_report.tempids.get(&key) { if let Some(entid) = tx_report.tempids.get(key) {
Box::into_raw(Box::new(entid.clone() as c_longlong)) Box::into_raw(Box::new(entid.clone() as c_longlong))
} else { } else {
std::ptr::null_mut() std::ptr::null_mut()
@ -853,14 +853,14 @@ pub unsafe extern "C" fn store_register_observer(store: *mut Store,
}; };
callback(string_to_c_char(obs_key), &reports); callback(string_to_c_char(obs_key), &reports);
})); }));
store.register_observer(key, tx_observer); store.register_observer(key.to_string(), tx_observer);
} }
/// Unregisters a [TxObserver](mentat::TxObserver) with the `key` to observe changes on this `store`. /// Unregisters a [TxObserver](mentat::TxObserver) with the `key` to observe changes on this `store`.
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn store_unregister_observer(store: *mut Store, key: *const c_char) { pub unsafe extern "C" fn store_unregister_observer(store: *mut Store, key: *const c_char) {
let store = &mut*store; let store = &mut*store;
let key = c_char_to_string(key); let key = c_char_to_string(key).to_string();
store.unregister_observer(&key); store.unregister_observer(&key);
} }

View file

@ -19,19 +19,18 @@ pub mod strings {
Keyword, Keyword,
}; };
pub fn c_char_to_string(cchar: *const c_char) -> String { pub fn c_char_to_string(cchar: *const c_char) -> &'static str {
let c_str = unsafe { CStr::from_ptr(cchar) }; let c_str = unsafe { CStr::from_ptr(cchar) };
let r_str = c_str.to_str().unwrap_or(""); c_str.to_str().unwrap_or("")
r_str.to_string()
} }
pub fn string_to_c_char<T>(r_string: T) -> *mut c_char where T: Into<String> { pub fn string_to_c_char<T>(r_string: T) -> *mut c_char where T: Into<String> {
CString::new(r_string.into()).unwrap().into_raw() CString::new(r_string.into()).unwrap().into_raw()
} }
pub fn kw_from_string(keyword_string: &'static str) -> NamespacedKeyword {
// TODO: validate. The input might not be a keyword! // TODO: validate. The input might not be a keyword!
pub fn kw_from_string(mut keyword_string: String) -> Keyword { let attr_name = keyword_string.trim_left_matches(":");
let attr_name = keyword_string.split_off(1);
let parts: Vec<&str> = attr_name.split("/").collect(); let parts: Vec<&str> = attr_name.split("/").collect();
Keyword::namespaced(parts[0], parts[1]) Keyword::namespaced(parts[0], parts[1])
} }