Auto merge of #36657 - nnethercote:rm-TypedArena-with_capacity, r=eddyb
[breaking-change] Remove TypedArena::with_capacity This is a follow-up to #36592. The function is unused by rustc. Also, it doesn't really follow the usual meaning of a `with_capacity` function because the first chunk allocation is now delayed until the first `alloc` call. This change reduces the size of `TypedArena` by one `usize`. @eddyb: we discussed this on IRC. Would you like to review it?
This commit is contained in:
commit
a0843d7210
@ -52,9 +52,6 @@
|
|||||||
|
|
||||||
/// An arena that can hold objects of only one type.
|
/// An arena that can hold objects of only one type.
|
||||||
pub struct TypedArena<T> {
|
pub struct TypedArena<T> {
|
||||||
/// The capacity of the first chunk (once it is allocated).
|
|
||||||
first_chunk_capacity: usize,
|
|
||||||
|
|
||||||
/// A pointer to the next object to be allocated.
|
/// A pointer to the next object to be allocated.
|
||||||
ptr: Cell<*mut T>,
|
ptr: Cell<*mut T>,
|
||||||
|
|
||||||
@ -122,17 +119,7 @@ impl<T> TypedArena<T> {
|
|||||||
/// Creates a new `TypedArena`.
|
/// Creates a new `TypedArena`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new() -> TypedArena<T> {
|
pub fn new() -> TypedArena<T> {
|
||||||
// Reserve at least one page.
|
|
||||||
let elem_size = cmp::max(1, mem::size_of::<T>());
|
|
||||||
TypedArena::with_capacity(PAGE / elem_size)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Creates a new `TypedArena`. Each chunk used within the arena will have
|
|
||||||
/// space for at least the given number of objects.
|
|
||||||
#[inline]
|
|
||||||
pub fn with_capacity(capacity: usize) -> TypedArena<T> {
|
|
||||||
TypedArena {
|
TypedArena {
|
||||||
first_chunk_capacity: cmp::max(1, capacity),
|
|
||||||
// We set both `ptr` and `end` to 0 so that the first call to
|
// We set both `ptr` and `end` to 0 so that the first call to
|
||||||
// alloc() will trigger a grow().
|
// alloc() will trigger a grow().
|
||||||
ptr: Cell::new(0 as *mut T),
|
ptr: Cell::new(0 as *mut T),
|
||||||
@ -183,7 +170,8 @@ fn grow(&self) {
|
|||||||
new_capacity = prev_capacity.checked_mul(2).unwrap();
|
new_capacity = prev_capacity.checked_mul(2).unwrap();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
new_capacity = self.first_chunk_capacity;
|
let elem_size = cmp::max(1, mem::size_of::<T>());
|
||||||
|
new_capacity = cmp::max(1, PAGE / elem_size);
|
||||||
}
|
}
|
||||||
chunk = TypedArenaChunk::<T>::new(new_capacity);
|
chunk = TypedArenaChunk::<T>::new(new_capacity);
|
||||||
self.ptr.set(chunk.start());
|
self.ptr.set(chunk.start());
|
||||||
@ -191,6 +179,7 @@ fn grow(&self) {
|
|||||||
chunks.push(chunk);
|
chunks.push(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clears the arena. Deallocates all but the longest chunk which may be reused.
|
/// Clears the arena. Deallocates all but the longest chunk which may be reused.
|
||||||
pub fn clear(&mut self) {
|
pub fn clear(&mut self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
Loading…
Reference in New Issue
Block a user