Skip to content

Commit

Permalink
Use 16-bit lengths on 16-bit targets
Browse files Browse the repository at this point in the history
  • Loading branch information
kornelski authored and tbu- committed Oct 17, 2024
1 parent 4ef0e89 commit 812c83a
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 11 deletions.
4 changes: 2 additions & 2 deletions src/array_string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ use serde::{Serialize, Deserialize, Serializer, Deserializer};
/// The `ArrayString` is a string backed by a fixed size array. It keeps track
/// of its length, and is parameterized by `CAP` for the maximum capacity.
///
/// `CAP` is of type `usize` but is range limited to `u32::MAX`; attempting to create larger
/// arrayvecs with larger capacity will panic.
/// `CAP` is of type `usize` but is range limited to `u32::MAX` (or `u16` on 16-bit targets);
/// attempting to create larger arrayvecs with larger capacity will panic.
///
/// The string is a contiguous value that you can store directly on the stack
/// if needed.
Expand Down
4 changes: 2 additions & 2 deletions src/arrayvec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ use crate::utils::MakeMaybeUninit;
/// the number of initialized elements. The `ArrayVec<T, CAP>` is parameterized
/// by `T` for the element type and `CAP` for the maximum capacity.
///
/// `CAP` is of type `usize` but is range limited to `u32::MAX`; attempting to create larger
/// arrayvecs with larger capacity will panic.
/// `CAP` is of type `usize` but is range limited to `u32::MAX` (or `u16::MAX` on 16-bit targets);
/// attempting to create larger arrayvecs with larger capacity will panic.
///
/// The vector is a contiguous value (storing the elements inline) that you can store directly on
/// the stack if needed.
Expand Down
9 changes: 8 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,20 @@ extern crate serde;
#[cfg(not(feature="std"))]
extern crate core as std;

#[cfg(not(target_pointer_width = "16"))]
pub(crate) type LenUint = u32;

#[cfg(target_pointer_width = "16")]
pub(crate) type LenUint = u16;

macro_rules! assert_capacity_limit {
($cap:expr) => {
if std::mem::size_of::<usize>() > std::mem::size_of::<LenUint>() {
if $cap > LenUint::MAX as usize {
panic!("ArrayVec: largest supported capacity is u32::MAX")
#[cfg(not(target_pointer_width = "16"))]
panic!("ArrayVec: largest supported capacity is u32::MAX");
#[cfg(target_pointer_width = "16")]
panic!("ArrayVec: largest supported capacity is u16::MAX");
}
}
}
Expand Down
9 changes: 3 additions & 6 deletions tests/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,7 @@ fn test_pop_at() {
}

#[test]
#[cfg(not(target_pointer_width = "16"))]
fn test_sizes() {
let v = ArrayVec::from([0u8; 1 << 16]);
assert_eq!(vec![0u8; v.len()], &v[..]);
Expand Down Expand Up @@ -729,21 +730,17 @@ fn allow_max_capacity_arrayvec_type() {
}

#[should_panic(expected="largest supported capacity")]
#[cfg(not(target_pointer_width = "16"))]
#[test]
fn deny_max_capacity_arrayvec_value() {
if mem::size_of::<usize>() <= mem::size_of::<u32>() {
panic!("This test does not work on this platform. 'largest supported capacity'");
}
// this type is allowed to be used (but can't be constructed)
let _v: ArrayVec<(), {usize::MAX}> = ArrayVec::new();
}

#[should_panic(expected="index out of bounds")]
#[cfg(not(target_pointer_width = "16"))]
#[test]
fn deny_max_capacity_arrayvec_value_const() {
if mem::size_of::<usize>() <= mem::size_of::<u32>() {
panic!("This test does not work on this platform. 'index out of bounds'");
}
// this type is allowed to be used (but can't be constructed)
let _v: ArrayVec<(), {usize::MAX}> = ArrayVec::new_const();
}
Expand Down

0 comments on commit 812c83a

Please sign in to comment.