diff options
| author | David Tolnay <dtolnay@gmail.com> | 2023-09-28 10:18:56 -0700 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2023-09-28 10:22:19 -0700 |
| commit | a95f20c9adb45be65d579251b3f7e4401b8aa3b1 (patch) | |
| tree | d46e54399872c60d4a7c26620edac51e78bd5835 | |
| parent | 925f8441645193c95bd870be0dd9d0b3d03a3020 (diff) | |
| download | rust-a95f20c9adb45be65d579251b3f7e4401b8aa3b1.tar.gz rust-a95f20c9adb45be65d579251b3f7e4401b8aa3b1.zip | |
Add Exclusive forwarding impls (FnOnce, FnMut, Generator)
| -rw-r--r-- | library/core/src/sync/exclusive.rs | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/library/core/src/sync/exclusive.rs b/library/core/src/sync/exclusive.rs index 3f3e19c55d4..ff538d55c60 100644 --- a/library/core/src/sync/exclusive.rs +++ b/library/core/src/sync/exclusive.rs @@ -2,6 +2,8 @@ use core::fmt; use core::future::Future; +use core::marker::Tuple; +use core::ops::{Generator, GeneratorState}; use core::pin::Pin; use core::task::{Context, Poll}; @@ -168,10 +170,52 @@ impl<T> From<T> for Exclusive<T> { } #[unstable(feature = "exclusive_wrapper", issue = "98407")] -impl<T: Future + ?Sized> Future for Exclusive<T> { +impl<F, Args> FnOnce<Args> for Exclusive<F> +where + F: FnOnce<Args>, + Args: Tuple, +{ + type Output = F::Output; + + extern "rust-call" fn call_once(self, args: Args) -> Self::Output { + self.into_inner().call_once(args) + } +} + +#[unstable(feature = "exclusive_wrapper", issue = "98407")] +impl<F, Args> FnMut<Args> for Exclusive<F> +where + F: FnMut<Args>, + Args: Tuple, +{ + extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output { + self.get_mut().call_mut(args) + } +} + +#[unstable(feature = "exclusive_wrapper", issue = "98407")] +impl<T> Future for Exclusive<T> +where + T: Future + ?Sized, +{ type Output = T::Output; + #[inline] fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { self.get_pin_mut().poll(cx) } } + +#[unstable(feature = "generator_trait", issue = "43122")] // also #98407 +impl<R, G> Generator<R> for Exclusive<G> +where + G: Generator<R> + ?Sized, +{ + type Yield = G::Yield; + type Return = G::Return; + + #[inline] + fn resume(self: Pin<&mut Self>, arg: R) -> GeneratorState<Self::Yield, Self::Return> { + G::resume(self.get_pin_mut(), arg) + } +} |
