Skip to content

Commit 9eda189

Browse files
committed
move io over to dvec
1 parent 636b440 commit 9eda189

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

src/libcore/dvec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl extensions<A:copy> for dvec<A> {
176176
// attempts to access this vector.
177177
//"]
178178
//fn append_iter<I:iter::base<A>>(ts: I) {
179-
// self.dvec.swap { |v|
179+
// self.data.swap { |v|
180180
// alt ts.size_hint() {
181181
// none {}
182182
// some(h) { vec::reserve(v, len(v) + h) }

src/libcore/io.rs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Basic input/output
66

77
import result::result;
88

9+
import dvec::{dvec, extensions};
910
import libc::{c_int, c_uint, c_void, size_t, ssize_t};
1011
import libc::consts::os::posix88::*;
1112
import libc::consts::os::extra::*;
@@ -574,46 +575,45 @@ fn stderr() -> writer { fd_writer(libc::STDERR_FILENO as c_int, false) }
574575
fn print(s: str) { stdout().write_str(s); }
575576
fn println(s: str) { stdout().write_line(s); }
576577

577-
type mem_buffer = @{mut buf: [mut u8],
578-
mut pos: uint};
578+
type mem_buffer = @{buf: dvec<u8>, mut pos: uint};
579579

580580
impl of writer for mem_buffer {
581581
fn write(v: [const u8]/&) {
582582
// Fast path.
583-
if self.pos == vec::len(self.buf) {
584-
for vec::each(v) {|b| self.buf += [mut b]; }
585-
self.pos += vec::len(v);
583+
let vlen = vec::len(v);
584+
let buf_len = self.buf.len();
585+
if self.pos == buf_len {
586+
self.buf.push_all(v);
587+
self.pos += vlen;
586588
ret;
587589
}
588-
// FIXME: Optimize: These should be unique pointers. // #2004
589-
let vlen = vec::len(v);
590-
let mut vpos = 0u;
591-
while vpos < vlen {
592-
let b = v[vpos];
593-
if self.pos == vec::len(self.buf) {
594-
self.buf += [mut b];
595-
} else { self.buf[self.pos] = b; }
596-
self.pos += 1u;
590+
591+
// FIXME #2004--use memcpy here?
592+
let mut pos = self.pos, vpos = 0u;
593+
while vpos < vlen && pos < buf_len {
594+
self.buf.set_elt(pos, v[vpos]);
595+
pos += 1u;
597596
vpos += 1u;
598597
}
598+
self.buf.push_slice(v, vpos, vlen);
599+
self.pos += vlen;
599600
}
600601
fn seek(offset: int, whence: seek_style) {
601602
let pos = self.pos;
602-
let len = vec::len(self.buf);
603+
let len = self.buf.len();
603604
self.pos = seek_in_buf(offset, pos, len, whence);
604605
}
605606
fn tell() -> uint { self.pos }
606607
fn flush() -> int { 0 }
607608
}
608609

609610
fn mem_buffer() -> mem_buffer {
610-
@{mut buf: [mut], mut pos: 0u}
611+
@{buf: dvec(), mut pos: 0u}
611612
}
612613
fn mem_buffer_writer(b: mem_buffer) -> writer { b as writer }
613-
fn mem_buffer_buf(b: mem_buffer) -> [u8] { vec::from_mut(b.buf) }
614+
fn mem_buffer_buf(b: mem_buffer) -> [u8] { b.buf.get() }
614615
fn mem_buffer_str(b: mem_buffer) -> str {
615-
let b_ = vec::from_mut(b.buf);
616-
str::from_bytes(b_)
616+
str::from_bytes(b.buf.get())
617617
}
618618

619619
fn with_str_writer(f: fn(writer)) -> str {
@@ -827,6 +827,21 @@ mod tests {
827827
result::ok(_) { fail; }
828828
}
829829
}
830+
831+
#[test]
832+
fn mem_buffer_overwrite() {
833+
let mbuf = mem_buffer();
834+
mbuf.write([0u8, 1u8, 2u8, 3u8]);
835+
assert mem_buffer_buf(mbuf) == [0u8, 1u8, 2u8, 3u8];
836+
mbuf.seek(-2, seek_cur);
837+
mbuf.write([4u8, 5u8, 6u8, 7u8]);
838+
assert mem_buffer_buf(mbuf) == [0u8, 1u8, 4u8, 5u8, 6u8, 7u8];
839+
mbuf.seek(-2, seek_end);
840+
mbuf.write([8u8]);
841+
mbuf.seek(1, seek_set);
842+
mbuf.write([9u8]);
843+
assert mem_buffer_buf(mbuf) == [0u8, 9u8, 4u8, 5u8, 8u8, 7u8];
844+
}
830845
}
831846

832847
//

src/test/run-pass/dvec-test.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ fn main() {
1111
d.push(8);
1212
d.push(9);
1313
d.push(10);
14-
d.push_vec([11, 12, 13]);
14+
d.push_all([11, 12, 13]);
15+
d.push_slice([11, 12, 13], 1u, 2u);
1516

16-
let exp = [5, 6, 7, 8, 9, 10, 11, 12, 13];
17+
let exp = [5, 6, 7, 8, 9, 10, 11, 12, 13, 12];
1718
assert d.get() == exp;
1819
assert d.get() == exp;
1920
assert d.len() == exp.len();
@@ -22,5 +23,5 @@ fn main() {
2223
assert e == exp[i];
2324
}
2425

25-
assert dvec::unwrap(d) == [5, 6, 7, 8, 9, 10, 11, 12, 13];
26+
assert dvec::unwrap(d) == exp;
2627
}

0 commit comments

Comments
 (0)