#[unstable(feature = "pin", issue = "49150")]
impl<T: ?Sized> Unpin for PinBox<T> {}
+#[unstable(feature = "futures_api", issue = "50547")]
+impl<'a, F: ?Sized + Future + Unpin> Future for Box<F> {
+ type Output = F::Output;
+
+ fn poll(mut self: PinMut<Self>, cx: &mut Context) -> Poll<Self::Output> {
+ PinMut::new(&mut **self).poll(cx)
+ }
+}
+
+#[unstable(feature = "futures_api", issue = "50547")]
+impl<'a, F: ?Sized + Future> Future for PinBox<F> {
+ type Output = F::Output;
+
+ fn poll(mut self: PinMut<Self>, cx: &mut Context) -> Poll<Self::Output> {
+ self.as_pin_mut().poll(cx)
+ }
+}
+
+#[unstable(feature = "futures_api", issue = "50547")]
+unsafe impl<F: Future<Output = ()> + Send + 'static> UnsafePoll for Box<F> {
+ fn into_raw(self) -> *mut () {
+ unsafe {
+ mem::transmute(self)
+ }
+ }
+
+ unsafe fn poll(task: *mut (), cx: &mut Context) -> Poll<()> {
+ let ptr: *mut F = mem::transmute(task);
+ let pin: PinMut<F> = PinMut::new_unchecked(&mut *ptr);
+ pin.poll(cx)
+ }
+
+ unsafe fn drop(task: *mut ()) {
+ let ptr: *mut F = mem::transmute(task);
+ let boxed = Box::from_raw(ptr);
+ drop(boxed)
+ }
+}
+
#[unstable(feature = "futures_api", issue = "50547")]
unsafe impl<F: Future<Output = ()> + Send + 'static> UnsafePoll for PinBox<F> {
fn into_raw(self) -> *mut () {
#![cfg_attr(test, feature(rand, test))]
#![feature(allocator_api)]
#![feature(allow_internal_unstable)]
+#![feature(arbitrary_self_types)]
#![feature(ascii_ctype)]
#![feature(box_into_raw_non_null)]
#![feature(box_patterns)]
//! Asynchronous values.
use mem::PinMut;
+use marker::Unpin;
use task::{self, Poll};
/// A future represents an asychronous computation.
/// about the behavior of `poll` after a future has completed.
fn poll(self: PinMut<Self>, cx: &mut task::Context) -> Poll<Self::Output>;
}
+
+impl<'a, F: ?Sized + Future + Unpin> Future for &'a mut F {
+ type Output = F::Output;
+
+ fn poll(mut self: PinMut<Self>, cx: &mut task::Context) -> Poll<Self::Output> {
+ F::poll(PinMut::new(&mut **self), cx)
+ }
+}
+
+impl<'a, F: ?Sized + Future> Future for PinMut<'a, F> {
+ type Output = F::Output;
+
+ fn poll(mut self: PinMut<Self>, cx: &mut task::Context) -> Poll<Self::Output> {
+ F::poll((*self).reborrow(), cx)
+ }
+}
Pending,
}
+impl<T> From<T> for Poll<T> {
+ fn from(t: T) -> Poll<T> {
+ Poll::Ready(t)
+ }
+}
+
/// A `Waker` is a handle for waking up a task by notifying its executor that it
/// is ready to be run.
///
#![feature(allow_internal_unsafe)]
#![feature(allow_internal_unstable)]
#![feature(align_offset)]
+#![feature(arbitrary_self_types)]
#![feature(array_error_internals)]
#![feature(ascii_ctype)]
#![feature(asm)]
use any::Any;
use cell::UnsafeCell;
use fmt;
+use future::Future;
+use mem::PinMut;
use ops::{Deref, DerefMut};
use panicking;
use ptr::{Unique, NonNull};
use rc::Rc;
use sync::{Arc, Mutex, RwLock, atomic};
+use task::{self, Poll};
use thread::Result;
#[stable(feature = "panic_hooks", since = "1.10.0")]
}
}
+#[unstable(feature = "futures_api", issue = "50547")]
+impl<'a, F: Future> Future for AssertUnwindSafe<F> {
+ type Output = F::Output;
+
+ fn poll(mut self: PinMut<Self>, cx: &mut task::Context) -> Poll<Self::Output> {
+ unsafe {
+ let pinned_field = PinMut::new_unchecked(
+ &mut PinMut::get_mut(self.reborrow()).0
+ );
+
+ pinned_field.poll(cx)
+ }
+ }
+}
+
/// Invokes a closure, capturing the cause of an unwinding panic if one occurs.
///
/// This function will return `Ok` with the closure's result if the closure