| Crates.io | ringstack |
| lib.rs | ringstack |
| version | 0.3.0 |
| created_at | 2022-11-13 02:12:16.027508+00 |
| updated_at | 2025-03-18 11:37:54.470335+00 |
| description | A very simple circular buffered stack implementation. |
| homepage | |
| repository | https://github.com/msr1k/ringstack |
| max_upload_size | |
| id | 713927 |
| size | 14,681 |
[RingStack] is a tiny stack implementation which uses circular buffer.
Since [RingStack] is constructed upon a circular buffer, the oldest item automatically dropped as you [push][RingStack::push()] when the number of items has already reached its limit. (Thus [len][RingStack::len()] method saturate with that number of limit.)
And it supports [RingStack::iter()] method which returns Iterator<&T>.
It provides items one by one with historical order, latest to oldest.
([RingStack::iter_mut()] method is also available)
Though [RingStack] currently uses [Vec] as its internals, once it allocates at the timing of [new][RingStack::new()] then additional allocation never happends.
use ringstack::RingStack;
let mut s = RingStack::<i32, 3>::new();
assert_eq!(s.peek(), None);
s.push(1);
s.push(2);
assert_eq!(s.len(), 2);
assert_eq!(s.peek(), Some(&2));
assert_eq!(s.pop(), Some(2));
assert_eq!(s[0], 1);
assert_eq!(s.get(0), Some(&1));
assert_eq!(s.get(1), None);
s.push(3);
s.push(4);
let v: Vec<i32> = s.iter().map(|e| e.clone()).collect();
assert_eq!(v, vec![4, 3, 1]);
s.push(5);
let v: Vec<i32> = s.iter().map(|e| e.clone()).collect();
assert_eq!(v, vec![5, 4, 3]);
assert_eq!(s.pop(), Some(5));
assert_eq!(s.pop(), Some(4));
assert_eq!(s.pop(), Some(3));
assert_eq!(s.pop(), None);
iter_mut()] and mut version of index accessing.clone()]Added [len()], [get()] methods.
Implemented [std::ops::Index].
Change [iter()] return type
Changed from &Option<T> into &T and it iterates only valid elements,
since it returns reference of T not Option.
Make RingStack [Debug] derived
Initial Version
The MIT License (MIT)
Copyright (c) 2022 msr1k