#double-ended #string #deque #data #side #structures #queue

spaghetto

A library for making double-ended data structures, like an always-contigouous double-ended queue (deque) and double-ended string

3 releases

0.0.3 Nov 15, 2024
0.0.2 Nov 15, 2024
0.0.1 Nov 15, 2024

#953 in Data structures

Download history 335/week @ 2024-11-15 12/week @ 2024-11-22 25/week @ 2024-11-29 6/week @ 2024-12-06

378 downloads per month

MIT/Apache

110KB
2K SLoC

Spaghetto

Spaghetto is a library for creating double-ended data structures that can be rolled out or eaten on from either side. This includes the base structure DeVec, a double-ended Vec (heap-allocated dynamically sized array-like collection) that can be used as a deque, and DeString, a double-ended alternative to String.

Examples

DeVec

A DeVec (Double-Ended Vec) can be used as a double-ended queue, but with the added benefit of being able to get a single contiguous slice of the entire structure.

use spaghetto::DeVec;
let mut devec = DeVec::with_capacity(5);
devec.push_back(1);
devec.push_front(2);
devec.push_back(3);
assert_eq!(devec.pop_front(), Some(2));
devec.pop_front();
// Now let's overload one side.
// This forces a DeVec to reallocate in order to keep the elements contiguous.
// With a VecDeque this would no longer be a contiguous allocation
// because we moved the front of the queue into the middle of the buffer
// and pushed it out past the end of the buffer.
// It would need to wrap around.
for i in 0..3 {
   devec.push_back(i);
}

// we can get a single contiguous slice of the entire DeVec without having to shift elements.
let no_mutation = &devec;
let slice = no_mutation.as_slice();

DeString

A DeString can be used as a double-ended string, and because of this, we can efficiently remove extra whitespace from either side, mutating in place and maintining a single contiguous string slice without the cost of shifting like with a String.

use spaghetto::DeString;
let mut destring = DeString::from("  hello world  ");
destring.mut_trim_front();
// It is contiguous and also mutated its starting position!
assert_eq!(destring.as_str(), "hello world  ");

Dependencies

~160KB