Skip to content

Commit 785e9b4

Browse files
committed
Merge pull request chris-morgan#67 from Kroisse/vec_ng
Replace old owned vectors to std::vec_ng::Vec<T> as possible
2 parents a6a3657 + 61e8183 commit 785e9b4

File tree

12 files changed

+84
-63
lines changed

12 files changed

+84
-63
lines changed

src/examples/server/apache_fake/main.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
extern crate time;
88
extern crate http;
99

10+
use std::vec_ng::Vec;
11+
1012
use std::io::net::ip::{SocketAddr, Ipv4Addr};
1113
use std::io::Writer;
1214

@@ -43,13 +45,13 @@ impl Server for ApacheFakeServer {
4345
weak: false,
4446
opaque_tag: ~"501b29-b1-4a285ed47404a" });
4547
w.headers.accept_ranges = Some(headers::accept_ranges::RangeUnits(
46-
~[headers::accept_ranges::Bytes]));
48+
vec!(headers::accept_ranges::Bytes)));
4749
w.headers.content_length = Some(177);
4850
w.headers.vary = Some(~"Accept-Encoding");
4951
w.headers.content_type = Some(headers::content_type::MediaType {
5052
type_: ~"text",
5153
subtype: ~"html",
52-
parameters: ~[]
54+
parameters: Vec::new()
5355
});
5456
w.headers.extensions.insert(~"X-Pad", ~"avoid browser bug");
5557

src/examples/server/hello_world/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
extern crate time;
66
extern crate http;
77

8+
use std::vec_ng::Vec;
9+
810
use std::io::net::ip::{SocketAddr, Ipv4Addr};
911
use std::io::Writer;
1012

