@@ -72,6 +72,7 @@ use collections::hash;
72
72
use core:: fmt;
73
73
use core:: kinds:: { Sized , marker} ;
74
74
use core:: mem;
75
+ use core:: ops:: { FnMut , FnOnce } ;
75
76
use core:: prelude:: { Clone , Drop , Eq , Iterator } ;
76
77
use core:: prelude:: { SlicePrelude , None , Option , Ordering , PartialEq } ;
77
78
use core:: prelude:: { PartialOrd , RawPtr , Some , StrPrelude , range} ;
@@ -319,14 +320,18 @@ pub trait ToCStr for Sized? {
319
320
///
320
321
/// Panics the task if the receiver has an interior null.
321
322
#[ inline]
322
- fn with_c_str < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
323
+ fn with_c_str < T , F > ( & self , f : F ) -> T where
324
+ F : FnOnce ( * const libc:: c_char ) -> T ,
325
+ {
323
326
let c_str = self . to_c_str ( ) ;
324
327
f ( c_str. as_ptr ( ) )
325
328
}
326
329
327
330
/// Unsafe variant of `with_c_str()` that doesn't check for nulls.
328
331
#[ inline]
329
- unsafe fn with_c_str_unchecked < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
332
+ unsafe fn with_c_str_unchecked < T , F > ( & self , f : F ) -> T where
333
+ F : FnOnce ( * const libc:: c_char ) -> T ,
334
+ {
330
335
let c_str = self . to_c_str_unchecked ( ) ;
331
336
f ( c_str. as_ptr ( ) )
332
337
}
@@ -344,12 +349,16 @@ impl ToCStr for str {
344
349
}
345
350
346
351
#[ inline]
347
- fn with_c_str < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
352
+ fn with_c_str < T , F > ( & self , f : F ) -> T where
353
+ F : FnOnce ( * const libc:: c_char ) -> T ,
354
+ {
348
355
self . as_bytes ( ) . with_c_str ( f)
349
356
}
350
357
351
358
#[ inline]
352
- unsafe fn with_c_str_unchecked < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
359
+ unsafe fn with_c_str_unchecked < T , F > ( & self , f : F ) -> T where
360
+ F : FnOnce ( * const libc:: c_char ) -> T ,
361
+ {
353
362
self . as_bytes ( ) . with_c_str_unchecked ( f)
354
363
}
355
364
}
@@ -366,12 +375,16 @@ impl ToCStr for String {
366
375
}
367
376
368
377
#[ inline]
369
- fn with_c_str < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
378
+ fn with_c_str < T , F > ( & self , f : F ) -> T where
379
+ F : FnOnce ( * const libc:: c_char ) -> T ,
380
+ {
370
381
self . as_bytes ( ) . with_c_str ( f)
371
382
}
372
383
373
384
#[ inline]
374
- unsafe fn with_c_str_unchecked < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
385
+ unsafe fn with_c_str_unchecked < T , F > ( & self , f : F ) -> T where
386
+ F : FnOnce ( * const libc:: c_char ) -> T ,
387
+ {
375
388
self . as_bytes ( ) . with_c_str_unchecked ( f)
376
389
}
377
390
}
@@ -397,11 +410,15 @@ impl ToCStr for [u8] {
397
410
CString :: new ( buf as * const libc:: c_char , true )
398
411
}
399
412
400
- fn with_c_str < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
413
+ fn with_c_str < T , F > ( & self , f : F ) -> T where
414
+ F : FnOnce ( * const libc:: c_char ) -> T ,
415
+ {
401
416
unsafe { with_c_str ( self , true , f) }
402
417
}
403
418
404
- unsafe fn with_c_str_unchecked < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
419
+ unsafe fn with_c_str_unchecked < T , F > ( & self , f : F ) -> T where
420
+ F : FnOnce ( * const libc:: c_char ) -> T ,
421
+ {
405
422
with_c_str ( self , false , f)
406
423
}
407
424
}
@@ -418,19 +435,24 @@ impl<'a, Sized? T: ToCStr> ToCStr for &'a T {
418
435
}
419
436
420
437
#[ inline]
421
- fn with_c_str < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
438
+ fn with_c_str < T , F > ( & self , f : F ) -> T where
439
+ F : FnOnce ( * const libc:: c_char ) -> T ,
440
+ {
422
441
( * * self ) . with_c_str ( f)
423
442
}
424
443
425
444
#[ inline]
426
- unsafe fn with_c_str_unchecked < T > ( & self , f : |* const libc:: c_char | -> T ) -> T {
445
+ unsafe fn with_c_str_unchecked < T , F > ( & self , f : F ) -> T where
446
+ F : FnOnce ( * const libc:: c_char ) -> T ,
447
+ {
427
448
( * * self ) . with_c_str_unchecked ( f)
428
449
}
429
450
}
430
451
431
452
// Unsafe function that handles possibly copying the &[u8] into a stack array.
432
- unsafe fn with_c_str < T > ( v : & [ u8 ] , checked : bool ,
433
- f : |* const libc:: c_char | -> T ) -> T {
453
+ unsafe fn with_c_str < T , F > ( v : & [ u8 ] , checked : bool , f : F ) -> T where
454
+ F : FnOnce ( * const libc:: c_char ) -> T ,
455
+ {
434
456
let c_str = if v. len ( ) < BUF_LEN {
435
457
let mut buf: [ u8 , .. BUF_LEN ] = mem:: uninitialized ( ) ;
436
458
slice:: bytes:: copy_memory ( & mut buf, v) ;
@@ -489,9 +511,12 @@ impl<'a> Iterator<libc::c_char> for CChars<'a> {
489
511
///
490
512
/// The specified closure is invoked with each string that
491
513
/// is found, and the number of strings found is returned.
492
- pub unsafe fn from_c_multistring ( buf : * const libc:: c_char ,
493
- count : Option < uint > ,
494
- f: |& CString |) -> uint {
514
+ pub unsafe fn from_c_multistring < F > ( buf : * const libc:: c_char ,
515
+ count : Option < uint > ,
516
+ mut f : F )
517
+ -> uint where
518
+ F : FnMut ( & CString ) ,
519
+ {
495
520
496
521
let mut curr_ptr: uint = buf as uint ;
497
522
let mut ctr = 0 ;
@@ -678,7 +703,7 @@ mod tests {
678
703
679
704
#[ test]
680
705
fn test_clone_noleak ( ) {
681
- fn foo ( f: |c : & CString | ) {
706
+ fn foo < F > ( f : F ) where F : FnOnce ( & CString ) {
682
707
let s = "test" . to_string ( ) ;
683
708
let c = s. to_c_str ( ) ;
684
709
// give the closure a non-owned CString
0 commit comments