diff options
| author | Jonas Schievink <jonasschievink@gmail.com> | 2020-01-25 20:03:10 +0100 |
|---|---|---|
| committer | Jonas Schievink <jonasschievink@gmail.com> | 2020-02-02 13:20:57 +0100 |
| commit | 044fe0f558aa62926e6de9a76b95e4a74c0b1f99 (patch) | |
| tree | 2c984dfd11ebb90b9881c8e4f9bc82663735f775 /src/libcore/ops | |
| parent | 0cbcb17d3306d6e22eafc2c05ce885db97d0189c (diff) | |
Add a resume type parameter to `Generator`
Diffstat (limited to 'src/libcore/ops')
| -rw-r--r-- | src/libcore/ops/generator.rs | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/libcore/ops/generator.rs b/src/libcore/ops/generator.rs index 5401fff860e..4e43561996c 100644 --- a/src/libcore/ops/generator.rs +++ b/src/libcore/ops/generator.rs @@ -50,11 +50,11 @@ pub enum GeneratorState<Y, R> { /// return "foo" /// }; /// -/// match Pin::new(&mut generator).resume() { +/// match Pin::new(&mut generator).resume(()) { /// GeneratorState::Yielded(1) => {} /// _ => panic!("unexpected return from resume"), /// } -/// match Pin::new(&mut generator).resume() { +/// match Pin::new(&mut generator).resume(()) { /// GeneratorState::Complete("foo") => {} /// _ => panic!("unexpected return from resume"), /// } @@ -67,7 +67,7 @@ pub enum GeneratorState<Y, R> { #[lang = "generator"] #[unstable(feature = "generator_trait", issue = "43122")] #[fundamental] -pub trait Generator { +pub trait Generator<#[cfg(not(bootstrap))] R = ()> { /// The type of value this generator yields. /// /// This associated type corresponds to the `yield` expression and the @@ -110,9 +110,13 @@ pub trait Generator { /// been returned previously. While generator literals in the language are /// guaranteed to panic on resuming after `Complete`, this is not guaranteed /// for all implementations of the `Generator` trait. - fn resume(self: Pin<&mut Self>) -> GeneratorState<Self::Yield, Self::Return>; + fn resume( + self: Pin<&mut Self>, + #[cfg(not(bootstrap))] arg: R, + ) -> GeneratorState<Self::Yield, Self::Return>; } +#[cfg(bootstrap)] #[unstable(feature = "generator_trait", issue = "43122")] impl<G: ?Sized + Generator> Generator for Pin<&mut G> { type Yield = G::Yield; @@ -123,6 +127,7 @@ impl<G: ?Sized + Generator> Generator for Pin<&mut G> { } } +#[cfg(bootstrap)] #[unstable(feature = "generator_trait", issue = "43122")] impl<G: ?Sized + Generator + Unpin> Generator for &mut G { type Yield = G::Yield; @@ -132,3 +137,25 @@ impl<G: ?Sized + Generator + Unpin> Generator for &mut G { G::resume(Pin::new(&mut *self)) } } + +#[cfg(not(bootstrap))] +#[unstable(feature = "generator_trait", issue = "43122")] +impl<G: ?Sized + Generator<R>, R> Generator<R> for Pin<&mut G> { + type Yield = G::Yield; + type Return = G::Return; + + fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState<Self::Yield, Self::Return> { + G::resume((*self).as_mut(), arg) + } +} + +#[cfg(not(bootstrap))] +#[unstable(feature = "generator_trait", issue = "43122")] +impl<G: ?Sized + Generator<R> + Unpin, R> Generator<R> for &mut G { + type Yield = G::Yield; + type Return = G::Return; + + fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState<Self::Yield, Self::Return> { + G::resume(Pin::new(&mut *self), arg) + } +} |
