Skip to content

Commit 63ba93f

Browse files
committed
auto merge of #11376 : alexcrichton/rust/remove-eof, r=pcwalton
This is something I have been meaning to do for awhile, but upon inspection of the `eof` method on all of the `Reader` impls you may find some interesting surprises. The method returns a good answer for almost all wrapped I/O objects (buffered readers, mem readers, util readers, etc), but the actual return value on all I/O objects themselves is almost always useless. Almost no I/O object other than a file actually knows when it's hit EOF or not. I think that pretending that all objects know when they've hit the end when almost none do is probably a bad idea. I can't really come up with a good answer to "is this file descriptor at eof" or "is this tcp stream at eof" much less "is this udp socket at eof". Due to being unable to answer these questions for *all* readers, I believe that it shouldn't be a part of the core `Reader` trait.
2 parents dd11fe1 + a18282c commit 63ba93f

File tree

16 files changed

+19
-144
lines changed

16 files changed

+19
-144
lines changed

src/libextra/time.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ pub fn strptime(s: &str, format: &str) -> Result<Tm, ~str> {
788788
}
789789
}
790790

791-
if pos == len && rdr.eof() {
791+
if pos == len && rdr.tell() as uint == format.len() {
792792
Ok(Tm {
793793
tm_sec: tm.tm_sec,
794794
tm_min: tm.tm_min,

src/libnative/io/file.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ impl io::Reader for FileDesc {
114114
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
115115
match self.inner_read(buf) { Ok(n) => Some(n), Err(..) => None }
116116
}
117-
fn eof(&mut self) -> bool { false }
118117
}
119118

120119
impl io::Writer for FileDesc {

src/libstd/io/buffered.rs

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ pub struct BufferedReader<R> {
6666
priv inner: R,
6767
priv buf: ~[u8],
6868
priv pos: uint,
69-
priv cap: uint
69+
priv cap: uint,
70+
priv eof: bool,
7071
}
7172

7273
impl<R: Reader> BufferedReader<R> {
@@ -84,7 +85,8 @@ impl<R: Reader> BufferedReader<R> {
8485
inner: inner,
8586
buf: buf,
8687
pos: 0,
87-
cap: 0
88+
cap: 0,
89+
eof: false,
8890
}
8991
}
9092

@@ -113,7 +115,7 @@ impl<R: Reader> Buffer for BufferedReader<R> {
113115
self.pos = 0;
114116
self.cap = cap;
115117
}
116-
None => {}
118+
None => { self.eof = true; }
117119
}
118120
}
119121
return self.buf.slice(self.pos, self.cap);
@@ -134,15 +136,11 @@ impl<R: Reader> Reader for BufferedReader<R> {
134136
nread
135137
};
136138
self.pos += nread;
137-
if nread == 0 && self.inner.eof() && buf.len() != 0 {
138-
return None;
139+
if nread == 0 && buf.len() != 0 && self.eof {
140+
return None;
139141
}
140142
Some(nread)
141143
}
142-
143-
fn eof(&mut self) -> bool {
144-
self.pos == self.cap && self.inner.eof()
145-
}
146144
}
147145

148146
/// Wraps a Writer and buffers output to it
@@ -270,7 +268,6 @@ impl<W> InternalBufferedWriter<W> {
270268

271269
impl<W: Reader> Reader for InternalBufferedWriter<W> {
272270
fn read(&mut self, buf: &mut [u8]) -> Option<uint> { self.get_mut_ref().inner.read(buf) }
273-
fn eof(&mut self) -> bool { self.get_mut_ref().inner.eof() }
274271
}
275272

276273
/// Wraps a Stream and buffers input and output to and from it
@@ -325,7 +322,6 @@ impl<S: Stream> Buffer for BufferedStream<S> {
325322

326323
impl<S: Stream> Reader for BufferedStream<S> {
327324
fn read(&mut self, buf: &mut [u8]) -> Option<uint> { self.inner.read(buf) }
328-
fn eof(&mut self) -> bool { self.inner.eof() }
329325
}
330326

331327
impl<S: Stream> Writer for BufferedStream<S> {
@@ -351,10 +347,6 @@ mod test {
351347
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
352348
None
353349
}
354-
355-
fn eof(&mut self) -> bool {
356-
true
357-
}
358350
}
359351

360352
impl Writer for NullStream {
@@ -370,10 +362,6 @@ mod test {
370362
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
371363
self.lengths.shift_opt()
372364
}
373-
374-
fn eof(&mut self) -> bool {
375-
self.lengths.len() == 0
376-
}
377365
}
378366

379367
#[test]
@@ -385,24 +373,20 @@ mod test {
385373
let nread = reader.read(buf);
386374
assert_eq!(Some(2), nread);
387375
assert_eq!([0, 1, 0], buf);
388-
assert!(!reader.eof());
389376

390377
let mut buf = [0];
391378
let nread = reader.read(buf);
392379
assert_eq!(Some(1), nread);
393380
assert_eq!([2], buf);
394-
assert!(!reader.eof());
395381

396382
let mut buf = [0, 0, 0];
397383
let nread = reader.read(buf);
398384
assert_eq!(Some(1), nread);
399385
assert_eq!([3, 0, 0], buf);
400-
assert!(!reader.eof());
401386

402387
let nread = reader.read(buf);
403388
assert_eq!(Some(1), nread);
404389
assert_eq!([4, 0, 0], buf);
405-
assert!(reader.eof());
406390

407391
assert_eq!(None, reader.read(buf));
408392
}
@@ -466,13 +450,11 @@ mod test {
466450

467451
impl io::Reader for S {
468452
fn read(&mut self, _: &mut [u8]) -> Option<uint> { None }
469-
fn eof(&mut self) -> bool { true }
470453
}
471454

472455
let mut stream = BufferedStream::new(S);
473456
let mut buf = [];
474457
stream.read(buf);
475-
stream.eof();
476458
stream.write(buf);
477459
stream.flush();
478460
}
@@ -539,6 +521,7 @@ mod test {
539521
assert_eq!(reader.read(buf), Some(2));
540522
assert_eq!(reader.read(buf), Some(0));
541523
assert_eq!(reader.read(buf), Some(1));
524+
assert_eq!(reader.read(buf), Some(0));
542525
assert_eq!(reader.read(buf), None);
543526
}
544527

src/libstd/io/comm_adapters.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ impl Reader for PortReader {
7777
Some(num_read)
7878
}
7979
}
80-
81-
fn eof(&mut self) -> bool { self.closed }
8280
}
8381

8482
/// Allows writing to a chan.
@@ -133,22 +131,17 @@ mod test {
133131
let mut reader = PortReader::new(port);
134132
let mut buf = ~[0u8, ..3];
135133

136-
assert_eq!(false, reader.eof());
137134

138135
assert_eq!(Some(0), reader.read([]));
139-
assert_eq!(false, reader.eof());
140136

141137
assert_eq!(Some(3), reader.read(buf));
142-
assert_eq!(false, reader.eof());
143138
assert_eq!(~[1,2,3], buf);
144139

145140
assert_eq!(Some(3), reader.read(buf));
146-
assert_eq!(false, reader.eof());
147141
assert_eq!(~[4,5,6], buf);
148142

149143
assert_eq!(Some(2), reader.read(buf));
150144
assert_eq!(~[7,8,6], buf);
151-
assert_eq!(true, reader.eof());
152145

153146
let mut err = None;
154147
let result = io::io_error::cond.trap(|io::standard_error(k, _, _)| {
@@ -158,7 +151,6 @@ mod test {
158151
});
159152
assert_eq!(Some(io::EndOfFile), err);
160153
assert_eq!(None, result);
161-
assert_eq!(true, reader.eof());
162154
assert_eq!(~[7,8,6], buf);
163155

164156
// Ensure it continues to fail in the same way.
@@ -170,7 +162,6 @@ mod test {
170162
});
171163
assert_eq!(Some(io::EndOfFile), err);
172164
assert_eq!(None, result);
173-
assert_eq!(true, reader.eof());
174165
assert_eq!(~[7,8,6], buf);
175166
}
176167

src/libstd/io/extensions.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,6 @@ mod test {
150150
Some(1)
151151
}
152152
}
153-
fn eof(&mut self) -> bool {
154-
false
155-
}
156153
}
157154

