From 84f9c61c69d311457d7a259be95876f5e4f5825e Mon Sep 17 00:00:00 2001 From: Jonathan Reem Date: Thu, 9 Jul 2015 16:38:55 -0700 Subject: [PATCH] Implement Borrow for CString and ToOwned for CStr 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. --- src/libstd/ffi/c_str.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/libstd/ffi/c_str.rs b/src/libstd/ffi/c_str.rs index ffc204ada60fb..1ddd74d3f4f34 100644 --- a/src/libstd/ffi/c_str.rs +++ b/src/libstd/ffi/c_str.rs @@ -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}; @@ -272,6 +272,11 @@ impl fmt::Debug for CString { } } +#[stable(feature = "cstr_borrow", since = "1.3.0")] +impl Borrow 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`. @@ -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::*; @@ -515,4 +529,13 @@ mod tests { assert_eq!(CStr::from_ptr(ptr).to_string_lossy(), Owned::(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); + } }