Skip to content

Commit bd092a8

Browse files
committed
feat: add PoC collections crate
1 parent a7f09f9 commit bd092a8

File tree

8 files changed

+186
-1
lines changed

8 files changed

+186
-1
lines changed

.cspell.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ version: "0.2"
22
words:
33
- actix
44
- ahash
5+
- arrayvec
56
- bytestring
67
- cbor
78
- clippy
@@ -42,5 +43,6 @@ words:
4243
- splitn
4344
- struct
4445
- taplo
46+
- tinyvec
4547
- trybuild
4648
- vals

Cargo.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ members = [
55
"./actix-hash",
66
"./actix-web-lab-derive",
77
"./actix-web-lab",
8-
"./russe",
8+
"./russe", "collections",
99
]
1010

1111
[workspace.package]

collections/Cargo.toml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
name = "collections"
3+
version = "0.1.0"
4+
description = "Collection traits and implementations for common crates"
5+
repository.workspace = true
6+
license.workspace = true
7+
edition.workspace = true
8+
rust-version.workspace = true
9+
10+
[dependencies]
11+
arrayvec = "0.7"
12+
tinyvec = "1"
13+
14+
[lints]
15+
workspace = true

collections/src/arrayvec.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use arrayvec::ArrayVec;
2+
3+
use super::List;
4+
use super::MutableList;
5+
6+
impl<T, const CAP: usize> List<T> for ArrayVec<T, CAP> {
7+
fn len(&self) -> usize {
8+
ArrayVec::len(self)
9+
}
10+
11+
fn get(&self, idx: usize) -> Option<&T> {
12+
<[_]>::get(self, idx)
13+
}
14+
}
15+
16+
impl<T, const CAP: usize> MutableList<T> for ArrayVec<T, CAP> {
17+
fn append(&mut self, element: T) {
18+
self.push(element);
19+
}
20+
21+
fn get_mut(&mut self, idx: usize) -> Option<&mut T> {
22+
<[_]>::get_mut(self, idx)
23+
}
24+
}
25+
26+
#[cfg(test)]
27+
pub(crate) mod tests {
28+
use super::*;
29+
30+
#[test]
31+
fn it_works() {
32+
let mut vec = ArrayVec::<_, 8>::new();
33+
34+
assert_eq!(0, List::len(&vec));
35+
assert!(List::is_empty(&vec));
36+
37+
MutableList::append(&mut vec, 1);
38+
39+
assert_eq!(1, List::len(&vec));
40+
assert!(!List::is_empty(&vec));
41+
42+
assert_eq!(&1, List::get(&vec, 0).unwrap());
43+
}
44+
}

collections/src/lib.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//! Collection traits.
2+
3+
#![allow(missing_docs)]
4+
5+
mod arrayvec;
6+
mod tinyvec;
7+
mod vec;
8+
9+
pub trait List<T> {
10+
fn len(&self) -> usize;
11+
12+
fn is_empty(&self) -> bool {
13+
self.len() == 0
14+
}
15+
16+
fn get(&self, idx: usize) -> Option<&T>;
17+
}
18+
19+
pub trait MutableList<T>: List<T> {
20+
fn append(&mut self, element: T);
21+
22+
fn get_mut(&mut self, idx: usize) -> Option<&mut T>;
23+
}

collections/src/tinyvec.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use tinyvec::Array;
2+
use tinyvec::ArrayVec;
3+
4+
use super::List;
5+
use super::MutableList;
6+
7+
impl<A: Array> List<A::Item> for ArrayVec<A> {
8+
fn len(&self) -> usize {
9+
ArrayVec::len(self)
10+
}
11+
12+
fn get(&self, idx: usize) -> Option<&A::Item> {
13+
<[_]>::get(self, idx)
14+
}
15+
}
16+
17+
impl<A: Array> MutableList<A::Item> for ArrayVec<A> {
18+
fn append(&mut self, element: A::Item) {
19+
self.push(element);
20+
}
21+
22+
fn get_mut(&mut self, idx: usize) -> Option<&mut A::Item> {
23+
<[_]>::get_mut(self, idx)
24+
}
25+
}
26+
27+
#[cfg(test)]
28+
pub(crate) mod tests {
29+
use super::*;
30+
31+
#[test]
32+
fn it_works() {
33+
let mut vec = ArrayVec::<[_; 8]>::new();
34+
35+
assert_eq!(0, List::len(&vec));
36+
assert!(List::is_empty(&vec));
37+
38+
MutableList::append(&mut vec, 1);
39+
40+
assert_eq!(1, List::len(&vec));
41+
assert!(!List::is_empty(&vec));
42+
43+
assert_eq!(&1, List::get(&vec, 0).unwrap());
44+
}
45+
}

collections/src/vec.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use super::List;
2+
use super::MutableList;
3+
4+
impl<T> List<T> for Vec<T> {
5+
fn len(&self) -> usize {
6+
Vec::len(self)
7+
}
8+
9+
fn get(&self, idx: usize) -> Option<&T> {
10+
<[_]>::get(self, idx)
11+
}
12+
}
13+
14+
impl<T> MutableList<T> for Vec<T> {
15+
fn append(&mut self, element: T) {
16+
self.push(element);
17+
}
18+
19+
fn get_mut(&mut self, idx: usize) -> Option<&mut T> {
20+
<[_]>::get_mut(self, idx)
21+
}
22+
}
23+
24+
#[cfg(test)]
25+
pub(crate) mod tests {
26+
use super::*;
27+
28+
#[test]
29+
fn it_works() {
30+
let mut vec = vec![];
31+
32+
assert_eq!(0, List::len(&vec));
33+
assert!(List::is_empty(&vec));
34+
35+
MutableList::append(&mut vec, 1);
36+
37+
assert_eq!(1, List::len(&vec));
38+
assert!(!List::is_empty(&vec));
39+
40+
assert_eq!(&1, List::get(&vec, 0).unwrap());
41+
}
42+
}

0 commit comments

Comments
 (0)