}
#[unstable(feature = "futures_api", issue = "50547")]
-unsafe impl<'a, T, F: Future<Output = T> + 'a> UnsafeFutureObj<'a, T> for PinBox<F> {
+unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for PinBox<F>
+ where F: Future<Output = T> + 'a
+{
fn into_raw(self) -> *mut () {
PinBox::into_raw(self) as *mut ()
}
use fmt;
use future::Future;
-use marker::PhantomData;
+use marker::{PhantomData, Unpin};
use mem::PinMut;
use task::{Context, Poll};
/// other calls to `drop` or `poll`.
unsafe fn drop(ptr: *mut ());
}
+
+unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for &'a mut F
+ where F: Future<Output = T> + Unpin + 'a
+{
+ fn into_raw(self) -> *mut () {
+ self as *mut F as *mut ()
+ }
+
+ unsafe fn poll(ptr: *mut (), cx: &mut Context) -> Poll<T> {
+ PinMut::new_unchecked(&mut *(ptr as *mut F)).poll(cx)
+ }
+
+ unsafe fn drop(_ptr: *mut ()) {}
+}
impl<'a, T: ?Sized> Unpin for PinMut<'a, T> {}
#[unstable(feature = "futures_api", issue = "50547")]
-unsafe impl<'a, T, F: Future<Output = T> + 'a> UnsafeFutureObj<'a, T> for PinMut<'a, F> {
+unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for PinMut<'a, F>
+ where F: Future<Output = T> + 'a
+{
fn into_raw(self) -> *mut () {
unsafe { PinMut::get_mut_unchecked(self) as *mut F as *mut () }
}