Skip to content

Commit 3b91b55

Browse files
committed
Emulate Try for stable rustc
1 parent 036993a commit 3b91b55

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

src/iter/mod.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ pub use either::Either;
7171
use std::cmp::{self, Ordering};
7272
use std::iter::{Sum, Product};
7373
use std::ops::Fn;
74-
use std::ops::Try;
7574
use self::plumbing::*;
75+
use self::private::Try;
7676

7777
// There is a method to the madness here:
7878
//
@@ -2142,3 +2142,42 @@ pub trait ParallelExtend<T>
21422142
/// ```
21432143
fn par_extend<I>(&mut self, par_iter: I) where I: IntoParallelIterator<Item = T>;
21442144
}
2145+
2146+
/// We hide the `Try` trait in a private module, as it's only meant to be a
2147+
/// stable clone of the standard library's `Try` trait, as yet unstable.
2148+
mod private {
2149+
/// Clone of `std::ops::Try`.
2150+
///
2151+
/// Implementing this trait is not permitted outside of `rayon`.
2152+
pub trait Try {
2153+
private_decl!{}
2154+
2155+
type Ok;
2156+
type Error;
2157+
fn into_result(self) -> Result<Self::Ok, Self::Error>;
2158+
fn from_ok(v: Self::Ok) -> Self;
2159+
fn from_error(v: Self::Error) -> Self;
2160+
}
2161+
2162+
impl<T> Try for Option<T> {
2163+
private_impl!{}
2164+
2165+
type Ok = T;
2166+
type Error = ();
2167+
2168+
fn into_result(self) -> Result<T, ()> { self.ok_or(()) }
2169+
fn from_ok(v: T) -> Self { Some(v) }
2170+
fn from_error(_: ()) -> Self { None }
2171+
}
2172+
2173+
impl<T, E> Try for Result<T, E> {
2174+
private_impl!{}
2175+
2176+
type Ok = T;
2177+
type Error = E;
2178+
2179+
fn into_result(self) -> Result<T, E> { self }
2180+
fn from_ok(v: T) -> Self { Ok(v) }
2181+
fn from_error(v: E) -> Self { Err(v) }
2182+
}
2183+
}

src/iter/try_fold.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::*;
44
use std::sync::atomic::{AtomicBool, Ordering};
55
use std::fmt::{self, Debug};
66
use std::marker::PhantomData;
7-
use std::ops::Try;
7+
use super::private::Try;
88

99
pub fn try_fold<U, I, ID, F>(base: I, identity: ID, fold_op: F) -> TryFold<I, U, ID, F>
1010
where I: ParallelIterator,
@@ -148,7 +148,7 @@ impl<'r, C, U, F, T> Folder<T> for TryFoldFolder<'r, C, U, F>
148148
let fold_op = self.fold_op;
149149
let result = self.result.and_then(|mut acc| {
150150
for item in iter {
151-
acc = fold_op(acc, item)?;
151+
acc = fold_op(acc, item).into_result()?;
152152
}
153153
Ok(acc)
154154
});

src/iter/try_reduce.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::ParallelIterator;
22
use super::plumbing::*;
33

4-
use std::ops::Try;
4+
use super::private::Try;
55
use std::sync::atomic::{AtomicBool, Ordering};
66

77
pub fn try_reduce<PI, R, ID, T>(pi: PI, identity: ID, reduce_op: R) -> T
@@ -78,7 +78,10 @@ impl<'r, R, ID, T> Reducer<T> for TryReduceConsumer<'r, R, ID>
7878
T: Try
7979
{
8080
fn reduce(self, left: T, right: T) -> T {
81-
(self.reduce_op)(left?, right?)
81+
match (left.into_result(), right.into_result()) {
82+
(Ok(left), Ok(right)) => (self.reduce_op)(left, right),
83+
(Err(e), _) | (_, Err(e)) => T::from_error(e),
84+
}
8285
}
8386
}
8487

@@ -97,7 +100,7 @@ impl<'r, R, T> Folder<T> for TryReduceFolder<'r, R, T>
97100
fn consume(self, item: T) -> Self {
98101
let reduce_op = self.reduce_op;
99102
let result = self.result.and_then(|left| {
100-
reduce_op(left, item?).into_result()
103+
reduce_op(left, item.into_result()?).into_result()
101104
});
102105
TryReduceFolder {
103106
result: result,
@@ -111,7 +114,7 @@ impl<'r, R, T> Folder<T> for TryReduceFolder<'r, R, T>
111114
let reduce_op = self.reduce_op;
112115
let result = self.result.and_then(|mut left| {
113116
for right in iter {
114-
left = reduce_op(left, right?)?;
117+
left = reduce_op(left, right.into_result()?).into_result()?;
115118
}
116119
Ok(left)
117120
});

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#![doc(html_root_url = "https://docs.rs/rayon/1.0")]
22
#![deny(missing_debug_implementations)]
33
#![deny(missing_docs)]
4-
#![feature(try_trait)]
54

65
//! Data-parallelism library that makes it easy to convert sequential
76
//! computations into parallel

0 commit comments

Comments
 (0)