add a few blanket future impls to std
This commit is contained in:
parent
1b4c921103
commit
6e5c18e8dc
@ -914,6 +914,45 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<PinBox<U>> for PinBox<T> {}
|
||||
#[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 () {
|
||||
|
@ -80,6 +80,7 @@
|
||||
#![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)]
|
||||
|
@ -15,6 +15,7 @@
|
||||
//! Asynchronous values.
|
||||
|
||||
use mem::PinMut;
|
||||
use marker::Unpin;
|
||||
use task::{self, Poll};
|
||||
|
||||
/// A future represents an asychronous computation.
|
||||
@ -91,3 +92,19 @@ pub trait Future {
|
||||
/// 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)
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,12 @@ pub enum Poll<T> {
|
||||
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.
|
||||
///
|
||||
|
@ -239,6 +239,7 @@
|
||||
#![feature(allow_internal_unsafe)]
|
||||
#![feature(allow_internal_unstable)]
|
||||
#![feature(align_offset)]
|
||||
#![feature(arbitrary_self_types)]
|
||||
#![feature(array_error_internals)]
|
||||
#![feature(ascii_ctype)]
|
||||
#![feature(asm)]
|
||||
|
@ -15,11 +15,14 @@
|
||||
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")]
|
||||
@ -315,6 +318,21 @@ impl<T: fmt::Debug> fmt::Debug for AssertUnwindSafe<T> {
|
||||
}
|
||||
}
|
||||
|
||||
#[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
|
||||
|
Loading…
x
Reference in New Issue
Block a user