158155
struct EofReader;
@@ -161,9 +158,6 @@ mod test {
161158
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
162159
None
163160
}
164-
fn eof(&mut self) -> bool {
165-
false
166-
}
167161
}
168162

169163
struct ErroringReader;
@@ -173,9 +167,6 @@ mod test {
173167
io_error::cond.raise(placeholder_error());
174168
None
175169
}
176-
fn eof(&mut self) -> bool {
177-
false
178-
}
179170
}
180171

181172
struct PartialReader {
@@ -195,9 +186,6 @@ mod test {
195186
Some(2)
196187
}
197188
}
198-
fn eof(&mut self) -> bool {
199-
false
200-
}
201189
}
202190

203191
struct ErroringLaterReader {
@@ -215,9 +203,6 @@ mod test {
215203
None
216204
}
217205
}
218-
fn eof(&mut self) -> bool {
219-
false
220-
}
221206
}
222207

223208
struct ThreeChunkReader {
@@ -240,9 +225,6 @@ mod test {
240225
None
241226
}
242227
}
243-
fn eof(&mut self) -> bool {
244-
false
245-
}
246228
}
247229

248230
#[test]

src/libstd/io/flate.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,4 @@ impl<R: Reader> InflateReader<R> {
4949

5050
impl<R: Reader> Reader for InflateReader<R> {
5151
fn read(&mut self, _buf: &mut [u8]) -> Option<uint> { fail!() }
52-
53-
fn eof(&mut self) -> bool { fail!() }
5452
}

src/libstd/io/fs.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,14 @@ impl File {
205205
pub fn truncate(&mut self, size: i64) {
206206
self.fd.truncate(size).map_err(|e| io_error::cond.raise(e));
207207
}
208+
209+
/// Tests whether this stream has reached EOF.
210+
///
211+
/// If true, then this file will no longer continue to return data via
212+
/// `read`.
213+
pub fn eof(&self) -> bool {
214+
self.last_nread == 0
215+
}
208216
}
209217

210218
/// Unlink a file from the underlying filesystem.
@@ -597,8 +605,6 @@ impl Reader for File {
597605
}
598606
}
599607
}
600-
601-
fn eof(&mut self) -> bool { self.last_nread == 0 }
602608
}
603609

