Skip to content

Commit d44a5b0

Browse files
committed
---
yaml --- r: 141004 b: refs/heads/try2 c: 2bc1e6b h: refs/heads/master v: v3
1 parent 3b1ff36 commit d44a5b0

File tree

2 files changed

+335
-7
lines changed

2 files changed

+335
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: d45dc8df7278649d101ce28fae1d934559e0e3c2
8+
refs/heads/try2: 2bc1e6ba606e3f08a49bbadc556558cb42b7ea32
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/rt/io/extensions.rs

Lines changed: 334 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@
1313
// XXX: Not sure how this should be structured
1414
// XXX: Iteration should probably be considered separately
1515

16+
use uint;
17+
use int;
1618
use vec;
17-
use rt::io::{Reader, read_error, standard_error, EndOfFile, DEFAULT_BUF_SIZE};
19+
use rt::io::{Reader, Writer};
20+
use rt::io::{read_error, standard_error, EndOfFile, DEFAULT_BUF_SIZE};
1821
use option::{Option, Some, None};
1922
use unstable::finally::Finally;
2023
use util;
24+
use cast;
25+
use io::{u64_to_le_bytes, u64_to_be_bytes};
2126

2227
pub trait ReaderUtil {
2328

@@ -212,7 +217,7 @@ pub trait WriterByteConversions {
212217
fn write_be_int(&mut self, n: int);
213218

214219
/// Write a big-endian u64 (8 bytes).
215-
fn write_be_u64(&mut self, n: u64);
220+
fn write_be_u64_(&mut self, n: u64);
216221

217222
/// Write a big-endian u32 (4 bytes).
218223
fn write_be_u32(&mut self, n: u32);
@@ -236,7 +241,7 @@ pub trait WriterByteConversions {
236241
fn write_be_f32(&mut self, f: f32);
237242

238243
/// Write a little-endian u64 (8 bytes).
239-
fn write_le_u64(&mut self, n: u64);
244+
fn write_le_u64_(&mut self, n: u64);
240245

241246
/// Write a little-endian u32 (4 bytes).
242247
fn write_le_u32(&mut self, n: u32);
@@ -333,13 +338,262 @@ impl<T: Reader> ReaderUtil for T {
333338
}
334339
}
335340

341+
impl<T: Reader> ReaderByteConversions for T {
342+
fn read_le_uint_n(&mut self, nbytes: uint) -> u64 {
343+
assert!(nbytes > 0 && nbytes <= 8);
344+
345+
let mut val = 0u64, pos = 0, i = nbytes;
346+
while i > 0 {
347+
val += (self.read_u8() as u64) << pos;
348+
pos += 8;
349+
i -= 1;
350+
}
351+
val
352+
}
353+
354+
fn read_le_int_n(&mut self, nbytes: uint) -> i64 {
355+
extend_sign(self.read_le_uint_n(nbytes), nbytes)
356+
}
357+
358+
fn read_be_uint_n(&mut self, nbytes: uint) -> u64 {
359+
assert!(nbytes > 0 && nbytes <= 8);
360+
361+
let mut val = 0u64, i = nbytes;
362+
while i > 0 {
363+
i -= 1;
364+
val += (self.read_u8() as u64) << i * 8;
365+
}
366+
val
367+
}
368+
369+
fn read_be_int_n(&mut self, nbytes: uint) -> i64 {
370+
extend_sign(self.read_be_uint_n(nbytes), nbytes)
371+
}
372+
373+
fn read_le_uint(&mut self) -> uint {
374+
self.read_le_uint_n(uint::bytes) as uint
375+
}
376+
377+
fn read_le_int(&mut self) -> int {
378+
self.read_le_int_n(int::bytes) as int
379+
}
380+
381+
fn read_be_uint(&mut self) -> uint {
382+
self.read_be_uint_n(uint::bytes) as uint
383+
}
384+
385+
fn read_be_int(&mut self) -> int {
386+
self.read_be_int_n(int::bytes) as int
387+
}
388+
389+
fn read_be_u64(&mut self) -> u64 {
390+
self.read_be_uint_n(8) as u64
391+
}
392+
393+
fn read_be_u32(&mut self) -> u32 {
394+
self.read_be_uint_n(4) as u32
395+
}
396+
397+
fn read_be_u16(&mut self) -> u16 {
398+
self.read_be_uint_n(2) as u16
399+
}
400+
401+
fn read_be_i64(&mut self) -> i64 {
402+
self.read_be_int_n(8) as i64
403+
}
404+
405+
fn read_be_i32(&mut self) -> i32 {
406+
self.read_be_int_n(4) as i32
407+
}
408+
409+
fn read_be_i16(&mut self) -> i16 {
410+
self.read_be_int_n(2) as i16
411+
}
412+
413+
fn read_be_f64(&mut self) -> f64 {
414+
unsafe {
415+
cast::transmute::<u64, f64>(self.read_be_u64())
416+
}
417+
}
418+
419+
fn read_be_f32(&mut self) -> f32 {
420+
unsafe {
421+
cast::transmute::<u32, f32>(self.read_be_u32())
422+
}
423+
}
424+
425+
fn read_le_u64(&mut self) -> u64 {
426+
self.read_le_uint_n(8) as u64
427+
}
428+
429+
fn read_le_u32(&mut self) -> u32 {
430+
self.read_le_uint_n(4) as u32
431+
}
432+
433+
fn read_le_u16(&mut self) -> u16 {
434+
self.read_le_uint_n(2) as u16
435+
}
436+
437+
fn read_le_i64(&mut self) -> i64 {
438+
self.read_le_int_n(8) as i64
439+
}
440+
441+
fn read_le_i32(&mut self) -> i32 {
442+
self.read_le_int_n(4) as i32
443+
}
444+
445+
fn read_le_i16(&mut self) -> i16 {
446+
self.read_le_int_n(2) as i16
447+
}
448+
449+
fn read_le_f64(&mut self) -> f64 {
450+
unsafe {
451+
cast::transmute::<u64, f64>(self.read_le_u64())
452+
}
453+
}
454+
455+
fn read_le_f32(&mut self) -> f32 {
456+
unsafe {
457+
cast::transmute::<u32, f32>(self.read_le_u32())
458+
}
459+
}
460+
461+
fn read_u8(&mut self) -> u8 {
462+
match self.read_byte() {
463+
Some(b) => b as u8,
464+
None => 0
465+
}
466+
}
467+
468+
fn read_i8(&mut self) -> i8 {
469+
match self.read_byte() {
470+
Some(b) => b as i8,
471+
None => 0
472+
}
473+
}
474+
475+
}
476+
477+
impl<T: Writer> WriterByteConversions for T {
478+
fn write_int(&mut self, n: int) {
479+
int::to_str_bytes(n, 10u, |bytes| self.write(bytes))
480+
}
481+
482+
fn write_uint(&mut self, n: uint) {
483+
uint::to_str_bytes(n, 10u, |bytes| self.write(bytes))
484+
}
485+
486+
fn write_le_uint(&mut self, n: uint) {
487+
u64_to_le_bytes(n as u64, uint::bytes, |v| self.write(v))
488+
}
489+
490+
fn write_le_int(&mut self, n: int) {
491+
u64_to_le_bytes(n as u64, int::bytes, |v| self.write(v))
492+
}
493+
494+
fn write_be_uint(&mut self, n: uint) {
495+
u64_to_be_bytes(n as u64, uint::bytes, |v| self.write(v))
496+
}
497+
498+
fn write_be_int(&mut self, n: int) {
499+
u64_to_be_bytes(n as u64, int::bytes, |v| self.write(v))
500+
}
501+
502+
fn write_be_u64_(&mut self, n: u64) {
503+
u64_to_be_bytes(n, 8u, |v| self.write(v))
504+
}
505+
506+
fn write_be_u32(&mut self, n: u32) {
507+
u64_to_be_bytes(n as u64, 4u, |v| self.write(v))
508+
}
509+
510+
fn write_be_u16(&mut self, n: u16) {
511+
u64_to_be_bytes(n as u64, 2u, |v| self.write(v))
512+
}
513+
514+
fn write_be_i64(&mut self, n: i64) {
515+
u64_to_be_bytes(n as u64, 8u, |v| self.write(v))
516+
}
517+
518+
fn write_be_i32(&mut self, n: i32) {
519+
u64_to_be_bytes(n as u64, 4u, |v| self.write(v))
520+
}
521+
522+
fn write_be_i16(&mut self, n: i16) {
523+
u64_to_be_bytes(n as u64, 2u, |v| self.write(v))
524+
}
525+
526+
fn write_be_f64(&mut self, f: f64) {
527+
unsafe {
528+
self.write_be_u64_(cast::transmute(f))
529+
}
530+
}
531+
532+
fn write_be_f32(&mut self, f: f32) {
533+
unsafe {
534+
self.write_be_u32(cast::transmute(f))
535+
}
536+
}
537+
538+
fn write_le_u64_(&mut self, n: u64) {
539+
u64_to_le_bytes(n, 8u, |v| self.write(v))
540+
}
541+
542+
fn write_le_u32(&mut self, n: u32) {
543+
u64_to_le_bytes(n as u64, 4u, |v| self.write(v))
544+
}
545+
546+
fn write_le_u16(&mut self, n: u16) {
547+
u64_to_le_bytes(n as u64, 2u, |v| self.write(v))
548+
}
549+
550+
fn write_le_i64(&mut self, n: i64) {
551+
u64_to_le_bytes(n as u64, 8u, |v| self.write(v))
552+
}
553+
554+
fn write_le_i32(&mut self, n: i32) {
555+
u64_to_le_bytes(n as u64, 4u, |v| self.write(v))
556+
}
557+
558+
fn write_le_i16(&mut self, n: i16) {
559+
u64_to_le_bytes(n as u64, 2u, |v| self.write(v))
560+
}
561+
562+
fn write_le_f64(&mut self, f: f64) {
563+
unsafe {
564+
self.write_le_u64_(cast::transmute(f))
565+
}
566+
}
567+
568+
fn write_le_f32(&mut self, f: f32) {
569+
unsafe {
570+
self.write_le_u32(cast::transmute(f))
571+
}
572+
}
573+
574+
fn write_u8(&mut self, n: u8) {
575+
self.write([n])
576+
}
577+
578+
fn write_i8(&mut self, n: i8) {
579+
self.write([n as u8])
580+
}
581+
}
582+
583+
fn extend_sign(val: u64, nbytes: uint) -> i64 {
584+
let shift = (8 - nbytes) * 8;
585+
(val << shift) as i64 >> shift
586+
}
587+
336588
#[cfg(test)]
337589
mod test {
338-
use super::*;
590+
use super::{ReaderUtil, ReaderByteConversions, WriterByteConversions};
591+
use u64;
592+
use i32;
339593
use option::{Some, None};
340594
use cell::Cell;
341-
use rt::io::mem::MemReader;
342-
use rt::io::mock::*;
595+
use rt::io::mem::{MemReader, MemWriter};
596+
use rt::io::mock::MockReader;
343597
use rt::io::{read_error, placeholder_error};
344598

345599
#[test]
@@ -572,4 +826,78 @@ mod test {
572826
assert!(buf == ~[10, 11]);
573827
}
574828

829+
// XXX: Some problem with resolve here
830+
/*#[test]
831+
fn test_read_write_le() {
832+
let uints = [0, 1, 2, 42, 10_123, 100_123_456, u64::max_value];
833+
834+
let mut writer = MemWriter::new();
835+
for uints.each |i| {
836+
writer.write_le_u64(*i);
837+
}
838+
839+
let mut reader = MemReader::new(writer.inner());
840+
for uints.each |i| {
841+
assert!(reader.read_le_u64() == *i);
842+
}
843+
}
844+
845+
#[test]
846+
fn test_read_write_be() {
847+
let uints = [0, 1, 2, 42, 10_123, 100_123_456, u64::max_value];
848+
849+
let mut writer = MemWriter::new();
850+
for uints.each |i| {
851+
writer.write_be_u64(*i);
852+
}
853+
854+
let mut reader = MemReader::new(writer.inner());
855+
for uints.each |i| {
856+
assert!(reader.read_be_u64() == *i);
857+
}
858+
}
859+
860+
#[test]
861+
fn test_read_be_int_n() {
862+
let ints = [i32::min_value, -123456, -42, -5, 0, 1, i32::max_value];
863+
864+
let mut writer = MemWriter::new();
865+
for ints.each |i| {
866+
writer.write_be_i32(*i);
867+
}
868+
869+
let mut reader = MemReader::new(writer.inner());
870+
for ints.each |i| {
871+
// this tests that the sign extension is working
872+
// (comparing the values as i32 would not test this)
873+
assert!(reader.read_be_int_n(4) == *i as i64);
874+
}
875+
}
876+
877+
#[test]
878+
fn test_read_f32() {
879+
//big-endian floating-point 8.1250
880+
let buf = ~[0x41, 0x02, 0x00, 0x00];
881+
882+
let mut writer = MemWriter::new();
883+
writer.write(buf);
884+
885+
let mut reader = MemReader::new(writer.inner());
886+
let f = reader.read_be_f32();
887+
assert!(f == 8.1250);
888+
}
889+
890+
#[test]
891+
fn test_read_write_f32() {
892+
let f:f32 = 8.1250;
893+
894+
let mut writer = MemWriter::new();
895+
writer.write_be_f32(f);
896+
writer.write_le_f32(f);
897+
898+
let mut reader = MemReader::new(writer.inner());
899+
assert!(reader.read_be_f32() == 8.1250);
900+
assert!(reader.read_le_f32() == 8.1250);
901+
}*/
902+
575903
}

0 commit comments

Comments
 (0)