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