Skip to content

Commit e98a6a0

Browse files
committed
Support generic-array as arrayvec backend
1 parent 1089e16 commit e98a6a0

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ version = "0.1.8"
1919
path = "nodrop"
2020
default-features = false
2121

22+
[dependencies.generic-array]
23+
version = "0.5"
24+
optional = true
25+
2226
[features]
2327
default = ["std"]
2428
std = ["odds/std", "nodrop/std"]

src/array.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,24 @@ pub trait Index : PartialEq + Copy {
1919
fn from(usize) -> Self;
2020
}
2121

22+
#[cfg(feature = "generic-array")]
23+
unsafe impl<T, U> Array for ::generic_array::GenericArray<T, U>
24+
where U: ::generic_array::ArrayLength<T>
25+
{
26+
type Item = T;
27+
type Index = usize;
28+
fn as_ptr(&self) -> *const Self::Item {
29+
(**self).as_ptr()
30+
}
31+
fn as_mut_ptr(&mut self) -> *mut Self::Item {
32+
(**self).as_mut_ptr()
33+
}
34+
fn capacity() -> usize {
35+
U::to_usize()
36+
}
37+
38+
}
39+
2240
impl Index for u8 {
2341
#[inline(always)]
2442
fn to_usize(self) -> usize { self as usize }
@@ -33,6 +51,13 @@ impl Index for u16 {
3351
fn from(ix: usize) -> Self { ix as u16 }
3452
}
3553

54+
impl Index for usize {
55+
#[inline(always)]
56+
fn to_usize(self) -> usize { self }
57+
#[inline(always)]
58+
fn from(ix: usize) -> Self { ix }
59+
}
60+
3661
macro_rules! fix_array_impl {
3762
($index_type:ty, $len:expr ) => (
3863
unsafe impl<T> Array for [T; $len] {

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
extern crate odds;
1919
extern crate nodrop;
2020

21+
#[cfg(feature = "generic-array")]
22+
extern crate generic_array;
23+
2124
#[cfg(not(feature="std"))]
2225
extern crate core as std;
2326

tests/generic_array.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#![cfg(feature = "generic-array")]
2+
3+
extern crate arrayvec;
4+
#[macro_use]
5+
extern crate generic_array;
6+
7+
use arrayvec::ArrayVec;
8+
9+
use generic_array::GenericArray;
10+
11+
use generic_array::typenum::U41;
12+
13+
#[test]
14+
fn test_simple() {
15+
let mut vec: ArrayVec<GenericArray<i32, U41>> = ArrayVec::new();
16+
17+
assert_eq!(vec.len(), 0);
18+
assert_eq!(vec.capacity(), 41);
19+
vec.extend(0..20);
20+
assert_eq!(vec.len(), 20);
21+
assert_eq!(&vec[..5], &[0, 1, 2, 3, 4]);
22+
}
23+

0 commit comments

Comments
 (0)