Merge pull request #41 from bluss/generic-array

Support generic-array as arrayvec backend
This commit is contained in:
bluss
2016-09-28 11:10:32 +02:00
committed by GitHub
5 changed files with 63 additions and 1 deletions
+2 -1
View File
@@ -5,6 +5,7 @@ matrix:
- rust: 1.2.0 - rust: 1.2.0
- rust: stable - rust: stable
env: env:
- FEATURES="use_generic_array"
- NODEFAULT=1 - NODEFAULT=1
- rust: beta - rust: beta
- rust: nightly - rust: nightly
@@ -15,7 +16,7 @@ matrix:
- NODROP_FEATURES='use_needs_drop' - NODROP_FEATURES='use_needs_drop'
- rust: nightly - rust: nightly
env: env:
- FEATURES='use_union' - FEATURES='use_union use_generic_array'
- NODROP_FEATURES='use_union' - NODROP_FEATURES='use_union'
branches: branches:
only: only:
+5
View File
@@ -19,7 +19,12 @@ version = "0.1.8"
path = "nodrop" path = "nodrop"
default-features = false default-features = false
[dependencies.generic-array]
version = "0.5.1"
optional = true
[features] [features]
default = ["std"] default = ["std"]
std = ["odds/std", "nodrop/std"] std = ["odds/std", "nodrop/std"]
use_union = ["nodrop/use_union"] use_union = ["nodrop/use_union"]
use_generic_array = ["generic-array"]
+25
View File
@@ -19,6 +19,24 @@ pub trait Index : PartialEq + Copy {
fn from(usize) -> Self; fn from(usize) -> Self;
} }
#[cfg(feature = "use_generic_array")]
unsafe impl<T, U> Array for ::generic_array::GenericArray<T, U>
where U: ::generic_array::ArrayLength<T>
{
type Item = T;
type Index = usize;
fn as_ptr(&self) -> *const Self::Item {
(**self).as_ptr()
}
fn as_mut_ptr(&mut self) -> *mut Self::Item {
(**self).as_mut_ptr()
}
fn capacity() -> usize {
U::to_usize()
}
}
impl Index for u8 { impl Index for u8 {
#[inline(always)] #[inline(always)]
fn to_usize(self) -> usize { self as usize } fn to_usize(self) -> usize { self as usize }
@@ -33,6 +51,13 @@ impl Index for u16 {
fn from(ix: usize) -> Self { ix as u16 } fn from(ix: usize) -> Self { ix as u16 }
} }
impl Index for usize {
#[inline(always)]
fn to_usize(self) -> usize { self }
#[inline(always)]
fn from(ix: usize) -> Self { ix }
}
macro_rules! fix_array_impl { macro_rules! fix_array_impl {
($index_type:ty, $len:expr ) => ( ($index_type:ty, $len:expr ) => (
unsafe impl<T> Array for [T; $len] { unsafe impl<T> Array for [T; $len] {
+8
View File
@@ -13,10 +13,18 @@
//! - Requires Rust nightly channel //! - Requires Rust nightly channel
//! - Use the unstable feature untagged unions for the internal implementation, //! - Use the unstable feature untagged unions for the internal implementation,
//! which has reduced space overhead //! which has reduced space overhead
//!
//! - `use_generic_array`
//! - Optional
//! - Depend on generic-array and allow using it just like a fixed
//! size array for ArrayVec storage.
#![cfg_attr(not(feature="std"), no_std)] #![cfg_attr(not(feature="std"), no_std)]
extern crate odds; extern crate odds;
extern crate nodrop; extern crate nodrop;
#[cfg(feature = "use_generic_array")]
extern crate generic_array;
#[cfg(not(feature="std"))] #[cfg(not(feature="std"))]
extern crate core as std; extern crate core as std;
+23
View File
@@ -0,0 +1,23 @@
#![cfg(feature = "use_generic_array")]
extern crate arrayvec;
#[macro_use]
extern crate generic_array;
use arrayvec::ArrayVec;
use generic_array::GenericArray;
use generic_array::typenum::U41;
#[test]
fn test_simple() {
let mut vec: ArrayVec<GenericArray<i32, U41>> = ArrayVec::new();
assert_eq!(vec.len(), 0);
assert_eq!(vec.capacity(), 41);
vec.extend(0..20);
assert_eq!(vec.len(), 20);
assert_eq!(&vec[..5], &[0, 1, 2, 3, 4]);
}