diff --git a/src/arrayvec.rs b/src/arrayvec.rs index fada9b6..1cfbf3f 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -218,19 +218,29 @@ where } } -#[cfg(all(feature = "arbitrary", feature = "nightly_const_generics"))] -#[cfg_attr( - docs_rs, - doc(cfg(all(feature = "arbitrary", feature = "nightly_const_generics"))) -)] -impl<'a, T, const N: usize> arbitrary::Arbitrary<'a> for ArrayVec<[T; N]> +#[cfg(feature = "arbitrary")] +#[cfg_attr(docs_rs, doc(cfg(feature = "arbitrary")))] +impl<'a, A> arbitrary::Arbitrary<'a> for ArrayVec where - T: arbitrary::Arbitrary<'a> + Default, + A: Array, + A::Item: arbitrary::Arbitrary<'a>, { fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - let v = <[T; N]>::arbitrary(u)?; - let av = ArrayVec::from(v); - Ok(av) + let max_len = A::CAPACITY.min(u16::MAX as usize) as u16; + let len = u.int_in_range::(0..=max_len)?; + let mut self_: Self = Default::default(); + for _ in 0..len { + self_.push(u.arbitrary()?); + } + Ok(self_) + } + + fn size_hint(depth: usize) -> (usize, Option) { + arbitrary::size_hint::recursion_guard(depth, |depth| { + let max_len = A::CAPACITY.min(u16::MAX as usize); + let inner = A::Item::size_hint(depth).1; + (0, inner.map(|inner| 2 + max_len * inner)) + }) } }