@@ -25,7 +27,7 @@ impl Server for HelloWorldServer {
2527
w.headers.content_type = Some(MediaType {
2628
type_: ~"text",
2729
subtype: ~"plain",
28-
parameters: ~[(~"charset", ~"UTF-8")]
30+
parameters: vec!((~"charset", ~"UTF-8"))
2931
});
3032
w.headers.server = Some(~"Example");
3133

src/examples/server/info/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
extern crate time;
77
extern crate http;
88

9+
use std::vec_ng::Vec;
10+
911
use std::io::net::ip::{SocketAddr, Ipv4Addr};
1012
use std::io::Writer;
1113

@@ -26,7 +28,7 @@ impl Server for InfoServer {
2628
w.headers.content_type = Some(MediaType {
2729
type_: ~"text",
2830
subtype: ~"html",
29-
parameters: ~[(~"charset", ~"UTF-8")]
31+
parameters: vec!((~"charset", ~"UTF-8"))
3032
});
3133
w.headers.server = Some(~"Rust Thingummy/0.0-pre");
3234
w.write(bytes!("<!DOCTYPE html><title>Rust HTTP server</title>")).unwrap();

src/examples/server/request_uri/main.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
extern crate time;
1010
extern crate http;
1111

12+
use std::vec_ng::Vec;
13+
1214
use std::io::net::ip::{SocketAddr, Ipv4Addr};
1315
use std::io::Writer;
1416

@@ -46,7 +48,7 @@ impl Server for RequestUriServer {
4648
(&Options, &Star) => {
4749
// Querying server capabilities. That's nice and simple. I can handle these methods:
4850
// (TODO: let user code override this, providing a default method.)
49-
w.headers.allow = Some(~[Get, Head, Post, Put, Delete, Trace, Options, Connect, Patch]);
51+
w.headers.allow = Some(vec!(Get, Head, Post, Put, Delete, Trace, Options, Connect, Patch));
5052
w.headers.content_length = Some(0);
5153
return;
5254
},
@@ -61,7 +63,7 @@ impl Server for RequestUriServer {
6163
w.headers.content_type = Some(MediaType {
6264
type_: ~"text",
6365
subtype: ~"html",
64-
parameters: ~[]
66+
parameters: Vec::new()
6567
});
6668

6769
w.write(bytes!("<!DOCTYPE html><title>Rust HTTP server</title>")).unwrap();

src/http/buffer.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use std::io::{IoResult, Stream};
44
use std::cmp::min;
5+
use std::vec_ng::Vec;
56
use std::vec;
67
use std::num::ToStrRadix;
78

@@ -12,22 +13,22 @@ static WRITE_BUF_SIZE: uint = 0x10000;
1213

1314
pub struct BufferedStream<T> {
1415
wrapped: T,
15-
read_buffer: ~[u8],
16+
read_buffer: Vec<u8>,
1617
// The current position in the buffer
1718
read_pos: uint,
1819
// The last valid position in the reader
1920
read_max: uint,
20-
write_buffer: ~[u8],
21+
write_buffer: Vec<u8>,
2122
write_len: uint,
2223

2324
writing_chunked_body: bool,
2425
}
2526

2627
impl<T: Stream> BufferedStream<T> {
2728
pub fn new(stream: T) -> BufferedStream<T> {
28-
let mut read_buffer = vec::with_capacity(READ_BUF_SIZE);
29+
let mut read_buffer = Vec::with_capacity(READ_BUF_SIZE);
2930
unsafe { read_buffer.set_len(READ_BUF_SIZE); }
30-
let mut write_buffer = vec::with_capacity(WRITE_BUF_SIZE);
31+
let mut write_buffer = Vec::with_capacity(WRITE_BUF_SIZE);
3132
unsafe { write_buffer.set_len(WRITE_BUF_SIZE); }
3233
BufferedStream {
3334
wrapped: stream,
@@ -52,14 +53,14 @@ impl<T: Reader> BufferedStream<T> {
5253
(0, _) => fail!("poke called when buffer is full"),
5354
(_, _) => self.read_pos -= 1,
5455
}
55-
self.read_buffer[self.read_pos] = byte;
56+
self.read_buffer.as_mut_slice()[self.read_pos] = byte;
5657
}
5758

5859
#[inline]
5960
fn fill_buffer(&mut self) -> IoResult<()> {
6061
assert_eq!(self.read_pos, self.read_max);
6162
self.read_pos = 0;
62-
match self.wrapped.read(self.read_buffer) {
63+
match self.wrapped.read(self.read_buffer.as_mut_slice()) {
6364
Ok(i) => {
6465
self.read_max = i;
6566
Ok(())
@@ -80,7 +81,7 @@ impl<T: Reader> BufferedStream<T> {
8081
try!(self.fill_buffer());
8182
}
8283
self.read_pos += 1;
83-
Ok(self.read_buffer[self.read_pos - 1])
84+
Ok(self.read_buffer.as_slice()[self.read_pos - 1])
8485
}
8586
}
8687

@@ -135,17 +136,20 @@ impl<T: Writer> Writer for BufferedStream<T> {
135136
try!(self.wrapped.write(bytes!("\r\n")));
136137
}
137138
} else {
138-
unsafe { self.write_buffer.mut_slice_from(self.write_len).copy_memory(buf); }
139+
unsafe {
140+
let len = self.write_buffer.len();
141+
self.write_buffer.mut_slice(self.write_len, len).copy_memory(buf);
142+
}
139143

140144
self.write_len += buf.len();
141145
if self.write_len == self.write_buffer.len() {
142146
if self.writing_chunked_body {
143147
let s = format!("{}\r\n", self.write_len.to_str_radix(16));
144148
try!(self.wrapped.write(s.as_bytes()));
145-
try!(self.wrapped.write(self.write_buffer));
149+
try!(self.wrapped.write(self.write_buffer.as_slice()));
146150
try!(self.wrapped.write(bytes!("\r\n")));
147151
} else {
148-
try!(self.wrapped.write(self.write_buffer));
152+
try!(self.wrapped.write(self.write_buffer.as_slice()));
149153
}
150154
self.write_len = 0;
151155
}

src/http/headers/accept_ranges.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! The Accept-Ranges request header, defined in RFC 2616, Section 14.5.
22
3+
use std::vec_ng::Vec;
34
use std::io::IoResult;
45
use std::ascii::StrAsciiExt;
56

@@ -13,7 +14,7 @@ pub enum RangeUnit {
1314
#[deriving(Clone,Eq)]
1415
// RFC 2616: acceptable-ranges = 1#range-unit | "none"
1516
pub enum AcceptableRanges {
16-
RangeUnits(~[RangeUnit]),
17+
RangeUnits(Vec<RangeUnit>),
1718
NoAcceptableRanges,
1819
}
1920

@@ -23,7 +24,7 @@ static BYTES: &'static [u8] = bytes!("bytes");
2324
impl super::HeaderConvertible for AcceptableRanges {
2425
fn from_stream<R: Reader>(reader: &mut super::HeaderValueByteIterator<R>)
2526
-> Option<AcceptableRanges> {
26-
let mut range_units = ~[];
27+
let mut range_units = Vec::new();
2728
loop {
2829
match reader.read_token() {
2930
Some(token) => {

src/http/headers/connection.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,25 @@ impl super::HeaderConvertible for Connection {
5858

5959
#[test]
6060
fn test_connection() {
61+
use std::vec_ng::Vec;
6162
use headers::test_utils::{assert_conversion_correct,
6263
assert_interpretation_correct,
6364
assert_invalid};
64-
assert_conversion_correct("close", ~[Close]);
65-
assert_conversion_correct("Foo", ~[Token(~"Foo")]);
66-
assert_conversion_correct("Foo, Keep-Alive", ~[Token(~"Foo"), Token(~"Keep-Alive")]);
67-
assert_conversion_correct("Foo, close", ~[Token(~"Foo"), Close]);
68-
assert_conversion_correct("close, Bar", ~[Close, Token(~"Bar")]);
65+
assert_conversion_correct("close", vec!(Close));
66+
assert_conversion_correct("Foo", vec!(Token(~"Foo")));
67+
assert_conversion_correct("Foo, Keep-Alive", vec!(Token(~"Foo"), Token(~"Keep-Alive")));
68+
assert_conversion_correct("Foo, close", vec!(Token(~"Foo"), Close));
69+
assert_conversion_correct("close, Bar", vec!(Close, Token(~"Bar")));
6970
70-
assert_interpretation_correct("close", ~[Close]);
71-
assert_interpretation_correct("foo", ~[Token(~"Foo")]);
72-
assert_interpretation_correct("close \r\n , keep-ALIVE", ~[Close, Token(~"Keep-Alive")]);
73-
assert_interpretation_correct("foo,close", ~[Token(~"Foo"), Close]);
74-
assert_interpretation_correct("close, bar", ~[Close, Token(~"Bar")]);
71+
assert_interpretation_correct("close", vec!(Close));
72+
assert_interpretation_correct("foo", vec!(Token(~"Foo")));
73+
assert_interpretation_correct("close \r\n , keep-ALIVE", vec!(Close, Token(~"Keep-Alive")));
74+
assert_interpretation_correct("foo,close", vec!(Token(~"Foo"), Close));
75+
assert_interpretation_correct("close, bar", vec!(Close, Token(~"Bar")));
7576
assert_interpretation_correct("CLOSE", Close);
7677
77-
assert_invalid::<~[Connection]>("foo bar");
78-
assert_invalid::<~[Connection]>("foo bar");
79-
assert_invalid::<~[Connection]>("foo, bar baz");
80-
assert_invalid::<~[Connection]>("foo, , baz");
78+
assert_invalid::<Vec<Connection>>("foo bar");
79+
assert_invalid::<Vec<Connection>>("foo bar");
80+
assert_invalid::<Vec<Connection>>("foo, bar baz");
81+
assert_invalid::<Vec<Connection>>("foo, , baz");
8182
}

src/http/headers/content_type.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
//! The Content-Type entity header, defined in RFC 2616, Section 14.17.
22
use headers::serialization_utils::{push_parameters, WriterUtil};
3+
use std::vec_ng::Vec;
34
use std::io::IoResult;
45
use std::fmt;
56

67
#[deriving(Clone, Eq)]
78
pub struct MediaType {
89
type_: ~str,
910
subtype: ~str,
10-
parameters: ~[(~str, ~str)],
11+
parameters: Vec<(~str, ~str)>,
1112
}
1213

13-
pub fn MediaType(type_: ~str, subtype: ~str, parameters: ~[(~str, ~str)]) -> MediaType {
14+
pub fn MediaType(type_: ~str, subtype: ~str, parameters: Vec<(~str, ~str)>) -> MediaType {
1415
MediaType {
1516
type_: type_,
1617
subtype: subtype,
@@ -28,7 +29,7 @@ impl fmt::Show for MediaType {
2829
//s.push_parameters(self.parameters);
2930
//s
3031
let s = format!("{}/{}", self.type_, self.subtype);
31-
f.buf.write(push_parameters(s, self.parameters).as_bytes())
32+
f.buf.write(push_parameters(s, self.parameters.as_slice()).as_bytes())
3233
}
3334
}
3435

@@ -63,7 +64,7 @@ impl super::HeaderConvertible for MediaType {
6364
try!(writer.write_token(self.type_));
6465
try!(writer.write(['/' as u8]));
6566
try!(writer.write_token(self.subtype));
66-
writer.write_parameters(self.parameters)
67+
writer.write_parameters(self.parameters.as_slice())
6768
}
6869

6970
fn http_value(&self) -> ~str {
@@ -75,13 +76,13 @@ impl super::HeaderConvertible for MediaType {
7576
fn test_content_type() {
7677
use headers::test_utils::{assert_conversion_correct, assert_interpretation_correct,
7778
assert_invalid};
78-
assert_conversion_correct("type/subtype", MediaType(~"type", ~"subtype", ~[]));
79+
assert_conversion_correct("type/subtype", MediaType(~"type", ~"subtype", Vec::new()));
7980
assert_conversion_correct("type/subtype;key=value",
80-
MediaType(~"type", ~"subtype", ~[(~"key", ~"value")]));
81+
MediaType(~"type", ~"subtype", vec!((~"key", ~"value"))));
8182
assert_conversion_correct("type/subtype;key=value;q=0.1",
82-
MediaType(~"type", ~"subtype", ~[(~"key", ~"value"), (~"q", ~"0.1")]));
83+
MediaType(~"type", ~"subtype", vec!((~"key", ~"value"), (~"q", ~"0.1"))));
8384
assert_interpretation_correct("type/subtype ; key = value ; q = 0.1",
84-
MediaType(~"type", ~"subtype", ~[(~"key", ~"value"), (~"q", ~"0.1")]));
85+
MediaType(~"type", ~"subtype", vec!((~"key", ~"value"), (~"q", ~"0.1"))));
8586
8687
assert_invalid::<MediaType>("");
8788
assert_invalid::<MediaType>("/");

src/http/headers/mod.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
//! unknown headers are stored in a map in the traditional way.
66
77
use url::Url;
8+
use std::vec_ng::Vec;
89
use std::io::IoResult;
910
use time::{Tm, strptime};
1011
use rfc2616::{is_token_item, is_separator, CR, LF, SP, HT, COLON};
@@ -332,8 +333,8 @@ impl<'a, R: Reader> HeaderValueByteIterator<'a, R> {
332333
///
333334
/// The return value ``None`` is reserved for syntax errors in parameters that exist; a mere
334335
/// absense of parameters will lead to returning an empty vector instead.
335-
fn read_parameters(&mut self) -> Option<~[(~str, ~str)]> {
336-
let mut result = ~[];
336+
fn read_parameters(&mut self) -> Option<Vec<(~str, ~str)>> {
337+
let mut result = Vec::new();
337338
loop {
338339
match self.next() {
339340
//This catches the LWS after the last ';', and can probably be replaced with
@@ -552,13 +553,13 @@ pub trait HeaderConvertible: Eq + Clone {
552553
}
553554

554555
/// A header with multiple comma-separated values. Implement this and a HeaderConvertible
555-
/// implementation for ~[T] is yours for free—just make sure your reading does not consume the
556+
/// implementation for Vec<T> is yours for free—just make sure your reading does not consume the
556557
/// comma.
557558
pub trait CommaListHeaderConvertible: HeaderConvertible {}
558559

559-
impl<T: CommaListHeaderConvertible> HeaderConvertible for ~[T] {
560-
fn from_stream<R: Reader>(reader: &mut HeaderValueByteIterator<R>) -> Option<~[T]> {
561-
let mut result = ~[];
560+
impl<T: CommaListHeaderConvertible> HeaderConvertible for Vec<T> {
561+
fn from_stream<R: Reader>(reader: &mut HeaderValueByteIterator<R>) -> Option<Vec<T>> {
562+
let mut result = Vec::new();
562563
loop {
563564
match HeaderConvertible::from_stream(reader) {
564565
Some(h) => result.push(h),
@@ -871,6 +872,7 @@ macro_rules! headers_mod {
871872
$attr;
872873
873874
#[allow(unused_imports)];
875+
use std::vec_ng::Vec;
874876
use std::io::IoResult;
875877
use time;
876878
use collections::treemap::{TreeMap, Entries};
@@ -1012,11 +1014,11 @@ headers_mod! {
10121014

10131015
// RFC 2616, Section 4.5: General Header Fields
10141016
0, "Cache-Control", "Cache-Control", CacheControl, cache_control, ~str;
1015-
1, "Connection", "Connection", Connection, connection, ~[headers::connection::Connection];
1017+
1, "Connection", "Connection", Connection, connection, Vec<headers::connection::Connection>;
10161018
2, "Date", "Date", Date, date, time::Tm;
10171019
3, "Pragma", "Pragma", Pragma, pragma, ~str;
10181020
4, "Trailer", "Trailer", Trailer, trailer, ~str;
1019-
5, "Transfer-Encoding", "Transfer-Encoding", TransferEncoding, transfer_encoding, ~[headers::transfer_encoding::TransferCoding];
1021+
5, "Transfer-Encoding", "Transfer-Encoding", TransferEncoding, transfer_encoding, Vec<headers::transfer_encoding::TransferCoding>;
10201022
6, "Upgrade", "Upgrade", Upgrade, upgrade, ~str;
10211023
7, "Via", "Via", Via, via, ~str;
10221024
8, "Warning", "Warning", Warning, warning, ~str;
@@ -1043,7 +1045,7 @@ headers_mod! {
10431045
27, "User-Agent", "User-Agent", UserAgent, user_agent, ~str;
10441046

10451047
// RFC 2616, Section 7.1: Entity Header Fields
1046-
28, "Allow", "Allow", Allow, allow, ~[::method::Method];
1048+
28, "Allow", "Allow", Allow, allow, Vec<::method::Method>;
10471049
29, "Content-Encoding", "Content-Encoding", ContentEncoding, content_encoding, ~str;
10481050
30, "Content-Language", "Content-Language", ContentLanguage, content_language, ~str;
10491051
31, "Content-Length", "Content-Length", ContentLength, content_length, uint;
@@ -1063,11 +1065,11 @@ headers_mod! {
10631065

10641066
// RFC 2616, Section 4.5: General Header Fields
10651067
0, "Cache-Control", "Cache-Control", CacheControl, cache_control, ~str;
1066-
1, "Connection", "Connection", Connection, connection, ~[headers::connection::Connection];
1068+
1, "Connection", "Connection", Connection, connection, Vec<headers::connection::Connection>;
10671069
2, "Date", "Date", Date, date, time::Tm;
10681070
3, "Pragma", "Pragma", Pragma, pragma, ~str;
10691071
4, "Trailer", "Trailer", Trailer, trailer, ~str;
1070-
5, "Transfer-Encoding", "Transfer-Encoding", TransferEncoding, transfer_encoding, ~[headers::transfer_encoding::TransferCoding];
1072+
5, "Transfer-Encoding", "Transfer-Encoding", TransferEncoding, transfer_encoding, Vec<headers::transfer_encoding::TransferCoding>;
10711073
6, "Upgrade", "Upgrade", Upgrade, upgrade, ~str;
10721074
7, "Via", "Via", Via, via, ~str;
10731075
8, "Warning", "Warning", Warning, warning, ~str;
@@ -1085,7 +1087,7 @@ headers_mod! {
10851087
18, "WWW-Authenticate", "Www-Authenticate", WwwAuthenticate, www_authenticate, ~str;
10861088

10871089
// RFC 2616, Section 7.1: Entity Header Fields
1088-
19, "Allow", "Allow", Allow, allow, ~[::method::Method];
1090+
19, "Allow", "Allow", Allow, allow, Vec<::method::Method>;
10891091
20, "Content-Encoding", "Content-Encoding", ContentEncoding, content_encoding, ~str;
10901092
21, "Content-Language", "Content-Language", ContentLanguage, content_language, ~str;
10911093
22, "Content-Length", "Content-Length", ContentLength, content_length, uint;

0 commit comments

Comments
 (0)