2 releases

0.1.1 Aug 27, 2023
0.1.0 Jul 28, 2022

#2551 in Rust patterns


Used in netsblox-vm

MIT/Apache

19KB
289 lines

bin-pool is a small crate for interning binary slices. A type called BinPool is provided which represents a collection of binary slices; however, the content is highly optimized for space by allowing slices to overlap in memory. The data is backed by a smaller subset of "large" slices that have been added previously.

Note that interning is not a cheap operation, and in the worst case every backing slice must be examined when adding a new slice. Interning is only recommended when memory is very limited, or for storage optimization in areas where time is not critical (e.g., compiler output).

Example

let mut b = BinPool::new();

b.add(b"hello world".as_slice());  // add first slice - backed by itself
b.add(b"hello".as_slice());        // add another slice - backed by first
b.add(b"world".as_slice());        // add another slice - backed by first
assert_eq!(b.bytes(), 21);         // 21 bytes stored
assert_eq!(b.backing_bytes(), 11); // but only 11 bytes needed to represent them

b.add(b"hello world!".as_slice()); // add another slice - becomes the backer for others
assert_eq!(b.bytes(), 33);         // now 33 bytes stored
assert_eq!(b.backing_bytes(), 12); // but only 12 bytes to represent them

no_std

bin-pool supports building in no_std environments by disabling default features. Note that the alloc crate is required.

[dependencies]
bin-pool = { version = "...", default-features = false }

No runtime deps