230
230
231
231
#![ stable]
232
232
233
- use self :: Result :: * ;
233
+ use self :: Result :: { Ok , Err } ;
234
234
235
- use std:: fmt:: Show ;
236
- use slice;
237
- use slice:: AsSlice ;
235
+ use clone:: Clone ;
236
+ use fmt:: Show ;
238
237
use iter:: { Iterator , IteratorExt , DoubleEndedIterator , FromIterator , ExactSizeIterator } ;
239
- use option:: Option ;
240
- use option:: Option :: { None , Some } ;
241
238
use ops:: { FnMut , FnOnce } ;
239
+ use option:: Option :: { mod, None , Some } ;
240
+ use slice:: AsSlice ;
241
+ use slice;
242
242
243
243
/// `Result` is a type that represents either success (`Ok`) or failure (`Err`).
244
244
///
@@ -248,16 +248,19 @@ use ops::{FnMut, FnOnce};
248
248
#[ stable]
249
249
pub enum Result < T , E > {
250
250
/// Contains the success value
251
+ #[ stable]
251
252
Ok ( T ) ,
252
253
253
254
/// Contains the error value
255
+ #[ stable]
254
256
Err ( E )
255
257
}
256
258
257
259
/////////////////////////////////////////////////////////////////////////////
258
260
// Type implementation
259
261
/////////////////////////////////////////////////////////////////////////////
260
262
263
+ #[ stable]
261
264
impl < T , E > Result < T , E > {
262
265
/////////////////////////////////////////////////////////////////////////
263
266
// Querying the contained values
@@ -300,7 +303,6 @@ impl<T, E> Result<T, E> {
300
303
!self . is_ok ( )
301
304
}
302
305
303
-
304
306
/////////////////////////////////////////////////////////////////////////
305
307
// Adapter for each variant
306
308
/////////////////////////////////////////////////////////////////////////
@@ -369,7 +371,7 @@ impl<T, E> Result<T, E> {
369
371
/// ```
370
372
#[ inline]
371
373
#[ stable]
372
- pub fn as_ref < ' r > ( & ' r self ) -> Result < & ' r T , & ' r E > {
374
+ pub fn as_ref ( & self ) -> Result < & T , & E > {
373
375
match * self {
374
376
Ok ( ref x) => Ok ( x) ,
375
377
Err ( ref x) => Err ( x) ,
@@ -395,8 +397,8 @@ impl<T, E> Result<T, E> {
395
397
/// assert_eq!(x.unwrap_err(), 0);
396
398
/// ```
397
399
#[ inline]
398
- #[ unstable = "waiting for mut conventions" ]
399
- pub fn as_mut < ' r > ( & ' r mut self ) -> Result < & ' r mut T , & ' r mut E > {
400
+ #[ stable ]
401
+ pub fn as_mut ( & mut self ) -> Result < & mut T , & mut E > {
400
402
match * self {
401
403
Ok ( ref mut x) => Ok ( x) ,
402
404
Err ( ref mut x) => Err ( x) ,
@@ -420,7 +422,7 @@ impl<T, E> Result<T, E> {
420
422
/// ```
421
423
#[ inline]
422
424
#[ unstable = "waiting for mut conventions" ]
423
- pub fn as_mut_slice < ' r > ( & ' r mut self ) -> & ' r mut [ T ] {
425
+ pub fn as_mut_slice ( & mut self ) -> & mut [ T ] {
424
426
match * self {
425
427
Ok ( ref mut x) => slice:: mut_ref_slice ( x) ,
426
428
Err ( _) => {
@@ -465,11 +467,11 @@ impl<T, E> Result<T, E> {
465
467
/// assert!(sum == 10);
466
468
/// ```
467
469
#[ inline]
468
- #[ unstable = "waiting for unboxed closures" ]
470
+ #[ stable ]
469
471
pub fn map < U , F : FnOnce ( T ) -> U > ( self , op : F ) -> Result < U , E > {
470
472
match self {
471
- Ok ( t) => Ok ( op ( t) ) ,
472
- Err ( e) => Err ( e)
473
+ Ok ( t) => Ok ( op ( t) ) ,
474
+ Err ( e) => Err ( e)
473
475
}
474
476
}
475
477
@@ -491,15 +493,14 @@ impl<T, E> Result<T, E> {
491
493
/// assert_eq!(x.map_err(stringify), Err("error code: 13".to_string()));
492
494
/// ```
493
495
#[ inline]
494
- #[ unstable = "waiting for unboxed closures" ]
496
+ #[ stable ]
495
497
pub fn map_err < F , O : FnOnce ( E ) -> F > ( self , op : O ) -> Result < T , F > {
496
498
match self {
497
- Ok ( t) => Ok ( t) ,
498
- Err ( e) => Err ( op ( e) )
499
+ Ok ( t) => Ok ( t) ,
500
+ Err ( e) => Err ( op ( e) )
499
501
}
500
502
}
501
503
502
-
503
504
/////////////////////////////////////////////////////////////////////////
504
505
// Iterator constructors
505
506
/////////////////////////////////////////////////////////////////////////
@@ -516,9 +517,9 @@ impl<T, E> Result<T, E> {
516
517
/// assert_eq!(x.iter().next(), None);
517
518
/// ```
518
519
#[ inline]
519
- #[ unstable = "waiting for iterator conventions" ]
520
- pub fn iter < ' r > ( & ' r self ) -> Item < & ' r T > {
521
- Item { opt : self . as_ref ( ) . ok ( ) }
520
+ #[ stable ]
521
+ pub fn iter ( & self ) -> Iter < T > {
522
+ Iter { inner : self . as_ref ( ) . ok ( ) }
522
523
}
523
524
524
525
/// Returns a mutable iterator over the possibly contained value.
@@ -537,9 +538,9 @@ impl<T, E> Result<T, E> {
537
538
/// assert_eq!(x.iter_mut().next(), None);
538
539
/// ```
539
540
#[ inline]
540
- #[ unstable = "waiting for iterator conventions" ]
541
- pub fn iter_mut < ' r > ( & ' r mut self ) -> Item < & ' r mut T > {
542
- Item { opt : self . as_mut ( ) . ok ( ) }
541
+ #[ stable ]
542
+ pub fn iter_mut ( & mut self ) -> IterMut < T > {
543
+ IterMut { inner : self . as_mut ( ) . ok ( ) }
543
544
}
544
545
545
546
/// Returns a consuming iterator over the possibly contained value.
@@ -556,9 +557,9 @@ impl<T, E> Result<T, E> {
556
557
/// assert_eq!(v, vec![]);
557
558
/// ```
558
559
#[ inline]
559
- #[ unstable = "waiting for iterator conventions" ]
560
- pub fn into_iter ( self ) -> Item < T > {
561
- Item { opt : self . ok ( ) }
560
+ #[ stable ]
561
+ pub fn into_iter ( self ) -> IntoIter < T > {
562
+ IntoIter { inner : self . ok ( ) }
562
563
}
563
564
564
565
////////////////////////////////////////////////////////////////////////
@@ -611,7 +612,7 @@ impl<T, E> Result<T, E> {
611
612
/// assert_eq!(Err(3).and_then(sq).and_then(sq), Err(3));
612
613
/// ```
613
614
#[ inline]
614
- #[ unstable = "waiting for unboxed closures" ]
615
+ #[ stable ]
615
616
pub fn and_then < U , F : FnOnce ( T ) -> Result < U , E > > ( self , op : F ) -> Result < U , E > {
616
617
match self {
617
618
Ok ( t) => op ( t) ,
@@ -665,7 +666,7 @@ impl<T, E> Result<T, E> {
665
666
/// assert_eq!(Err(3).or_else(err).or_else(err), Err(3));
666
667
/// ```
667
668
#[ inline]
668
- #[ unstable = "waiting for unboxed closures" ]
669
+ #[ stable ]
669
670
pub fn or_else < F , O : FnOnce ( E ) -> Result < T , F > > ( self , op : O ) -> Result < T , F > {
670
671
match self {
671
672
Ok ( t) => Ok ( t) ,
@@ -687,7 +688,7 @@ impl<T, E> Result<T, E> {
687
688
/// assert_eq!(x.unwrap_or(optb), optb);
688
689
/// ```
689
690
#[ inline]
690
- #[ unstable = "waiting for conventions" ]
691
+ #[ stable ]
691
692
pub fn unwrap_or ( self , optb : T ) -> T {
692
693
match self {
693
694
Ok ( t) => t,
@@ -707,7 +708,7 @@ impl<T, E> Result<T, E> {
707
708
/// assert_eq!(Err("foo").unwrap_or_else(count), 3u);
708
709
/// ```
709
710
#[ inline]
710
- #[ unstable = "waiting for conventions" ]
711
+ #[ stable ]
711
712
pub fn unwrap_or_else < F : FnOnce ( E ) -> T > ( self , op : F ) -> T {
712
713
match self {
713
714
Ok ( t) => t,
@@ -716,6 +717,7 @@ impl<T, E> Result<T, E> {
716
717
}
717
718
}
718
719
720
+ #[ stable]
719
721
impl < T , E : Show > Result < T , E > {
720
722
/// Unwraps a result, yielding the content of an `Ok`.
721
723
///
@@ -736,7 +738,7 @@ impl<T, E: Show> Result<T, E> {
736
738
/// x.unwrap(); // panics with `emergency failure`
737
739
/// ```
738
740
#[ inline]
739
- #[ unstable = "waiting for conventions" ]
741
+ #[ stable ]
740
742
pub fn unwrap ( self ) -> T {
741
743
match self {
742
744
Ok ( t) => t,
@@ -746,6 +748,7 @@ impl<T, E: Show> Result<T, E> {
746
748
}
747
749
}
748
750
751
+ #[ stable]
749
752
impl < T : Show , E > Result < T , E > {
750
753
/// Unwraps a result, yielding the content of an `Err`.
751
754
///
@@ -766,7 +769,7 @@ impl<T: Show, E> Result<T, E> {
766
769
/// assert_eq!(x.unwrap_err(), "emergency failure");
767
770
/// ```
768
771
#[ inline]
769
- #[ unstable = "waiting for conventions" ]
772
+ #[ stable ]
770
773
pub fn unwrap_err ( self ) -> E {
771
774
match self {
772
775
Ok ( t) =>
@@ -797,42 +800,75 @@ impl<T, E> AsSlice<T> for Result<T, E> {
797
800
}
798
801
799
802
/////////////////////////////////////////////////////////////////////////////
800
- // The Result Iterator
803
+ // The Result Iterators
801
804
/////////////////////////////////////////////////////////////////////////////
802
805
803
- /// A `Result` iterator that yields either one or zero elements
804
- ///
805
- /// The `Item` iterator is returned by the `iter`, `iter_mut` and `into_iter`
806
- /// methods on `Result`.
807
- #[ deriving( Clone ) ]
808
- #[ unstable = "waiting for iterator conventions" ]
809
- pub struct Item < T > {
810
- opt : Option < T >
811
- }
806
+ /// An iterator over a reference to the `Ok` variant of a `Result`.
807
+ #[ stable]
808
+ pub struct Iter < ' a , T : ' a > { inner : Option < & ' a T > }
812
809
813
- impl < T > Iterator < T > for Item < T > {
810
+ impl < ' a , T > Iterator < & ' a T > for Iter < ' a , T > {
814
811
#[ inline]
815
- fn next ( & mut self ) -> Option < T > {
816
- self . opt . take ( )
812
+ fn next ( & mut self ) -> Option < & ' a T > { self . inner . take ( ) }
813
+ #[ inline]
814
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
815
+ let n = if self . inner . is_some ( ) { 1 } else { 0 } ;
816
+ ( n, Some ( n) )
817
817
}
818
+ }
819
+
820
+ impl < ' a , T > DoubleEndedIterator < & ' a T > for Iter < ' a , T > {
821
+ #[ inline]
822
+ fn next_back ( & mut self ) -> Option < & ' a T > { self . inner . take ( ) }
823
+ }
824
+
825
+ impl < ' a , T > ExactSizeIterator < & ' a T > for Iter < ' a , T > { }
826
+
827
+ impl < ' a , T > Clone for Iter < ' a , T > {
828
+ fn clone ( & self ) -> Iter < ' a , T > { Iter { inner : self . inner } }
829
+ }
830
+
831
+ /// An iterator over a mutable reference to the `Ok` variant of a `Result`.
832
+ #[ stable]
833
+ pub struct IterMut < ' a , T : ' a > { inner : Option < & ' a mut T > }
818
834
835
+ impl < ' a , T > Iterator < & ' a mut T > for IterMut < ' a , T > {
836
+ #[ inline]
837
+ fn next ( & mut self ) -> Option < & ' a mut T > { self . inner . take ( ) }
819
838
#[ inline]
820
839
fn size_hint ( & self ) -> ( uint , Option < uint > ) {
821
- match self . opt {
822
- Some ( _) => ( 1 , Some ( 1 ) ) ,
823
- None => ( 0 , Some ( 0 ) ) ,
824
- }
840
+ let n = if self . inner . is_some ( ) { 1 } else { 0 } ;
841
+ ( n, Some ( n) )
825
842
}
826
843
}
827
844
828
- impl < A > DoubleEndedIterator < A > for Item < A > {
845
+ impl < ' a , T > DoubleEndedIterator < & ' a mut T > for IterMut < ' a , T > {
829
846
#[ inline]
830
- fn next_back ( & mut self ) -> Option < A > {
831
- self . opt . take ( )
847
+ fn next_back ( & mut self ) -> Option < & ' a mut T > { self . inner . take ( ) }
848
+ }
849
+
850
+ impl < ' a , T > ExactSizeIterator < & ' a mut T > for IterMut < ' a , T > { }
851
+
852
+ /// An iterator over the value in a `Ok` variant of a `Result`.
853
+ #[ stable]
854
+ pub struct IntoIter < T > { inner : Option < T > }
855
+
856
+ impl < T > Iterator < T > for IntoIter < T > {
857
+ #[ inline]
858
+ fn next ( & mut self ) -> Option < T > { self . inner . take ( ) }
859
+ #[ inline]
860
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
861
+ let n = if self . inner . is_some ( ) { 1 } else { 0 } ;
862
+ ( n, Some ( n) )
832
863
}
833
864
}
834
865
835
- impl < A > ExactSizeIterator < A > for Item < A > { }
866
+ impl < T > DoubleEndedIterator < T > for IntoIter < T > {
867
+ #[ inline]
868
+ fn next_back ( & mut self ) -> Option < T > { self . inner . take ( ) }
869
+ }
870
+
871
+ impl < T > ExactSizeIterator < T > for IntoIter < T > { }
836
872
837
873
/////////////////////////////////////////////////////////////////////////////
838
874
// FromIterator
0 commit comments