604610
impl Writer for File {

src/libstd/io/mem.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl MemReader {
124124

125125
impl Reader for MemReader {
126126
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
127-
{ if self.eof() { return None; } }
127+
if self.pos == self.buf.len() { return None }
128128

129129
let write_len = min(buf.len(), self.buf.len() - self.pos);
130130
{
@@ -138,8 +138,6 @@ impl Reader for MemReader {
138138

139139
return Some(write_len);
140140
}
141-
142-
fn eof(&mut self) -> bool { self.pos == self.buf.len() }
143141
}
144142

145143
impl Seek for MemReader {
@@ -222,7 +220,7 @@ impl<'a> BufReader<'a> {
222220

223221
impl<'a> Reader for BufReader<'a> {
224222
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
225-
{ if self.eof() { return None; } }
223+
if self.pos == self.buf.len() { return None }
226224

227225
let write_len = min(buf.len(), self.buf.len() - self.pos);
228226
{
@@ -236,8 +234,6 @@ impl<'a> Reader for BufReader<'a> {
236234

237235
return Some(write_len);
238236
}
239-
240-
fn eof(&mut self) -> bool { self.pos == self.buf.len() }
241237
}
242238

243239
impl<'a> Seek for BufReader<'a> {
@@ -369,9 +365,7 @@ mod test {
369365
assert_eq!(buf, [1, 2, 3, 4]);
370366
assert_eq!(reader.read(buf), Some(3));
371367
assert_eq!(buf.slice(0, 3), [5, 6, 7]);
372-
assert!(reader.eof());
373368
assert_eq!(reader.read(buf), None);
374-
assert!(reader.eof());
375369
}
376370

377371
#[test]
@@ -391,9 +385,7 @@ mod test {
391385
assert_eq!(buf, [1, 2, 3, 4]);
392386
assert_eq!(reader.read(buf), Some(3));
393387
assert_eq!(buf.slice(0, 3), [5, 6, 7]);
394-
assert!(reader.eof());
395388
assert_eq!(reader.read(buf), None);
396-
assert!(reader.eof());
397389
}
398390

399391
#[test]

src/libstd/io/mod.rs

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -502,26 +502,6 @@ pub trait Reader {
502502
/// Is it actually possible for 0 bytes to be read successfully?
503503
fn read(&mut self, buf: &mut [u8]) -> Option<uint>;
504504

505-
/// Return whether the Reader has reached the end of the stream.
506-
///
507-
/// # Example
508-
///
509-
/// ```rust
510-
/// use std::io;
511-
/// # let _g = ::std::io::ignore_io_error();
512-
/// let mut reader = io::stdin();
513-
///
514-
/// let mut bytes = [0, .. 10];
515-
/// reader.read(bytes);
516-
///
517-
/// if reader.eof() { println("stdin() had at most 10 bytes of data."); }
518-
/// ```
519-
///
520-
/// # Failure
521-
///
522-
/// Returns `true` on failure.
523-
fn eof(&mut self) -> bool;
524-
525505
// Convenient helper methods based on the above methods
526506

527507
/// Reads a single byte. Returns `None` on EOF.
@@ -864,12 +844,10 @@ pub trait Reader {
864844

865845
impl Reader for ~Reader {
866846
fn read(&mut self, buf: &mut [u8]) -> Option<uint> { self.read(buf) }
867-
fn eof(&mut self) -> bool { self.eof() }
868847
}
869848

870849
impl<'a> Reader for &'a mut Reader {
871850
fn read(&mut self, buf: &mut [u8]) -> Option<uint> { self.read(buf) }
872-
fn eof(&mut self) -> bool { self.eof() }
873851
}
874852

875853
fn extend_sign(val: u64, nbytes: uint) -> i64 {

src/libstd/io/net/tcp.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ impl Reader for TcpStream {
6767
}
6868
}
6969
}
70-
71-
fn eof(&mut self) -> bool { fail!() }
7270
}
7371

7472
impl Writer for TcpStream {

0 commit comments

Comments
 (0)