//! Futures. use core::ops::DerefMut; use core::pin::Pin; use core::task::{Context, Poll}; pub use core::future::Future; mod future_obj; pub use self::future_obj::{FutureObj, LocalFutureObj, UnsafeFutureObj}; #[cfg(feature = "alloc")] /// An owned dynamically typed [`Future`] for use in cases where you can't /// statically type your result or need to add some indirection. pub type BoxFuture<'a, T> = Pin + Send + 'a>>; #[cfg(feature = "alloc")] /// `BoxFuture`, but without the `Send` requirement. pub type LocalBoxFuture<'a, T> = Pin + 'a>>; /// A `Future` or `TryFuture` which tracks whether or not the underlying future /// should no longer be polled. /// /// `is_terminated` will return `true` if a future should no longer be polled. /// Usually, this state occurs after `poll` (or `try_poll`) returned /// `Poll::Ready`. However, `is_terminated` may also return `true` if a future /// has become inactive and can no longer make progress and should be ignored /// or dropped rather than being `poll`ed again. pub trait FusedFuture { /// Returns `true` if the underlying future should no longer be polled. fn is_terminated(&self) -> bool; } impl FusedFuture for &mut F { fn is_terminated(&self) -> bool { ::is_terminated(&**self) } } impl

FusedFuture for Pin

where P: DerefMut + Unpin, P::Target: FusedFuture, { fn is_terminated(&self) -> bool { ::is_terminated(&**self) } } /// A convenience for futures that return `Result` values that includes /// a variety of adapters tailored to such futures. pub trait TryFuture { /// The type of successful values yielded by this future type Ok; /// The type of failures yielded by this future type Error; /// Poll this `TryFuture` as if it were a `Future`. /// /// This method is a stopgap for a compiler limitation that prevents us from /// directly inheriting from the `Future` trait; in the future it won't be /// needed. fn try_poll( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll>; } impl TryFuture for F where F: ?Sized + Future> { type Ok = T; type Error = E; #[inline] fn try_poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { self.poll(cx) } } #[cfg(feature = "alloc")] mod if_alloc { use alloc::boxed::Box; use super::*; impl FusedFuture for Box { fn is_terminated(&self) -> bool { ::is_terminated(&**self) } } #[cfg(feature = "std")] impl FusedFuture for std::panic::AssertUnwindSafe { fn is_terminated(&self) -> bool { ::is_terminated(&**self) } } }