A double-ended queue implemented using a Vec
that reuses space after
elements are removed.
The API is heavily based on collections.deque
from Python.
You can create a ring using any of the available constructors or the ring!
macro.
```rust
use ring_queue::Ring;
// new
for an empty ring.
let r: Ring
// with_capacity
for allocating the internal vector with the given
// capacity.
let r2: Ring
// ring!
macro for easy initializing the ring.
let r3: Ring
// from_iter
to construct the ring from an iterator.
use std::iter::FromIterator;
let r4: Ring
Instead of front
and back
as a nomenclature, this library uses left
to refer to the front an nothing to refer to the back, as the Python
collections.deque
library does.
Items can be pushed to the left and right as well as popped.
```rust
use ring_queue::Ring;
let mut r = ring![1, 2, 3]; r.push(4); r.pushleft(0); asserteq!(r.pop(), Some(4)); asserteq!(r.popleft(), Some(0)); ```
The ring can be rotated either to the left or to the right. Any positive
number will rotate n
steps to the right and any negative number will
rotate n
steps to the left.
```rust
use ring_queue::Ring;
let mut r = ring![1, 2, 3, 4, 5];
r.rotate(1); assert_eq!(r.collect(), vec![5, 1, 2, 3, 4]);
r.rotate(-2); assert_eq!(r.collect(), vec![2, 3, 4, 5, 1]); ```
Ring implements collect
to collect the elements in the ring as a vector
if the type of the elements implements the Copy
trait.
It also implements into_iter
to generate an iterator. However,
into_iter
empties the ring.
```rust
use ring_queue::Ring;
let mut r = ring![1, 2, 3, 4]; asserteq!(r.collect(), vec![1, 2, 3, 4]); asserteq!(r.is_empty(), false);
for item in r.into_iter() { println!("{}", item); }
asserteq!(r.isempty(), true); ```
MIT License, see LICENSE