mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Clarify ArenaAllocatable
's second parameter.
It's simply a binary thing to allow different behaviour for `Copy` vs `!Copy` types. The new code makes this much clearer; I was scratching my head over the old code for some time.
This commit is contained in:
parent
9065c7ced6
commit
6035487715
@ -546,7 +546,7 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
|||||||
$($name: $crate::TypedArena<$ty>,)*
|
$($name: $crate::TypedArena<$ty>,)*
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ArenaAllocatable<'tcx, T = Self>: Sized {
|
pub trait ArenaAllocatable<'tcx, C = rustc_arena::IsNotCopy>: Sized {
|
||||||
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut Self;
|
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut Self;
|
||||||
fn allocate_from_iter<'a>(
|
fn allocate_from_iter<'a>(
|
||||||
arena: &'a Arena<'tcx>,
|
arena: &'a Arena<'tcx>,
|
||||||
@ -555,7 +555,7 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Any type that impls `Copy` can be arena-allocated in the `DroplessArena`.
|
// Any type that impls `Copy` can be arena-allocated in the `DroplessArena`.
|
||||||
impl<'tcx, T: Copy> ArenaAllocatable<'tcx, ()> for T {
|
impl<'tcx, T: Copy> ArenaAllocatable<'tcx, rustc_arena::IsCopy> for T {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut Self {
|
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut Self {
|
||||||
arena.dropless.alloc(self)
|
arena.dropless.alloc(self)
|
||||||
@ -569,7 +569,7 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$(
|
$(
|
||||||
impl<'tcx> ArenaAllocatable<'tcx, $ty> for $ty {
|
impl<'tcx> ArenaAllocatable<'tcx, rustc_arena::IsNotCopy> for $ty {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut Self {
|
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut Self {
|
||||||
if !::std::mem::needs_drop::<Self>() {
|
if !::std::mem::needs_drop::<Self>() {
|
||||||
@ -595,7 +595,7 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
|||||||
|
|
||||||
impl<'tcx> Arena<'tcx> {
|
impl<'tcx> Arena<'tcx> {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn alloc<T: ArenaAllocatable<'tcx, U>, U>(&self, value: T) -> &mut T {
|
pub fn alloc<T: ArenaAllocatable<'tcx, C>, C>(&self, value: T) -> &mut T {
|
||||||
value.allocate_on(self)
|
value.allocate_on(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,7 +608,7 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
|||||||
self.dropless.alloc_slice(value)
|
self.dropless.alloc_slice(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn alloc_from_iter<'a, T: ArenaAllocatable<'tcx, U>, U>(
|
pub fn alloc_from_iter<'a, T: ArenaAllocatable<'tcx, C>, C>(
|
||||||
&'a self,
|
&'a self,
|
||||||
iter: impl ::std::iter::IntoIterator<Item = T>,
|
iter: impl ::std::iter::IntoIterator<Item = T>,
|
||||||
) -> &'a mut [T] {
|
) -> &'a mut [T] {
|
||||||
@ -617,5 +617,10 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Marker types that let us give different behaviour for arenas allocating
|
||||||
|
// `Copy` types vs `!Copy` types.
|
||||||
|
pub struct IsCopy;
|
||||||
|
pub struct IsNotCopy;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
Loading…
Reference in New Issue
Block a user