#heap-memory #pin #reuse #box #recycle #future

recycle-box

A pointer type for heap-allocated objects which heap storage can be re-used, with Pin support

2 unstable releases

0.2.0 Oct 21, 2022
0.1.0 Feb 10, 2022

#260 in Memory management

Download history 206/week @ 2024-07-23 405/week @ 2024-07-30 327/week @ 2024-08-06 377/week @ 2024-08-13 264/week @ 2024-08-20 276/week @ 2024-08-27 443/week @ 2024-09-03 297/week @ 2024-09-10 453/week @ 2024-09-17 319/week @ 2024-09-24 309/week @ 2024-10-01 315/week @ 2024-10-08 463/week @ 2024-10-15 602/week @ 2024-10-22 792/week @ 2024-10-29 707/week @ 2024-11-05

2,619 downloads per month
Used in 12 crates (4 directly)

MIT/Apache

29KB
491 lines

recycle-box

A pointer type for heap-allocated objects which heap storage can be re-used.

Cargo Documentation License

Overview

The box can be consumed to drop the current object and re-use the allocated space to store another object, which type may be different. New memory will only be allocated if the new object does not fit within the currently allocated space, taking into account both its size and alignment requirements.

Coercion from Sized to !Sized boxed objects is supported, including on Rust stable. Last but not least: Pinned boxes can be recycled too, which is useful when repeatedly allocating Futures.

Usage

Add this to your Cargo.toml:

[dependencies]
recycle-box = "0.2.0"

Examples

Store different objects, re-using if possible the previously allocated storage:

use recycle_box::RecycleBox;

// Store an object.
let box1 = RecycleBox::new(123u64);

// Store a smaller object.
let box2 = RecycleBox::recycle(box1, 456u16); // Does not allocate

// Store a larger object.
let box3 = RecycleBox::recycle(box2, [123u32; 8]); // New memory is allocated

// Move out and replace the previous object.
let (array3, box4) = RecycleBox::replace(box3, 789u32); // Does not allocate

// Drop the current object but preserve the allocated memory for further re-use.
// Note that `vacate()` is just an explicit shorthand for `recycle(())`.
let box5 = RecycleBox::vacate(box4);

Re-use the same box for different objects sharing the same trait:

use std::future::{self, Future};
use recycle_box::{RecycleBox, coerce_box};

let mut my_box: RecycleBox<dyn Future<Output = i32>> =
    coerce_box!(RecycleBox::new(future::ready(42)));
my_box = coerce_box!(RecycleBox::new(future::pending()));

Recycle a pinned box.

use std::pin::Pin;
use recycle_box::RecycleBox;

let pinned_box: Pin<_> = RecycleBox::new(42).into();
let new_box = RecycleBox::recycle_pinned(pinned_box, "Forty two");

Safety

This is a low-level primitive and as such its implementation relies on unsafe. Its correctness is assessed with an extensive test suite complemented by the MIRI interpreter.

License

This software is licensed under the Apache License, Version 2.0 or the MIT license, at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

No runtime deps