mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
DSTify BytesContainer
This commit is contained in:
parent
39f90aead4
commit
423e17b9df
@ -67,6 +67,7 @@ println!("path exists: {}", path.exists());
|
|||||||
|
|
||||||
#![experimental]
|
#![experimental]
|
||||||
|
|
||||||
|
use core::kinds::Sized;
|
||||||
use c_str::CString;
|
use c_str::CString;
|
||||||
use clone::Clone;
|
use clone::Clone;
|
||||||
use fmt;
|
use fmt;
|
||||||
@ -626,7 +627,7 @@ pub trait GenericPath: Clone + GenericPathUnsafe {
|
|||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
fn push_many<T: BytesContainer>(&mut self, paths: &[T]) {
|
fn push_many<T: BytesContainer>(&mut self, paths: &[T]) {
|
||||||
let t: Option<T> = None;
|
let t: Option<&T> = None;
|
||||||
if BytesContainer::is_str(t) {
|
if BytesContainer::is_str(t) {
|
||||||
for p in paths.iter() {
|
for p in paths.iter() {
|
||||||
self.push(p.container_as_str().unwrap())
|
self.push(p.container_as_str().unwrap())
|
||||||
@ -791,14 +792,9 @@ pub trait GenericPath: Clone + GenericPathUnsafe {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A trait that represents something bytes-like (e.g. a &[u8] or a &str)
|
/// A trait that represents something bytes-like (e.g. a &[u8] or a &str)
|
||||||
pub trait BytesContainer {
|
pub trait BytesContainer for Sized? {
|
||||||
/// Returns a &[u8] representing the receiver
|
/// Returns a &[u8] representing the receiver
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8];
|
fn container_as_bytes<'a>(&'a self) -> &'a [u8];
|
||||||
/// Consumes the receiver and converts it into Vec<u8>
|
|
||||||
#[inline]
|
|
||||||
fn container_into_owned_bytes(self) -> Vec<u8> {
|
|
||||||
self.container_as_bytes().to_vec()
|
|
||||||
}
|
|
||||||
/// Returns the receiver interpreted as a utf-8 string, if possible
|
/// Returns the receiver interpreted as a utf-8 string, if possible
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
||||||
@ -807,7 +803,7 @@ pub trait BytesContainer {
|
|||||||
/// Returns whether .container_as_str() is guaranteed to not fail
|
/// Returns whether .container_as_str() is guaranteed to not fail
|
||||||
// FIXME (#8888): Remove unused arg once ::<for T> works
|
// FIXME (#8888): Remove unused arg once ::<for T> works
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_str(_: Option<Self>) -> bool { false }
|
fn is_str(_: Option<&Self>) -> bool { false }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A trait that represents the unsafe operations on GenericPaths
|
/// A trait that represents the unsafe operations on GenericPaths
|
||||||
@ -859,48 +855,44 @@ impl<'a, P: GenericPath> Display<'a, P> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> BytesContainer for &'a str {
|
impl BytesContainer for str {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
fn container_as_bytes(&self) -> &[u8] {
|
||||||
self.as_bytes()
|
self.as_bytes()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
fn container_as_str(&self) -> Option<&str> {
|
||||||
Some(*self)
|
Some(self)
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_str(_: Option<&'a str>) -> bool { true }
|
fn is_str(_: Option<&str>) -> bool { true }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BytesContainer for String {
|
impl BytesContainer for String {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
fn container_as_bytes(&self) -> &[u8] {
|
||||||
self.as_bytes()
|
self.as_bytes()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
fn container_as_str(&self) -> Option<&str> {
|
||||||
Some(self.as_slice())
|
Some(self.as_slice())
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_str(_: Option<String>) -> bool { true }
|
fn is_str(_: Option<&String>) -> bool { true }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> BytesContainer for &'a [u8] {
|
impl BytesContainer for [u8] {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
fn container_as_bytes(&self) -> &[u8] {
|
||||||
*self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BytesContainer for Vec<u8> {
|
impl BytesContainer for Vec<u8> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
fn container_as_bytes(&self) -> &[u8] {
|
||||||
self.as_slice()
|
self.as_slice()
|
||||||
}
|
}
|
||||||
#[inline]
|
|
||||||
fn container_into_owned_bytes(self) -> Vec<u8> {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BytesContainer for CString {
|
impl BytesContainer for CString {
|
||||||
@ -920,7 +912,20 @@ impl<'a> BytesContainer for str::MaybeOwned<'a> {
|
|||||||
Some(self.as_slice())
|
Some(self.as_slice())
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_str(_: Option<str::MaybeOwned>) -> bool { true }
|
fn is_str(_: Option<&str::MaybeOwned>) -> bool { true }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, Sized? T: BytesContainer> BytesContainer for &'a T {
|
||||||
|
#[inline]
|
||||||
|
fn container_as_bytes(&self) -> &[u8] {
|
||||||
|
(**self).container_as_bytes()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn container_as_str(&self) -> Option<&str> {
|
||||||
|
(**self).container_as_str()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn is_str(_: Option<& &'a T>) -> bool { BytesContainer::is_str(None::<&T>) }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
@ -117,17 +117,6 @@ impl BytesContainer for Path {
|
|||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
||||||
self.as_vec()
|
self.as_vec()
|
||||||
}
|
}
|
||||||
#[inline]
|
|
||||||
fn container_into_owned_bytes(self) -> Vec<u8> {
|
|
||||||
self.into_vec()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> BytesContainer for &'a Path {
|
|
||||||
#[inline]
|
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
|
||||||
self.as_vec()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GenericPathUnsafe for Path {
|
impl GenericPathUnsafe for Path {
|
||||||
|
@ -149,28 +149,11 @@ impl BytesContainer for Path {
|
|||||||
self.as_vec()
|
self.as_vec()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn container_into_owned_bytes(self) -> Vec<u8> {
|
|
||||||
self.into_vec()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
||||||
self.as_str()
|
self.as_str()
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_str(_: Option<Path>) -> bool { true }
|
fn is_str(_: Option<&Path>) -> bool { true }
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> BytesContainer for &'a Path {
|
|
||||||
#[inline]
|
|
||||||
fn container_as_bytes<'a>(&'a self) -> &'a [u8] {
|
|
||||||
self.as_vec()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
fn container_as_str<'a>(&'a self) -> Option<&'a str> {
|
|
||||||
self.as_str()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
fn is_str(_: Option<&'a Path>) -> bool { true }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GenericPathUnsafe for Path {
|
impl GenericPathUnsafe for Path {
|
||||||
|
Loading…
Reference in New Issue
Block a user