@@ -144,6 +144,12 @@ pub trait ReaderUtil {
144
144
/// Read a big-endian i16 (2 bytes).
145
145
fn read_be_i16 ( & self ) -> i16 ;
146
146
147
+ /// Read a big-endian IEEE754 double-precision floating-point (8 bytes).
148
+ fn read_be_f64 ( & self ) -> f64 ;
149
+
150
+ /// Read a big-endian IEEE754 single-precision floating-point (4 bytes).
151
+ fn read_be_f32 ( & self ) -> f32 ;
152
+
147
153
/// Read a little-endian u64 (8 bytes).
148
154
fn read_le_u64 ( & self ) -> u64 ;
149
155
@@ -162,6 +168,14 @@ pub trait ReaderUtil {
162
168
/// Read a litle-endian i16 (2 bytes).
163
169
fn read_le_i16 ( & self ) -> i16 ;
164
170
171
+ /// Read a litten-endian IEEE754 double-precision floating-point
172
+ /// (8 bytes).
173
+ fn read_le_f64 ( & self ) -> f64 ;
174
+
175
+ /// Read a litten-endian IEEE754 single-precision floating-point
176
+ /// (4 bytes).
177
+ fn read_le_f32 ( & self ) -> f32 ;
178
+
165
179
/// Read a u8 (1 byte).
166
180
fn read_u8 ( & self ) -> u8 ;
167
181
@@ -368,6 +382,18 @@ impl<T:Reader> ReaderUtil for T {
368
382
self . read_be_int_n ( 2 ) as i16
369
383
}
370
384
385
+ fn read_be_f64 ( & self ) -> f64 {
386
+ unsafe {
387
+ cast:: transmute :: < u64 , f64 > ( self . read_be_u64 ( ) )
388
+ }
389
+ }
390
+
391
+ fn read_be_f32 ( & self ) -> f32 {
392
+ unsafe {
393
+ cast:: transmute :: < u32 , f32 > ( self . read_be_u32 ( ) )
394
+ }
395
+ }
396
+
371
397
fn read_le_u64 ( & self ) -> u64 {
372
398
self . read_le_uint_n ( 8 ) as u64
373
399
}
@@ -392,6 +418,18 @@ impl<T:Reader> ReaderUtil for T {
392
418
self . read_le_int_n ( 2 ) as i16
393
419
}
394
420
421
+ fn read_le_f64 ( & self ) -> f64 {
422
+ unsafe {
423
+ cast:: transmute :: < u64 , f64 > ( self . read_le_u64 ( ) )
424
+ }
425
+ }
426
+
427
+ fn read_le_f32 ( & self ) -> f32 {
428
+ unsafe {
429
+ cast:: transmute :: < u32 , f32 > ( self . read_le_u32 ( ) )
430
+ }
431
+ }
432
+
395
433
fn read_u8 ( & self ) -> u8 {
396
434
self . read_byte ( ) as u8
397
435
}
@@ -874,6 +912,12 @@ pub trait WriterUtil {
874
912
/// Write a big-endian i16 (2 bytes).
875
913
fn write_be_i16 ( & self , n : i16 ) ;
876
914
915
+ /// Write a big-endian IEEE754 double-precision floating-point (8 bytes).
916
+ fn write_be_f64 ( & self , f : f64 ) ;
917
+
918
+ /// Write a big-endian IEEE754 single-precision floating-point (4 bytes).
919
+ fn write_be_f32 ( & self , f : f32 ) ;
920
+
877
921
/// Write a little-endian u64 (8 bytes).
878
922
fn write_le_u64 ( & self , n : u64 ) ;
879
923
@@ -892,6 +936,14 @@ pub trait WriterUtil {
892
936
/// Write a little-endian i16 (2 bytes).
893
937
fn write_le_i16 ( & self , n : i16 ) ;
894
938
939
+ /// Write a little-endian IEEE754 double-precision floating-point
940
+ /// (8 bytes).
941
+ fn write_le_f64 ( & self , f : f64 ) ;
942
+
943
+ /// Write a litten-endian IEEE754 single-precision floating-point
944
+ /// (4 bytes).
945
+ fn write_le_f32 ( & self , f : f32 ) ;
946
+
895
947
/// Write a u8 (1 byte).
896
948
fn write_u8 ( & self , n : u8 ) ;
897
949
@@ -948,6 +1000,16 @@ impl<T:Writer> WriterUtil for T {
948
1000
fn write_be_i16 ( & self , n : i16 ) {
949
1001
u64_to_be_bytes ( n as u64 , 2 u, |v| self . write ( v) )
950
1002
}
1003
+ fn write_be_f64 ( & self , f : f64 ) {
1004
+ unsafe {
1005
+ self . write_be_u64 ( cast:: transmute ( f) )
1006
+ }
1007
+ }
1008
+ fn write_be_f32 ( & self , f : f32 ) {
1009
+ unsafe {
1010
+ self . write_be_u32 ( cast:: transmute ( f) )
1011
+ }
1012
+ }
951
1013
fn write_le_u64 ( & self , n : u64 ) {
952
1014
u64_to_le_bytes ( n, 8 u, |v| self . write ( v) )
953
1015
}
@@ -966,9 +1028,20 @@ impl<T:Writer> WriterUtil for T {
966
1028
fn write_le_i16 ( & self , n : i16 ) {
967
1029
u64_to_le_bytes ( n as u64 , 2 u, |v| self . write ( v) )
968
1030
}
1031
+ fn write_le_f64 ( & self , f : f64 ) {
1032
+ unsafe {
1033
+ self . write_le_u64 ( cast:: transmute ( f) )
1034
+ }
1035
+ }
1036
+ fn write_le_f32 ( & self , f : f32 ) {
1037
+ unsafe {
1038
+ self . write_le_u32 ( cast:: transmute ( f) )
1039
+ }
1040
+ }
969
1041
970
1042
fn write_u8 ( & self , n : u8 ) { self . write ( [ n] ) }
971
1043
fn write_i8 ( & self , n : i8 ) { self . write ( [ n as u8 ] ) }
1044
+
972
1045
}
973
1046
974
1047
#[ allow( non_implicitly_copyable_typarams) ]
@@ -1421,6 +1494,41 @@ mod tests {
1421
1494
}
1422
1495
}
1423
1496
1497
+ #[ test]
1498
+ fn test_read_f32 ( ) {
1499
+ let path = Path ( "tmp/lib-io-test-read-f32.tmp" ) ;
1500
+ //big-endian floating-point 8.1250
1501
+ let buf = ~[ 0x41 , 0x02 , 0x00 , 0x00 ] ;
1502
+
1503
+ {
1504
+ let file = io:: file_writer ( & path, [ io:: Create ] ) . get ( ) ;
1505
+ file. write ( buf) ;
1506
+ }
1507
+
1508
+ {
1509
+ let file = io:: file_reader ( & path) . get ( ) ;
1510
+ let f = file. read_be_f32 ( ) ;
1511
+ assert f == 8.1250 ;
1512
+ }
1513
+ }
1514
+
1515
+ #[ test]
1516
+ fn test_read_write_f32 ( ) {
1517
+ let path = Path ( "tmp/lib-io-test-read-write-f32.tmp" ) ;
1518
+ let f: f32 = 8.1250 ;
1519
+
1520
+ {
1521
+ let file = io:: file_writer ( & path, [ io:: Create ] ) . get ( ) ;
1522
+ file. write_be_f32 ( f) ;
1523
+ file. write_le_f32 ( f) ;
1524
+ }
1525
+
1526
+ {
1527
+ let file = io:: file_reader ( & path) . get ( ) ;
1528
+ assert file. read_be_f32 ( ) == 8.1250 ;
1529
+ assert file. read_le_f32 ( ) == 8.1250 ;
1530
+ }
1531
+ }
1424
1532
}
1425
1533
1426
1534
//
0 commit comments