From f1d73f4feb966fa4423052143fd6f63e29cda5a2 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 25 Nov 2018 09:16:48 +0100 Subject: [PATCH 1/6] FEAT: Add array sizes 33 to 128 and 129 to 255 under feature flags This way we cover all users up to 256 at least. The reason these are not enabled by default is that they slow down the compilation of the crate by a factor of 2-3x. --- Cargo.toml | 3 +++ src/array.rs | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dd5e968..5c3b7a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,9 @@ std = [] use_union = [] serde-1 = ["serde"] +array-sizes-33-128 = [] +array-sizes-129-255 = [] + [package.metadata.docs.rs] features = ["serde-1"] diff --git a/src/array.rs b/src/array.rs index 2ca90b3..be93f0f 100644 --- a/src/array.rs +++ b/src/array.rs @@ -77,15 +77,44 @@ macro_rules! fix_array_impl { macro_rules! fix_array_impl_recursive { ($index_type:ty, ) => (); - ($index_type:ty, $len:expr, $($more:expr,)*) => ( - fix_array_impl!($index_type, $len); - fix_array_impl_recursive!($index_type, $($more,)*); + ($index_type:ty, $($len:expr,)*) => ( + $(fix_array_impl!($index_type, $len);)* ); } -fix_array_impl_recursive!(u8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 40, 48, 50, 56, 64, 72, 96, 100, 128, 160, 192, 200, 224,); +fix_array_impl_recursive!(u8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, ); + +#[cfg(not(feature="array-sizes-33-128"))] +fix_array_impl_recursive!(u8, 32, 40, 48, 50, 56, 64, 72, 96, 100, 128, ); + +#[cfg(feature="array-sizes-33-128")] +fix_array_impl_recursive!(u8, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, +52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, +72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, +92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, +109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, +125, 126, 127, 128, +); + +#[cfg(not(feature="array-sizes-129-255"))] +fix_array_impl_recursive!(u8, 160, 192, 200, 224,); + +#[cfg(feature="array-sizes-129-255")] +fix_array_impl_recursive!(u8, +129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, +141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, +157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, +173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, +189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, +205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, +221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, +237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, +253, 254, 255, +); + fix_array_impl_recursive!(u16, 256, 384, 512, 768, 1024, 2048, 4096, 8192, 16384, 32768,); // This array size doesn't exist on 16-bit #[cfg(any(target_pointer_width="32", target_pointer_width="64"))] From 50728e4cda9e2bc22e73c1c57a8565ebee6017a9 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 25 Nov 2018 09:23:04 +0100 Subject: [PATCH 2/6] DOC: Add doc for additional array features flags --- src/array.rs | 12 ++++++++++++ src/lib.rs | 3 +++ 2 files changed, 15 insertions(+) diff --git a/src/array.rs b/src/array.rs index be93f0f..5fcc9c5 100644 --- a/src/array.rs +++ b/src/array.rs @@ -1,5 +1,17 @@ /// Trait for fixed size arrays. +/// +/// This trait is implemented for some specific array sizes, see +/// the implementor list below. At the current state of Rust we can't +/// make this fully general for every array size. +/// +/// The following crate features add more array sizes (and they are not +/// enabled by default due to their impact on compliation speed). +/// +/// - `array-sizes-33-128`: All sizes 33 to 128 are implemented +/// (a few in this range are included by default). +/// - `array-sizes-129-255`: All sizes 129 to 255 are implemented +/// (a few in this range are included by default). pub unsafe trait Array { /// The array’s element type type Item; diff --git a/src/lib.rs b/src/lib.rs index 8f08401..50903c5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,9 @@ //! - `serde-1` //! - Optional //! - Enable serialization for ArrayVec and ArrayString using serde 1.0 +//! - `array-sizes-33-128`, `array-sizes-129-255` +//! - Optional +//! - Enable more array sizes (see [Array] for more information) //! //! ## Rust Version //! From 4dc503e17d7024b30958aa20b5555b1a8142e89f Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 25 Nov 2018 09:25:30 +0100 Subject: [PATCH 3/6] MAINT: Add array sizes to travis build --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index d62112c..e3afc19 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,9 @@ matrix: env: - NODEFAULT=1 - NODROP_FEATURES='use_needs_drop' + - rust: stable + env: + - FEATURES='array-sizes-33-128 array-sizes-129-255' - rust: beta - rust: nightly env: From 9d1ede62eaf17a1b551f452db495f1014aa811e4 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 25 Nov 2018 09:26:01 +0100 Subject: [PATCH 4/6] MAINT: Add Rust 1.22 to travis build --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index e3afc19..1feee2d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,9 @@ matrix: env: - NODEFAULT=1 - NODROP_FEATURES='use_needs_drop' + - rust: 1.22.1 + env: + - FEATURES='array-sizes-33-128 array-sizes-129-255' - rust: stable env: - FEATURES='array-sizes-33-128 array-sizes-129-255' From e355c9eb314360aaa47afc71b1f15b4e9590d2c4 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 25 Nov 2018 09:32:29 +0100 Subject: [PATCH 5/6] DOC: Hide Array methods on impls These just clutter up the docs. Most important that the users can see the list of implemented array sizes, not the methods for each of those. --- src/array.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/array.rs b/src/array.rs index 5fcc9c5..4f099a6 100644 --- a/src/array.rs +++ b/src/array.rs @@ -77,10 +77,13 @@ macro_rules! fix_array_impl { unsafe impl Array for [T; $len] { type Item = T; type Index = $index_type; + #[doc(hidden)] #[inline(always)] fn as_ptr(&self) -> *const T { self as *const _ as *const _ } + #[doc(hidden)] #[inline(always)] fn as_mut_ptr(&mut self) -> *mut T { self as *mut _ as *mut _} + #[doc(hidden)] #[inline(always)] fn capacity() -> usize { $len } } From d77b93079fd735e0976f3c24d816f62edf599c13 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 25 Nov 2018 09:36:22 +0100 Subject: [PATCH 6/6] TEST: Add minimal tests for new array sizes --- tests/tests.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/tests.rs b/tests/tests.rs index 7580eab..3261df3 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -485,3 +485,18 @@ fn test_default() { assert_eq!(s.len(), 0); assert_eq!(v.len(), 0); } + +#[cfg(feature="array-sizes-33-128")] +#[test] +fn test_sizes_33_128() { + ArrayVec::from([0u8; 52]); + ArrayVec::from([0u8; 127]); +} + +#[cfg(feature="array-sizes-129-255")] +#[test] +fn test_sizes_129_255() { + ArrayVec::from([0u8; 237]); + ArrayVec::from([0u8; 255]); +} +