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:
bors 2016-09-24 15:17:07 -07:00 committed by GitHub
commit a0843d7210

View File

@ -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 {