# Limited Queue
[![Crates.io Version](https://img.shields.io/crates/v/limited-queue.svg)](https://crates.io/crates/limited-queue)
![GitHub top language](https://img.shields.io/github/languages/top/Shiritai/limited-queue)
![GitHub CI Status](https://img.shields.io/github/actions/workflow/status/Shiritai/limited-queue/.github/workflows/ci.yml)
[![Crates.io Downloads](https://img.shields.io/crates/d/limited-queue.svg)](https://crates.io/crates/limited-queue)
[![License](https://img.shields.io/github/license/Shiritai/limited-queue)](LICENSE)
A circular queue that overrides the oldest data if trying to push a data when the queue is full.
All operations are of **`O(1)`** complexity, except the constructor with `O(Vec::with_capacity)`.
The optional method `pop` is provided when `T` satisfies trait bound `Default`.
## Comparison
There is a similar library [`circular-queue`](https://github.com/YaLTeR/circular-queue) I found, but without the basic `peek` and `pop` operations. The comparison for now is listed below:
||[`LimitedQueue`](https://github.com/Shiritai/limited-queue)| [`circular-queue`](https://github.com/YaLTeR/circular-queue) |
|:-:|:-|:-|
|Algorithm|circular queue (front-rear, without additional element slot)|circular queue (based on `len` and `capacity` provided by `Vec`)|
|Element trait bound needed|No, optionally `Default` for `pop` method|-|
|`push`, size-related methods|✅|✅|
|`peek`, `pop` support|✅: `peek`
✅: `pop` for `T: Default`|❌|
|Indexing|✅
- `[0, len)`
- support `[idx]`
- support `get(idx)`
- optionally mutable (`[idx]`)|❌|
|Iterator|✅
- front to rear|✅
- both ways
- optionally mutable|
|`clear` complexity|`O(1)`|`O(Vec::clear)`|
|`serde` support|❌ (TODO)|✅|
We welcome any kinds of contributions, please don't be hesitate to submit issues & PRs.
## Setup
Please run `scripts/setup.sh` to setup for committing. Currently, the script registers a git pre-commit hook.