Skip to content

Commit

Permalink
Implement Borrow<CStr> for CString and ToOwned for CStr
Browse files Browse the repository at this point in the history
This allows CString and CStr to be used with the Cow type,
which is extremely useful when interfacing with C libraries
that make extensive use of C-style strings.
  • Loading branch information
reem committed Jul 10, 2015
1 parent 6c4e236 commit 84f9c61
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/libstd/ffi/c_str.rs
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use borrow::{Cow, ToOwned};
use borrow::{Cow, ToOwned, Borrow};
use boxed::Box;
use clone::Clone;
use convert::{Into, From};
Expand Down Expand Up @@ -272,6 +272,11 @@ impl fmt::Debug for CString {
}
}

#[stable(feature = "cstr_borrow", since = "1.3.0")]
impl Borrow<CStr> for CString {
fn borrow(&self) -> &CStr { self }
}

impl NulError {
/// Returns the position of the nul byte in the slice that was provided to
/// `CString::new`.
Expand Down Expand Up @@ -444,6 +449,15 @@ impl Ord for CStr {
}
}

#[stable(feature = "cstr_borrow", since = "1.3.0")]
impl ToOwned for CStr {
type Owned = CString;

fn to_owned(&self) -> CString {
unsafe { CString::from_vec_unchecked(self.to_bytes().to_vec()) }
}
}

#[cfg(test)]
mod tests {
use prelude::v1::*;
Expand Down Expand Up @@ -515,4 +529,13 @@ mod tests {
assert_eq!(CStr::from_ptr(ptr).to_string_lossy(), Owned::<str>(format!("123\u{FFFD}")));
}
}

#[test]
fn to_owned() {
let data = b"123\0";
let ptr = data.as_ptr() as *const libc::c_char;

let owned = unsafe { CStr::from_ptr(ptr).to_owned() };
assert_eq!(owned.as_bytes_with_nul(), data);
}
}

0 comments on commit 84f9c61

Please sign in to comment.