Skip to content

Commit

Permalink
Fix Arbitrary implementation on ArrayVec (#180)
Browse files Browse the repository at this point in the history
- No longer needs to be guarded behind any feature.
- Can generate non full ArrayVecs.
- Implements size_hint.
  • Loading branch information
e00E committed Feb 23, 2023
1 parent 48c004d commit 350cf62
Showing 1 changed file with 20 additions and 10 deletions.
30 changes: 20 additions & 10 deletions src/arrayvec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<A>
where
T: arbitrary::Arbitrary<'a> + Default,
A: Array,
A::Item: arbitrary::Arbitrary<'a>,
{
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
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::<u16>(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<usize>) {
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))
})
}
}

Expand Down

0 comments on commit 350cf62

Please sign in to comment.