#slice #container #size #sized #items #data #generic

slice_map

A generic container to store a single type of data into unevenly sized slices

17 releases

new 0.2.6 Dec 9, 2024
0.2.5 Dec 9, 2024
0.2.4 Nov 21, 2024
0.2.1 Oct 20, 2024
0.1.9 Oct 20, 2024

#564 in Rust patterns

Download history 132/week @ 2024-09-30 149/week @ 2024-10-07 348/week @ 2024-10-14 130/week @ 2024-10-21 243/week @ 2024-11-11 159/week @ 2024-11-18 5/week @ 2024-11-25 28/week @ 2024-12-02

435 downloads per month

MIT license

35KB
897 lines

0.2.4 Update

SliceMap is a project driven by another personal project, and its design follows the needs of that project. As a result, I had to go back to the idea of a Generic SliceMap that uses a Storage trait to pick different Storage structs.

Instead of [SliceMap] you should use the new type aliases, [SlotSliceMap] for SlotMap storage, [SecSliceMap] for SecondaryMap and [SparseSliceMap] for SparseSecondaryMap respectively.

To allow using [SparseSecondaryMap] this crate is not "no_std" anymore, but I plan to make that an optional feature and restore its no_std status!

Description

[SliceMap] and its type aliases provides a container that allows iterating directly all of its items, or iterating through non-overlapping slices of varying sizes. You can only insert new items in groups that will become a new slice.

Example

A good use would be storing the points for polygons with different point counts, but in a way where all those points are laid out continuously in memory. Each slice of points can be iterated separately and is effectively a new polygon. Drawing all polygons at once can be very CPU cache-friendly.

Here's a simpler example with i32 values:

use slice_map::SlotSliceMap;

slotmap::new_key_type!{
    pub struct TestKey;
}

let mut slices = SlotSliceMap::<TestKey, i32>::default();

// Adding items returns a SliceKey
let _a = slices.add_items([1, 2, 3, 4, 5]);
let b = slices.add_items([6, 7]);
let c = slices.add_items([8, 9, 10]);

// Iterating over slices
let mut slice_iter = slices.iter_slices();
assert_eq!(slice_iter.next().unwrap(), [1, 2, 3, 4, 5]);
assert_eq!(slice_iter.next().unwrap(), [6, 7]);
assert_eq!(slice_iter.next().unwrap(), [8, 9, 10]);
assert_eq!(slice_iter.next(), None);
drop(slice_iter);

// Iterating over all items
let mut i = 1;
for item in slices.iter_items(){
    assert_eq!(i, *item);
    i += 1
}

// Removing slices removes all of their items,
// but other keys are still valid!
slices.remove_slice(b);
let slice_c = slices.get_slice(c).unwrap();
assert_eq!(slice_c, &[8, 9, 10]);

let mut slice_iter = slices.iter_slices();
assert_eq!(slice_iter.next().unwrap(), [1, 2, 3, 4, 5]);
assert_eq!(slice_iter.next().unwrap(), [8, 9, 10]);

Dependencies

~280KB