File tree Expand file tree Collapse file tree 8 files changed +186
-1
lines changed
Expand file tree Collapse file tree 8 files changed +186
-1
lines changed Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ version: "0.2"
22words :
33 - actix
44 - ahash
5+ - arrayvec
56 - bytestring
67 - cbor
78 - clippy
4243 - splitn
4344 - struct
4445 - taplo
46+ - tinyvec
4547 - trybuild
4648 - vals
Original file line number Diff line number Diff 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 ]
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments