move PinBox into pin module and export through std
This commit is contained in:
@@ -759,166 +759,6 @@ impl<T> Generator for Box<T>
|
||||
}
|
||||
}
|
||||
|
||||
/// A pinned, heap allocated reference.
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
#[fundamental]
|
||||
#[repr(transparent)]
|
||||
pub struct PinBox<T: ?Sized> {
|
||||
inner: Box<T>,
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T> PinBox<T> {
|
||||
/// Allocate memory on the heap, move the data into it and pin it.
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
pub fn new(data: T) -> PinBox<T> {
|
||||
PinBox { inner: Box::new(data) }
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> PinBox<T> {
|
||||
/// Get a pinned reference to the data in this PinBox.
|
||||
#[inline]
|
||||
pub fn as_pin_mut<'a>(&'a mut self) -> PinMut<'a, T> {
|
||||
unsafe { PinMut::new_unchecked(&mut *self.inner) }
|
||||
}
|
||||
|
||||
/// Constructs a `PinBox` from a raw pointer.
|
||||
///
|
||||
/// After calling this function, the raw pointer is owned by the
|
||||
/// resulting `PinBox`. Specifically, the `PinBox` destructor will call
|
||||
/// the destructor of `T` and free the allocated memory. Since the
|
||||
/// way `PinBox` allocates and releases memory is unspecified, the
|
||||
/// only valid pointer to pass to this function is the one taken
|
||||
/// from another `PinBox` via the [`PinBox::into_raw`] function.
|
||||
///
|
||||
/// This function is unsafe because improper use may lead to
|
||||
/// memory problems. For example, a double-free may occur if the
|
||||
/// function is called twice on the same raw pointer.
|
||||
///
|
||||
/// [`PinBox::into_raw`]: struct.PinBox.html#method.into_raw
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(pin)]
|
||||
/// use std::boxed::PinBox;
|
||||
/// let x = PinBox::new(5);
|
||||
/// let ptr = PinBox::into_raw(x);
|
||||
/// let x = unsafe { PinBox::from_raw(ptr) };
|
||||
/// ```
|
||||
#[inline]
|
||||
pub unsafe fn from_raw(raw: *mut T) -> Self {
|
||||
PinBox { inner: Box::from_raw(raw) }
|
||||
}
|
||||
|
||||
/// Consumes the `PinBox`, returning the wrapped raw pointer.
|
||||
///
|
||||
/// After calling this function, the caller is responsible for the
|
||||
/// memory previously managed by the `PinBox`. In particular, the
|
||||
/// caller should properly destroy `T` and release the memory. The
|
||||
/// proper way to do so is to convert the raw pointer back into a
|
||||
/// `PinBox` with the [`PinBox::from_raw`] function.
|
||||
///
|
||||
/// Note: this is an associated function, which means that you have
|
||||
/// to call it as `PinBox::into_raw(b)` instead of `b.into_raw()`. This
|
||||
/// is so that there is no conflict with a method on the inner type.
|
||||
///
|
||||
/// [`PinBox::from_raw`]: struct.PinBox.html#method.from_raw
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(pin)]
|
||||
/// use std::boxed::PinBox;
|
||||
/// let x = PinBox::new(5);
|
||||
/// let ptr = PinBox::into_raw(x);
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn into_raw(b: PinBox<T>) -> *mut T {
|
||||
Box::into_raw(b.inner)
|
||||
}
|
||||
|
||||
/// Get a mutable reference to the data inside this PinBox.
|
||||
///
|
||||
/// This function is unsafe. Users must guarantee that the data is never
|
||||
/// moved out of this reference.
|
||||
#[inline]
|
||||
pub unsafe fn get_mut<'a>(this: &'a mut PinBox<T>) -> &'a mut T {
|
||||
&mut *this.inner
|
||||
}
|
||||
|
||||
/// Convert this PinBox into an unpinned Box.
|
||||
///
|
||||
/// This function is unsafe. Users must guarantee that the data is never
|
||||
/// moved out of the box.
|
||||
#[inline]
|
||||
pub unsafe fn unpin(this: PinBox<T>) -> Box<T> {
|
||||
this.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> From<Box<T>> for PinBox<T> {
|
||||
fn from(boxed: Box<T>) -> PinBox<T> {
|
||||
PinBox { inner: boxed }
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: Unpin + ?Sized> From<PinBox<T>> for Box<T> {
|
||||
fn from(pinned: PinBox<T>) -> Box<T> {
|
||||
pinned.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> Deref for PinBox<T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &T {
|
||||
&*self.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: Unpin + ?Sized> DerefMut for PinBox<T> {
|
||||
fn deref_mut(&mut self) -> &mut T {
|
||||
&mut *self.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: fmt::Display + ?Sized> fmt::Display for PinBox<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Display::fmt(&*self.inner, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: fmt::Debug + ?Sized> fmt::Debug for PinBox<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Debug::fmt(&*self.inner, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> fmt::Pointer for PinBox<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
// It's not possible to extract the inner Uniq directly from the Box,
|
||||
// instead we cast it to a *const which aliases the Unique
|
||||
let ptr: *const T = &*self.inner;
|
||||
fmt::Pointer::fmt(&ptr, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
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<F: ?Sized + Future + Unpin> Future for Box<F> {
|
||||
type Output = F::Output;
|
||||
@@ -928,15 +768,6 @@ impl<F: ?Sized + Future + Unpin> Future for Box<F> {
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<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<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
|
||||
where F: Future<Output = T> + 'a
|
||||
@@ -956,25 +787,6 @@ unsafe impl<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
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 ()
|
||||
}
|
||||
|
||||
unsafe fn poll(ptr: *mut (), cx: &mut Context) -> Poll<T> {
|
||||
let ptr = ptr as *mut F;
|
||||
let pin: PinMut<F> = PinMut::new_unchecked(&mut *ptr);
|
||||
pin.poll(cx)
|
||||
}
|
||||
|
||||
unsafe fn drop(ptr: *mut ()) {
|
||||
drop(PinBox::from_raw(ptr as *mut F))
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<Sp> Spawn for Box<Sp>
|
||||
where Sp: Spawn + ?Sized
|
||||
@@ -991,13 +803,6 @@ impl<Sp> Spawn for Box<Sp>
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<'a, F: Future<Output = ()> + Send + 'a> From<PinBox<F>> for FutureObj<'a, ()> {
|
||||
fn from(boxed: PinBox<F>) -> Self {
|
||||
FutureObj::new(boxed)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<'a, F: Future<Output = ()> + Send + 'a> From<Box<F>> for FutureObj<'a, ()> {
|
||||
fn from(boxed: Box<F>) -> Self {
|
||||
@@ -1005,13 +810,6 @@ impl<'a, F: Future<Output = ()> + Send + 'a> From<Box<F>> for FutureObj<'a, ()>
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<'a, F: Future<Output = ()> + 'a> From<PinBox<F>> for LocalFutureObj<'a, ()> {
|
||||
fn from(boxed: PinBox<F>) -> Self {
|
||||
LocalFutureObj::new(boxed)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<'a, F: Future<Output = ()> + 'a> From<Box<F>> for LocalFutureObj<'a, ()> {
|
||||
fn from(boxed: Box<F>) -> Self {
|
||||
|
||||
@@ -159,6 +159,7 @@ pub mod collections;
|
||||
pub mod sync;
|
||||
pub mod rc;
|
||||
pub mod raw_vec;
|
||||
pub mod pin;
|
||||
pub mod prelude;
|
||||
pub mod borrow;
|
||||
pub mod fmt;
|
||||
|
||||
225
src/liballoc/pin.rs
Normal file
225
src/liballoc/pin.rs
Normal file
@@ -0,0 +1,225 @@
|
||||
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
//! Types which pin data to its location in memory
|
||||
|
||||
#![unstable(feature = "pin", issue = "49150")]
|
||||
|
||||
use core::convert::From;
|
||||
use core::fmt;
|
||||
use core::future::{Future, FutureObj, LocalFutureObj, UnsafeFutureObj};
|
||||
use core::marker::{Unpin, Unsize};
|
||||
use core::pin::PinMut;
|
||||
use core::ops::{CoerceUnsized, Deref, DerefMut};
|
||||
use core::task::{Context, Poll};
|
||||
|
||||
use boxed::Box;
|
||||
|
||||
/// A pinned, heap allocated reference.
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
#[fundamental]
|
||||
#[repr(transparent)]
|
||||
pub struct PinBox<T: ?Sized> {
|
||||
inner: Box<T>,
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T> PinBox<T> {
|
||||
/// Allocate memory on the heap, move the data into it and pin it.
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
pub fn new(data: T) -> PinBox<T> {
|
||||
PinBox { inner: Box::new(data) }
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> PinBox<T> {
|
||||
/// Get a pinned reference to the data in this PinBox.
|
||||
#[inline]
|
||||
pub fn as_pin_mut<'a>(&'a mut self) -> PinMut<'a, T> {
|
||||
unsafe { PinMut::new_unchecked(&mut *self.inner) }
|
||||
}
|
||||
|
||||
/// Constructs a `PinBox` from a raw pointer.
|
||||
///
|
||||
/// After calling this function, the raw pointer is owned by the
|
||||
/// resulting `PinBox`. Specifically, the `PinBox` destructor will call
|
||||
/// the destructor of `T` and free the allocated memory. Since the
|
||||
/// way `PinBox` allocates and releases memory is unspecified, the
|
||||
/// only valid pointer to pass to this function is the one taken
|
||||
/// from another `PinBox` via the [`PinBox::into_raw`] function.
|
||||
///
|
||||
/// This function is unsafe because improper use may lead to
|
||||
/// memory problems. For example, a double-free may occur if the
|
||||
/// function is called twice on the same raw pointer.
|
||||
///
|
||||
/// [`PinBox::into_raw`]: struct.PinBox.html#method.into_raw
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(pin)]
|
||||
/// use std::pin::PinBox;
|
||||
/// let x = PinBox::new(5);
|
||||
/// let ptr = PinBox::into_raw(x);
|
||||
/// let x = unsafe { PinBox::from_raw(ptr) };
|
||||
/// ```
|
||||
#[inline]
|
||||
pub unsafe fn from_raw(raw: *mut T) -> Self {
|
||||
PinBox { inner: Box::from_raw(raw) }
|
||||
}
|
||||
|
||||
/// Consumes the `PinBox`, returning the wrapped raw pointer.
|
||||
///
|
||||
/// After calling this function, the caller is responsible for the
|
||||
/// memory previously managed by the `PinBox`. In particular, the
|
||||
/// caller should properly destroy `T` and release the memory. The
|
||||
/// proper way to do so is to convert the raw pointer back into a
|
||||
/// `PinBox` with the [`PinBox::from_raw`] function.
|
||||
///
|
||||
/// Note: this is an associated function, which means that you have
|
||||
/// to call it as `PinBox::into_raw(b)` instead of `b.into_raw()`. This
|
||||
/// is so that there is no conflict with a method on the inner type.
|
||||
///
|
||||
/// [`PinBox::from_raw`]: struct.PinBox.html#method.from_raw
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(pin)]
|
||||
/// use std::pin::PinBox;
|
||||
/// let x = PinBox::new(5);
|
||||
/// let ptr = PinBox::into_raw(x);
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn into_raw(b: PinBox<T>) -> *mut T {
|
||||
Box::into_raw(b.inner)
|
||||
}
|
||||
|
||||
/// Get a mutable reference to the data inside this PinBox.
|
||||
///
|
||||
/// This function is unsafe. Users must guarantee that the data is never
|
||||
/// moved out of this reference.
|
||||
#[inline]
|
||||
pub unsafe fn get_mut<'a>(this: &'a mut PinBox<T>) -> &'a mut T {
|
||||
&mut *this.inner
|
||||
}
|
||||
|
||||
/// Convert this PinBox into an unpinned Box.
|
||||
///
|
||||
/// This function is unsafe. Users must guarantee that the data is never
|
||||
/// moved out of the box.
|
||||
#[inline]
|
||||
pub unsafe fn unpin(this: PinBox<T>) -> Box<T> {
|
||||
this.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> From<Box<T>> for PinBox<T> {
|
||||
fn from(boxed: Box<T>) -> PinBox<T> {
|
||||
PinBox { inner: boxed }
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: Unpin + ?Sized> From<PinBox<T>> for Box<T> {
|
||||
fn from(pinned: PinBox<T>) -> Box<T> {
|
||||
pinned.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> Deref for PinBox<T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &T {
|
||||
&*self.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: Unpin + ?Sized> DerefMut for PinBox<T> {
|
||||
fn deref_mut(&mut self) -> &mut T {
|
||||
&mut *self.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: fmt::Display + ?Sized> fmt::Display for PinBox<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Display::fmt(&*self.inner, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: fmt::Debug + ?Sized> fmt::Debug for PinBox<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Debug::fmt(&*self.inner, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
impl<T: ?Sized> fmt::Pointer for PinBox<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
// It's not possible to extract the inner Uniq directly from the Box,
|
||||
// instead we cast it to a *const which aliases the Unique
|
||||
let ptr: *const T = &*self.inner;
|
||||
fmt::Pointer::fmt(&ptr, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "pin", issue = "49150")]
|
||||
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<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<'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 ()
|
||||
}
|
||||
|
||||
unsafe fn poll(ptr: *mut (), cx: &mut Context) -> Poll<T> {
|
||||
let ptr = ptr as *mut F;
|
||||
let pin: PinMut<F> = PinMut::new_unchecked(&mut *ptr);
|
||||
pin.poll(cx)
|
||||
}
|
||||
|
||||
unsafe fn drop(ptr: *mut ()) {
|
||||
drop(PinBox::from_raw(ptr as *mut F))
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<'a, F: Future<Output = ()> + Send + 'a> From<PinBox<F>> for FutureObj<'a, ()> {
|
||||
fn from(boxed: PinBox<F>) -> Self {
|
||||
FutureObj::new(boxed)
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "futures_api", issue = "50547")]
|
||||
impl<'a, F: Future<Output = ()> + 'a> From<PinBox<F>> for LocalFutureObj<'a, ()> {
|
||||
fn from(boxed: PinBox<F>) -> Self {
|
||||
LocalFutureObj::new(boxed)
|
||||
}
|
||||
}
|
||||
@@ -13,3 +13,5 @@
|
||||
#![unstable(feature = "pin", issue = "49150")]
|
||||
|
||||
pub use core::pin::*;
|
||||
|
||||
pub use alloc_crate::pin::*;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
#![feature(arbitrary_self_types, async_await, await_macro, futures_api, pin)]
|
||||
|
||||
use std::boxed::PinBox;
|
||||
use std::pin::PinBox;
|
||||
use std::pin::PinMut;
|
||||
use std::future::Future;
|
||||
use std::sync::{
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#![feature(arbitrary_self_types, futures_api, pin)]
|
||||
#![allow(unused)]
|
||||
|
||||
use std::boxed::PinBox;
|
||||
use std::pin::PinBox;
|
||||
use std::future::Future;
|
||||
use std::pin::PinMut;
|
||||
use std::rc::Rc;
|
||||
|
||||
@@ -14,7 +14,7 @@ const QUERY = 'pinbox::new';
|
||||
|
||||
const EXPECTED = {
|
||||
'others': [
|
||||
{ 'path': 'std::boxed::PinBox', 'name': 'new' },
|
||||
{ 'path': 'alloc::boxed::PinBox', 'name': 'new' },
|
||||
{ 'path': 'std::pin::PinBox', 'name': 'new' },
|
||||
{ 'path': 'alloc::pin::PinBox', 'name': 'new' },
|
||||
],
|
||||
};
|
||||
|
||||
@@ -14,6 +14,6 @@ const EXPECTED = {
|
||||
'others': [
|
||||
{ 'path': 'std::vec::Vec', 'name': 'new' },
|
||||
{ 'path': 'std::vec::Vec', 'name': 'ne' },
|
||||
{ 'path': 'std::boxed::PinBox', 'name': 'new' },
|
||||
{ 'path': 'std::pin::PinBox', 'name': 'new' },
|
||||
],
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user