13
13
// XXX: Not sure how this should be structured
14
14
// XXX: Iteration should probably be considered separately
15
15
16
+ use uint;
17
+ use int;
16
18
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 } ;
18
21
use option:: { Option , Some , None } ;
19
22
use unstable:: finally:: Finally ;
20
23
use util;
24
+ use cast;
25
+ use io:: { u64_to_le_bytes, u64_to_be_bytes} ;
21
26
22
27
pub trait ReaderUtil {
23
28
@@ -212,7 +217,7 @@ pub trait WriterByteConversions {
212
217
fn write_be_int ( & mut self , n : int ) ;
213
218
214
219
/// 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 ) ;
216
221
217
222
/// Write a big-endian u32 (4 bytes).
218
223
fn write_be_u32 ( & mut self , n : u32 ) ;
@@ -236,7 +241,7 @@ pub trait WriterByteConversions {
236
241
fn write_be_f32 ( & mut self , f : f32 ) ;
237
242
238
243
/// 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 ) ;
240
245
241
246
/// Write a little-endian u32 (4 bytes).
242
247
fn write_le_u32 ( & mut self , n : u32 ) ;
@@ -333,13 +338,262 @@ impl<T: Reader> ReaderUtil for T {
333
338
}
334
339
}
335
340
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, 10 u, |bytes| self . write ( bytes) )
480
+ }
481
+
482
+ fn write_uint ( & mut self , n : uint ) {
483
+ uint:: to_str_bytes ( n, 10 u, |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, 8 u, |v| self . write ( v) )
504
+ }
505
+
506
+ fn write_be_u32 ( & mut self , n : u32 ) {
507
+ u64_to_be_bytes ( n as u64 , 4 u, |v| self . write ( v) )
508
+ }
509
+
510
+ fn write_be_u16 ( & mut self , n : u16 ) {
511
+ u64_to_be_bytes ( n as u64 , 2 u, |v| self . write ( v) )
512
+ }
513
+
514
+ fn write_be_i64 ( & mut self , n : i64 ) {
515
+ u64_to_be_bytes ( n as u64 , 8 u, |v| self . write ( v) )
516
+ }
517
+
518
+ fn write_be_i32 ( & mut self , n : i32 ) {
519
+ u64_to_be_bytes ( n as u64 , 4 u, |v| self . write ( v) )
520
+ }
521
+
522
+ fn write_be_i16 ( & mut self , n : i16 ) {
523
+ u64_to_be_bytes ( n as u64 , 2 u, |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, 8 u, |v| self . write ( v) )
540
+ }
541
+
542
+ fn write_le_u32 ( & mut self , n : u32 ) {
543
+ u64_to_le_bytes ( n as u64 , 4 u, |v| self . write ( v) )
544
+ }
545
+
546
+ fn write_le_u16 ( & mut self , n : u16 ) {
547
+ u64_to_le_bytes ( n as u64 , 2 u, |v| self . write ( v) )
548
+ }
549
+
550
+ fn write_le_i64 ( & mut self , n : i64 ) {
551
+ u64_to_le_bytes ( n as u64 , 8 u, |v| self . write ( v) )
552
+ }
553
+
554
+ fn write_le_i32 ( & mut self , n : i32 ) {
555
+ u64_to_le_bytes ( n as u64 , 4 u, |v| self . write ( v) )
556
+ }
557
+
558
+ fn write_le_i16 ( & mut self , n : i16 ) {
559
+ u64_to_le_bytes ( n as u64 , 2 u, |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
+
336
588
#[ cfg( test) ]
337
589
mod test {
338
- use super :: * ;
590
+ use super :: { ReaderUtil , ReaderByteConversions , WriterByteConversions } ;
591
+ use u64;
592
+ use i32;
339
593
use option:: { Some , None } ;
340
594
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 ;
343
597
use rt:: io:: { read_error, placeholder_error} ;
344
598
345
599
#[ test]
@@ -572,4 +826,78 @@ mod test {
572
826
assert ! ( buf == ~[ 10 , 11 ] ) ;
573
827
}
574
828
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
+
575
903
}
0 commit comments