Auto merge of #9684 - danlrobertson:i9655, r=KiChjang

Add methods to move ByteStrings underlying bytes

Add methods to move the underlying `Vec<u8>` for `ByteString`.

I saw this as at least two methods. One to "move and replace with and empty Vec<u8> (`bytes`), and one to take ownership of the whole object (`own_bytes`). I typically also don't like adding methods with out unit tests. If you think they're unnecessary, just let me know.

As always, please let me know if you have any comments, critiques, or nits!

Fixes #9655

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.svg" height="40" alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9684)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-02-19 17:21:14 +05:30
commit aae6525f7d
4 changed files with 36 additions and 9 deletions

View file

@ -7,6 +7,7 @@
use std::ascii::AsciiExt;
use std::borrow::ToOwned;
use std::hash::{Hash, Hasher};
use std::mem;
use std::ops;
use std::str;
use std::str::FromStr;
@ -24,14 +25,18 @@ impl ByteString {
/// Returns `self` as a string, if it encodes valid UTF-8, and `None`
/// otherwise.
pub fn as_str(&self) -> Option<&str> {
let ByteString(ref vec) = *self;
str::from_utf8(&vec).ok()
str::from_utf8(&self.0).ok()
}
/// Returns ownership of the underlying Vec<u8> and copies an empty
/// vec in its place
pub fn bytes(&mut self) -> Vec<u8> {
mem::replace(&mut self.0, Vec::new())
}
/// Returns the length.
pub fn len(&self) -> usize {
let ByteString(ref vector) = *self;
vector.len()
self.0.len()
}
/// Compare `self` to `other`, matching AZ and az as equal.
@ -47,8 +52,7 @@ impl ByteString {
/// Returns whether `self` is a `token`, as defined by
/// [RFC 2616](http://tools.ietf.org/html/rfc2616#page-17).
pub fn is_token(&self) -> bool {
let ByteString(ref vec) = *self;
is_token(vec)
is_token(&self.0)
}
/// Returns whether `self` is a `field-value`, as defined by
@ -62,9 +66,8 @@ impl ByteString {
LF,
SPHT, // SP or HT
}
let ByteString(ref vec) = *self;
let mut prev = PreviousCharacter::Other; // The previous character
vec.iter().all(|&x| {
self.0.iter().all(|&x| {
// http://tools.ietf.org/html/rfc2616#section-2.2
match x {
13 => { // CR
@ -117,6 +120,12 @@ impl ByteString {
}
}
impl Into<Vec<u8>> for ByteString {
fn into(self) -> Vec<u8> {
self.0
}
}
impl Hash for ByteString {
fn hash<H: Hasher>(&self, state: &mut H) {
let ByteString(ref vec) = *self;

View file

@ -456,7 +456,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
None => {}
}
headers.set_raw(name_str.to_owned(), vec![value.to_vec()]);
headers.set_raw(name_str.to_owned(), vec![value.into()]);
Ok(())
}

View file

@ -0,0 +1,17 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use script::dom::bindings::str::ByteString;
#[test]
fn test_byte_string_move() {
let mut byte_str = ByteString::new(vec![0x73, 0x65, 0x72, 0x76, 0x6f]);
let mut byte_vec = byte_str.bytes();
assert_eq!(byte_vec, "servo".as_bytes());
assert_eq!(*byte_str, []);
byte_vec = byte_str.into();
assert_eq!(byte_vec, Vec::new());
}

View file

@ -9,5 +9,6 @@ extern crate util;
#[cfg(all(test, target_pointer_width = "64"))] mod size_of;
#[cfg(test)] mod textinput;
#[cfg(test)] mod dom {
mod bindings;
mod blob;
}