Replace Unique<T> with NonZero<T> in Alloc trait
This commit is contained in:
parent
f19baf0977
commit
fb03a49c25
4 changed files with 19 additions and 12 deletions
|
@ -19,7 +19,7 @@ use core::cmp;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use core::mem;
|
use core::mem;
|
||||||
use core::usize;
|
use core::usize;
|
||||||
use core::ptr::{self, Unique};
|
use core::ptr::{self, NonNull};
|
||||||
|
|
||||||
/// Represents the combination of a starting address and
|
/// Represents the combination of a starting address and
|
||||||
/// a total capacity of the returned block.
|
/// a total capacity of the returned block.
|
||||||
|
@ -895,12 +895,12 @@ pub unsafe trait Alloc {
|
||||||
/// Clients wishing to abort computation in response to an
|
/// Clients wishing to abort computation in response to an
|
||||||
/// allocation error are encouraged to call the allocator's `oom`
|
/// allocation error are encouraged to call the allocator's `oom`
|
||||||
/// method, rather than directly invoking `panic!` or similar.
|
/// method, rather than directly invoking `panic!` or similar.
|
||||||
fn alloc_one<T>(&mut self) -> Result<Unique<T>, AllocErr>
|
fn alloc_one<T>(&mut self) -> Result<NonNull<T>, AllocErr>
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
let k = Layout::new::<T>();
|
let k = Layout::new::<T>();
|
||||||
if k.size() > 0 {
|
if k.size() > 0 {
|
||||||
unsafe { self.alloc(k).map(|p| Unique::new_unchecked(p as *mut T)) }
|
unsafe { self.alloc(k).map(|p| NonNull::new_unchecked(p as *mut T)) }
|
||||||
} else {
|
} else {
|
||||||
Err(AllocErr::invalid_input("zero-sized type invalid for alloc_one"))
|
Err(AllocErr::invalid_input("zero-sized type invalid for alloc_one"))
|
||||||
}
|
}
|
||||||
|
@ -923,7 +923,7 @@ pub unsafe trait Alloc {
|
||||||
/// * `ptr` must denote a block of memory currently allocated via this allocator
|
/// * `ptr` must denote a block of memory currently allocated via this allocator
|
||||||
///
|
///
|
||||||
/// * the layout of `T` must *fit* that block of memory.
|
/// * the layout of `T` must *fit* that block of memory.
|
||||||
unsafe fn dealloc_one<T>(&mut self, ptr: Unique<T>)
|
unsafe fn dealloc_one<T>(&mut self, ptr: NonNull<T>)
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
let raw_ptr = ptr.as_ptr() as *mut u8;
|
let raw_ptr = ptr.as_ptr() as *mut u8;
|
||||||
|
@ -963,7 +963,7 @@ pub unsafe trait Alloc {
|
||||||
/// Clients wishing to abort computation in response to an
|
/// Clients wishing to abort computation in response to an
|
||||||
/// allocation error are encouraged to call the allocator's `oom`
|
/// allocation error are encouraged to call the allocator's `oom`
|
||||||
/// method, rather than directly invoking `panic!` or similar.
|
/// method, rather than directly invoking `panic!` or similar.
|
||||||
fn alloc_array<T>(&mut self, n: usize) -> Result<Unique<T>, AllocErr>
|
fn alloc_array<T>(&mut self, n: usize) -> Result<NonNull<T>, AllocErr>
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
match Layout::array::<T>(n) {
|
match Layout::array::<T>(n) {
|
||||||
|
@ -971,7 +971,7 @@ pub unsafe trait Alloc {
|
||||||
unsafe {
|
unsafe {
|
||||||
self.alloc(layout.clone())
|
self.alloc(layout.clone())
|
||||||
.map(|p| {
|
.map(|p| {
|
||||||
Unique::new_unchecked(p as *mut T)
|
NonNull::new_unchecked(p as *mut T)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1012,15 +1012,15 @@ pub unsafe trait Alloc {
|
||||||
/// reallocation error are encouraged to call the allocator's `oom`
|
/// reallocation error are encouraged to call the allocator's `oom`
|
||||||
/// method, rather than directly invoking `panic!` or similar.
|
/// method, rather than directly invoking `panic!` or similar.
|
||||||
unsafe fn realloc_array<T>(&mut self,
|
unsafe fn realloc_array<T>(&mut self,
|
||||||
ptr: Unique<T>,
|
ptr: NonNull<T>,
|
||||||
n_old: usize,
|
n_old: usize,
|
||||||
n_new: usize) -> Result<Unique<T>, AllocErr>
|
n_new: usize) -> Result<NonNull<T>, AllocErr>
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
match (Layout::array::<T>(n_old), Layout::array::<T>(n_new), ptr.as_ptr()) {
|
match (Layout::array::<T>(n_old), Layout::array::<T>(n_new), ptr.as_ptr()) {
|
||||||
(Some(ref k_old), Some(ref k_new), ptr) if k_old.size() > 0 && k_new.size() > 0 => {
|
(Some(ref k_old), Some(ref k_new), ptr) if k_old.size() > 0 && k_new.size() > 0 => {
|
||||||
self.realloc(ptr as *mut u8, k_old.clone(), k_new.clone())
|
self.realloc(ptr as *mut u8, k_old.clone(), k_new.clone())
|
||||||
.map(|p|Unique::new_unchecked(p as *mut T))
|
.map(|p| NonNull::new_unchecked(p as *mut T))
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
Err(AllocErr::invalid_input("invalid layout for realloc_array"))
|
Err(AllocErr::invalid_input("invalid layout for realloc_array"))
|
||||||
|
@ -1048,7 +1048,7 @@ pub unsafe trait Alloc {
|
||||||
/// constraints.
|
/// constraints.
|
||||||
///
|
///
|
||||||
/// Always returns `Err` on arithmetic overflow.
|
/// Always returns `Err` on arithmetic overflow.
|
||||||
unsafe fn dealloc_array<T>(&mut self, ptr: Unique<T>, n: usize) -> Result<(), AllocErr>
|
unsafe fn dealloc_array<T>(&mut self, ptr: NonNull<T>, n: usize) -> Result<(), AllocErr>
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
let raw_ptr = ptr.as_ptr() as *mut u8;
|
let raw_ptr = ptr.as_ptr() as *mut u8;
|
||||||
|
|
|
@ -322,7 +322,7 @@ impl<T, A: Alloc> RawVec<T, A> {
|
||||||
// would cause overflow
|
// would cause overflow
|
||||||
let new_cap = if elem_size > (!0) / 8 { 1 } else { 4 };
|
let new_cap = if elem_size > (!0) / 8 { 1 } else { 4 };
|
||||||
match self.a.alloc_array::<T>(new_cap) {
|
match self.a.alloc_array::<T>(new_cap) {
|
||||||
Ok(ptr) => (new_cap, ptr),
|
Ok(ptr) => (new_cap, ptr.into()),
|
||||||
Err(e) => self.a.oom(e),
|
Err(e) => self.a.oom(e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2452,6 +2452,13 @@ impl<'a, T: ?Sized> From<&'a T> for Unique<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[unstable(feature = "unique", issue = "27730")]
|
||||||
|
impl<'a, T: ?Sized> From<NonNull<T>> for Unique<T> {
|
||||||
|
fn from(p: NonNull<T>) -> Self {
|
||||||
|
Unique { pointer: p.pointer, _marker: PhantomData }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Previous name of `NonNull`.
|
/// Previous name of `NonNull`.
|
||||||
#[rustc_deprecated(since = "1.24", reason = "renamed to `NonNull`")]
|
#[rustc_deprecated(since = "1.24", reason = "renamed to `NonNull`")]
|
||||||
#[unstable(feature = "shared", issue = "27730")]
|
#[unstable(feature = "shared", issue = "27730")]
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(allocator_api, unique)]
|
#![feature(allocator_api, nonnull)]
|
||||||
|
|
||||||
use std::heap::{Heap, Alloc};
|
use std::heap::{Heap, Alloc};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue