add a few blanket future impls to std
This commit is contained in:
parent
1b4c921103
commit
6e5c18e8dc
6 changed files with 82 additions and 0 deletions
|
@ -914,6 +914,45 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<PinBox<U>> for PinBox<T> {}
|
||||||
#[unstable(feature = "pin", issue = "49150")]
|
#[unstable(feature = "pin", issue = "49150")]
|
||||||
impl<T: ?Sized> Unpin for PinBox<T> {}
|
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")]
|
#[unstable(feature = "futures_api", issue = "50547")]
|
||||||
unsafe impl<F: Future<Output = ()> + Send + 'static> UnsafePoll for PinBox<F> {
|
unsafe impl<F: Future<Output = ()> + Send + 'static> UnsafePoll for PinBox<F> {
|
||||||
fn into_raw(self) -> *mut () {
|
fn into_raw(self) -> *mut () {
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
#![cfg_attr(test, feature(rand, test))]
|
#![cfg_attr(test, feature(rand, test))]
|
||||||
#![feature(allocator_api)]
|
#![feature(allocator_api)]
|
||||||
#![feature(allow_internal_unstable)]
|
#![feature(allow_internal_unstable)]
|
||||||
|
#![feature(arbitrary_self_types)]
|
||||||
#![feature(ascii_ctype)]
|
#![feature(ascii_ctype)]
|
||||||
#![feature(box_into_raw_non_null)]
|
#![feature(box_into_raw_non_null)]
|
||||||
#![feature(box_patterns)]
|
#![feature(box_patterns)]
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
//! Asynchronous values.
|
//! Asynchronous values.
|
||||||
|
|
||||||
use mem::PinMut;
|
use mem::PinMut;
|
||||||
|
use marker::Unpin;
|
||||||
use task::{self, Poll};
|
use task::{self, Poll};
|
||||||
|
|
||||||
/// A future represents an asychronous computation.
|
/// A future represents an asychronous computation.
|
||||||
|
@ -91,3 +92,19 @@ pub trait Future {
|
||||||
/// about the behavior of `poll` after a future has completed.
|
/// about the behavior of `poll` after a future has completed.
|
||||||
fn poll(self: PinMut<Self>, cx: &mut task::Context) -> Poll<Self::Output>;
|
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,
|
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
|
/// A `Waker` is a handle for waking up a task by notifying its executor that it
|
||||||
/// is ready to be run.
|
/// is ready to be run.
|
||||||
///
|
///
|
||||||
|
|
|
@ -239,6 +239,7 @@
|
||||||
#![feature(allow_internal_unsafe)]
|
#![feature(allow_internal_unsafe)]
|
||||||
#![feature(allow_internal_unstable)]
|
#![feature(allow_internal_unstable)]
|
||||||
#![feature(align_offset)]
|
#![feature(align_offset)]
|
||||||
|
#![feature(arbitrary_self_types)]
|
||||||
#![feature(array_error_internals)]
|
#![feature(array_error_internals)]
|
||||||
#![feature(ascii_ctype)]
|
#![feature(ascii_ctype)]
|
||||||
#![feature(asm)]
|
#![feature(asm)]
|
||||||
|
|
|
@ -15,11 +15,14 @@
|
||||||
use any::Any;
|
use any::Any;
|
||||||
use cell::UnsafeCell;
|
use cell::UnsafeCell;
|
||||||
use fmt;
|
use fmt;
|
||||||
|
use future::Future;
|
||||||
|
use mem::PinMut;
|
||||||
use ops::{Deref, DerefMut};
|
use ops::{Deref, DerefMut};
|
||||||
use panicking;
|
use panicking;
|
||||||
use ptr::{Unique, NonNull};
|
use ptr::{Unique, NonNull};
|
||||||
use rc::Rc;
|
use rc::Rc;
|
||||||
use sync::{Arc, Mutex, RwLock, atomic};
|
use sync::{Arc, Mutex, RwLock, atomic};
|
||||||
|
use task::{self, Poll};
|
||||||
use thread::Result;
|
use thread::Result;
|
||||||
|
|
||||||
#[stable(feature = "panic_hooks", since = "1.10.0")]
|
#[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.
|
/// 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
|
/// This function will return `Ok` with the closure's result if the closure
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue