about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorBen Striegel <ben.striegel@gmail.com>2013-05-31 18:11:38 -0400
committerBen Striegel <ben.striegel@gmail.com>2013-05-31 18:12:07 -0400
commitc77d58fad8b484abdc0140d5adb27c738d46f261 (patch)
tree7baf7aef930276b714540b2ba06b10ffb9baf374 /src/libstd
parent91a707390045eb29e5392de1f7f5b9d5fdb64e65 (diff)
downloadrust-c77d58fad8b484abdc0140d5adb27c738d46f261.tar.gz
rust-c77d58fad8b484abdc0140d5adb27c738d46f261.zip
Add as_c_str method on strings
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/prelude.rs2
-rw-r--r--src/libstd/str.rs61
2 files changed, 40 insertions, 23 deletions
diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs
index 4dcef60781f..5a5efa0781a 100644
--- a/src/libstd/prelude.rs
+++ b/src/libstd/prelude.rs
@@ -45,7 +45,7 @@ pub use path::PosixPath;
 pub use path::WindowsPath;
 pub use ptr::Ptr;
 pub use ascii::{Ascii, AsciiCast, OwnedAsciiCast, AsciiStr};
-pub use str::{StrSlice, OwnedStr};
+pub use str::{StrSlice, OwnedStr, StrUtil};
 pub use from_str::{FromStr};
 pub use to_bytes::IterBytes;
 pub use to_str::{ToStr, ToStrConsume};
diff --git a/src/libstd/str.rs b/src/libstd/str.rs
index 4d41f10fdfc..c9452ed5433 100644
--- a/src/libstd/str.rs
+++ b/src/libstd/str.rs
@@ -2165,34 +2165,51 @@ pub fn as_bytes_slice<'a>(s: &'a str) -> &'a [u8] {
 }
 
 /**
- * Work with the byte buffer of a string as a null-terminated C string.
- *
- * Allows for unsafe manipulation of strings, which is useful for foreign
- * interop. This is similar to `str::as_buf`, but guarantees null-termination.
- * If the given slice is not already null-terminated, this function will
- * allocate a temporary, copy the slice, null terminate it, and pass
- * that instead.
- *
- * # Example
- *
- * ~~~ {.rust}
- * let s = str::as_c_str("PATH", { |path| libc::getenv(path) });
- * ~~~
+ * A dummy trait to hold all the utility methods that we implement on strings.
  */
-#[inline]
-pub fn as_c_str<T>(s: &str, f: &fn(*libc::c_char) -> T) -> T {
-    do as_buf(s) |buf, len| {
-        // NB: len includes the trailing null.
-        assert!(len > 0);
-        if unsafe { *(ptr::offset(buf,len-1)) != 0 } {
-            as_c_str(to_owned(s), f)
-        } else {
-            f(buf as *libc::c_char)
+pub trait StrUtil {
+    /**
+     * Work with the byte buffer of a string as a null-terminated C string.
+     *
+     * Allows for unsafe manipulation of strings, which is useful for foreign
+     * interop. This is similar to `str::as_buf`, but guarantees null-termination.
+     * If the given slice is not already null-terminated, this function will
+     * allocate a temporary, copy the slice, null terminate it, and pass
+     * that instead.
+     *
+     * # Example
+     *
+     * ~~~ {.rust}
+     * let s = "PATH".as_c_str(|path| libc::getenv(path));
+     * ~~~
+     */
+    fn as_c_str<T>(self, f: &fn(*libc::c_char) -> T) -> T;
+}
+
+impl<'self> StrUtil for &'self str {
+    #[inline]
+    fn as_c_str<T>(self, f: &fn(*libc::c_char) -> T) -> T {
+        do as_buf(self) |buf, len| {
+            // NB: len includes the trailing null.
+            assert!(len > 0);
+            if unsafe { *(ptr::offset(buf,len-1)) != 0 } {
+                to_owned(self).as_c_str(f)
+            } else {
+                f(buf as *libc::c_char)
+            }
         }
     }
 }
 
 /**
+ * Deprecated. Use the `as_c_str` method on strings instead.
+ */
+#[inline(always)]
+pub fn as_c_str<T>(s: &str, f: &fn(*libc::c_char) -> T) -> T {
+    s.as_c_str(f)
+}
+
+/**
  * Work with the byte buffer and length of a slice.
  *
  * The given length is one byte longer than the 'official' indexable