@@ -297,23 +297,22 @@ enum fileflag { append, create, truncate, no_flag, }
297
297
// FIXME: eventually u64
298
298
// #2004
299
299
iface writer {
300
- fn write( [ const u8] ) ;
300
+ fn write( [ const u8] / & ) ;
301
301
fn seek ( int , seek_style ) ;
302
302
fn tell ( ) -> uint ;
303
303
fn flush ( ) -> int ;
304
304
}
305
305
306
306
impl < T : writer , C > of writer for { base : T , cleanup : C } {
307
- fn write ( bs : [ const u8 ] ) { self . base . write ( bs) ; }
307
+ fn write ( bs : [ const u8 ] / & ) { self . base . write ( bs) ; }
308
308
fn seek ( off : int , style : seek_style ) { self . base . seek ( off, style) ; }
309
309
fn tell ( ) -> uint { self . base . tell ( ) }
310
310
fn flush ( ) -> int { self . base . flush ( ) }
311
311
}
312
312
313
313
impl of writer for * libc:: FILE {
314
- fn write ( v : [ const u8 ] ) unsafe {
315
- let len = vec:: len ( v) ;
316
- vec:: as_buf ( v) { |vbuf|
314
+ fn write ( v : [ const u8 ] /& ) unsafe {
315
+ vec:: unpack_slice ( v) { |vbuf, len|
317
316
let nout = libc:: fwrite ( vbuf as * c_void , len, 1 u, self ) ;
318
317
if nout < 1 as size_t {
319
318
#error ( "error writing buffer" ) ;
@@ -339,10 +338,9 @@ fn FILE_writer(f: *libc::FILE, cleanup: bool) -> writer {
339
338
}
340
339
341
340
impl of writer for fd_t {
342
- fn write ( v : [ const u8 ] ) unsafe {
343
- let len = vec:: len ( v) ;
341
+ fn write ( v : [ const u8 ] /& ) unsafe {
344
342
let mut count = 0 u;
345
- vec:: as_buf ( v) { |vbuf|
343
+ vec:: unpack_slice ( v) { |vbuf, len |
346
344
while count < len {
347
345
let vb = ptr:: offset ( vbuf, count) as * c_void ;
348
346
let nout = libc:: write ( self , vb, len) ;
@@ -408,26 +406,66 @@ fn mk_file_writer(path: str, flags: [fileflag])
408
406
}
409
407
}
410
408
411
- fn u64_to_le_bytes ( n : u64 , size : uint ) -> [ u8 ] {
412
- let mut bytes: [ u8 ] = [ ] , i = size, n = n;
413
- while i > 0 u {
414
- bytes += [ ( n & 255_u64 ) as u8 ] ;
415
- n >>= 8_u64 ;
416
- i -= 1 u;
409
+ fn u64_to_le_bytes < T > ( n : u64 , size : uint , f : fn ( [ u8] /& ) -> T ) -> T {
410
+ assert size <= 8 u;
411
+ alt size {
412
+ 1 u { f( [ n as u8 ] /& ) }
413
+ 2 u { f( [ n as u8 ,
414
+ ( n >> 8 ) as u8 ] /& ) }
415
+ 4 u { f( [ n as u8 ,
416
+ ( n >> 8 ) as u8 ,
417
+ ( n >> 16 ) as u8 ,
418
+ ( n >> 24 ) as u8 ] /& ) }
419
+ 8 u { f( [ n as u8 ,
420
+ ( n >> 8 ) as u8 ,
421
+ ( n >> 16 ) as u8 ,
422
+ ( n >> 24 ) as u8 ,
423
+ ( n >> 32 ) as u8 ,
424
+ ( n >> 40 ) as u8 ,
425
+ ( n >> 48 ) as u8 ,
426
+ ( n >> 56 ) as u8 ] /& ) }
427
+ _ {
428
+
429
+ let mut bytes: [ u8 ] = [ ] , i = size, n = n;
430
+ while i > 0 u {
431
+ bytes += [ ( n & 255_u64 ) as u8 ] ;
432
+ n >>= 8_u64 ;
433
+ i -= 1 u;
434
+ }
435
+ f ( bytes)
436
+ }
417
437
}
418
- ret bytes;
419
438
}
420
439
421
- fn u64_to_be_bytes ( n : u64 , size : uint ) -> [ u8 ] {
440
+ fn u64_to_be_bytes< T > ( n: u64, size: uint, f : fn ( [ u8] / & ) -> T ) -> T {
422
441
assert size <= 8 u;
423
- let mut bytes: [ u8 ] = [ ] ;
424
- let mut i = size;
425
- while i > 0 u {
426
- let shift = ( ( i - 1 u) * 8 u) as u64 ;
427
- bytes += [ ( n >> shift) as u8 ] ;
428
- i -= 1 u;
442
+ alt size {
443
+ 1 u { f( [ n as u8 ] /& ) }
444
+ 2 u { f( [ ( n >> 8 ) as u8 ,
445
+ n as u8 ] /& ) }
446
+ 4 u { f( [ ( n >> 24 ) as u8 ,
447
+ ( n >> 16 ) as u8 ,
448
+ ( n >> 8 ) as u8 ,
449
+ n as u8 ] /& ) }
450
+ 8 u { f( [ ( n >> 56 ) as u8 ,
451
+ ( n >> 48 ) as u8 ,
452
+ ( n >> 40 ) as u8 ,
453
+ ( n >> 32 ) as u8 ,
454
+ ( n >> 24 ) as u8 ,
455
+ ( n >> 16 ) as u8 ,
456
+ ( n >> 8 ) as u8 ,
457
+ n as u8 ] /& ) }
458
+ _ {
459
+ let mut bytes: [ u8 ] = [ ] ;
460
+ let mut i = size;
461
+ while i > 0 u {
462
+ let shift = ( ( i - 1 u) * 8 u) as u64 ;
463
+ bytes += [ ( n >> shift) as u8 ] ;
464
+ i -= 1 u;
465
+ }
466
+ f ( bytes)
467
+ }
429
468
}
430
- ret bytes;
431
469
}
432
470
433
471
fn u64_from_be_bytes( data: [ u8] , start: uint, size: uint) -> u64 {
@@ -448,45 +486,67 @@ impl writer_util for writer {
448
486
if ch as uint < 128 u {
449
487
self . write ( [ ch as u8 ] ) ;
450
488
} else {
451
- self . write ( str:: bytes ( str :: from_char ( ch) ) ) ;
489
+ self . write_str ( str:: from_char ( ch) ) ;
452
490
}
453
491
}
454
- fn write_str ( s : str ) { self . write ( str:: bytes ( s) ) ; }
455
- fn write_line ( s : str ) { self . write ( str:: bytes ( s + "\n " ) ) ; }
456
- fn write_int ( n : int ) { self . write ( str:: bytes ( int:: to_str ( n, 10 u) ) ) ; }
457
- fn write_uint ( n : uint ) { self . write ( str:: bytes ( uint:: to_str ( n, 10 u) ) ) ; }
492
+ fn write_str ( s : str /& ) { str:: byte_slice ( s) { |v| self . write ( v) ; } }
493
+ fn write_line ( s : str /& ) {
494
+ self . write_str ( s) ;
495
+ self . write_str ( "\n " /& ) ;
496
+ }
497
+ fn write_int ( n : int ) { self . write_str ( int:: to_str ( n, 10 u) ) ; }
498
+ fn write_uint ( n : uint ) { self . write_str ( uint:: to_str ( n, 10 u) ) ; }
458
499
459
500
fn write_le_uint ( n : uint , size : uint ) {
460
- self . write ( u64_to_le_bytes ( n as u64 , size) ) ;
501
+ u64_to_le_bytes ( n as u64 , size) { |v| self . write ( v ) ; }
461
502
}
462
503
fn write_le_int ( n : int , size : uint ) {
463
- self . write ( u64_to_le_bytes ( n as u64 , size) ) ;
504
+ u64_to_le_bytes ( n as u64 , size) { |v| self . write ( v ) ; }
464
505
}
465
-
466
506
fn write_be_uint ( n : uint , size : uint ) {
467
- self . write ( u64_to_be_bytes ( n as u64 , size) ) ;
507
+ u64_to_be_bytes ( n as u64 , size) { |v| self . write ( v ) ; }
468
508
}
469
509
fn write_be_int ( n : int , size : uint ) {
470
- self . write ( u64_to_be_bytes ( n as u64 , size) ) ;
510
+ u64_to_be_bytes ( n as u64 , size) { |v| self . write ( v) ; }
511
+ }
512
+ fn write_be_u64 ( n : u64 ) {
513
+ u64_to_be_bytes ( n, 8 u) { |v| self . write ( v) ; }
514
+ }
515
+ fn write_be_u32 ( n : u32 ) {
516
+ u64_to_be_bytes ( n as u64 , 4 u) { |v| self . write ( v) ; }
517
+ }
518
+ fn write_be_u16 ( n : u16 ) {
519
+ u64_to_be_bytes ( n as u64 , 2 u) { |v| self . write ( v) ; }
520
+ }
521
+ fn write_be_i64 ( n : i64 ) {
522
+ u64_to_be_bytes ( n as u64 , 8 u) { |v| self . write ( v) ; }
523
+ }
524
+ fn write_be_i32 ( n : i32 ) {
525
+ u64_to_be_bytes ( n as u64 , 4 u) { |v| self . write ( v) ; }
526
+ }
527
+ fn write_be_i16 ( n : i16 ) {
528
+ u64_to_be_bytes ( n as u64 , 2 u) { |v| self . write ( v) ; }
529
+ }
530
+ fn write_le_u64 ( n : u64 ) {
531
+ u64_to_le_bytes ( n, 8 u) { |v| self . write ( v) ; }
532
+ }
533
+ fn write_le_u32 ( n : u32 ) {
534
+ u64_to_le_bytes ( n as u64 , 4 u) { |v| self . write ( v) ; }
535
+ }
536
+ fn write_le_u16 ( n : u16 ) {
537
+ u64_to_le_bytes ( n as u64 , 2 u) { |v| self . write ( v) ; }
538
+ }
539
+ fn write_le_i64 ( n : i64 ) {
540
+ u64_to_le_bytes ( n as u64 , 8 u) { |v| self . write ( v) ; }
541
+ }
542
+ fn write_le_i32 ( n : i32 ) {
543
+ u64_to_le_bytes ( n as u64 , 4 u) { |v| self . write ( v) ; }
544
+ }
545
+ fn write_le_i16 ( n : i16 ) {
546
+ u64_to_le_bytes ( n as u64 , 2 u) { |v| self . write ( v) ; }
471
547
}
472
548
473
- fn write_be_u64 ( n : u64 ) { self . write ( u64_to_be_bytes ( n, 8 u) ) ; }
474
- fn write_be_u32 ( n : u32 ) { self . write ( u64_to_be_bytes ( n as u64 , 4 u) ) ; }
475
- fn write_be_u16 ( n : u16 ) { self . write ( u64_to_be_bytes ( n as u64 , 2 u) ) ; }
476
-
477
- fn write_be_i64 ( n : i64 ) { self . write ( u64_to_be_bytes ( n as u64 , 8 u) ) ; }
478
- fn write_be_i32 ( n : i32 ) { self . write ( u64_to_be_bytes ( n as u64 , 4 u) ) ; }
479
- fn write_be_i16 ( n : i16 ) { self . write ( u64_to_be_bytes ( n as u64 , 2 u) ) ; }
480
-
481
- fn write_le_u64 ( n : u64 ) { self . write ( u64_to_le_bytes ( n, 8 u) ) ; }
482
- fn write_le_u32 ( n : u32 ) { self . write ( u64_to_le_bytes ( n as u64 , 4 u) ) ; }
483
- fn write_le_u16 ( n : u16 ) { self . write ( u64_to_le_bytes ( n as u64 , 2 u) ) ; }
484
-
485
- fn write_le_i64 ( n : i64 ) { self . write ( u64_to_le_bytes ( n as u64 , 8 u) ) ; }
486
- fn write_le_i32 ( n : i32 ) { self . write ( u64_to_le_bytes ( n as u64 , 4 u) ) ; }
487
- fn write_le_i16 ( n : i16 ) { self . write ( u64_to_le_bytes ( n as u64 , 2 u) ) ; }
488
-
489
- fn write_u8 ( n : u8 ) { self . write ( [ n] ) }
549
+ fn write_u8 ( n : u8 ) { self . write ( [ n] /& ) }
490
550
}
491
551
492
552
fn file_writer ( path : str , flags : [ fileflag ] ) -> result < writer , str > {
@@ -518,7 +578,7 @@ type mem_buffer = @{mut buf: [mut u8],
518
578
mut pos : uint } ;
519
579
520
580
impl of writer for mem_buffer {
521
- fn write ( v : [ const u8 ] ) {
581
+ fn write ( v : [ const u8 ] / & ) {
522
582
// Fast path.
523
583
if self . pos == vec:: len ( self . buf ) {
524
584
for vec:: each( v) { |b| self . buf += [ mut b] ; }
0 commit comments