1 #[cfg(feature = "arbitrary")]
2 mod impl_arbitrary {
3     use crate::{IndexMap, IndexSet};
4     use arbitrary::{Arbitrary, Result, Unstructured};
5     use core::hash::{BuildHasher, Hash};
6 
7     impl<'a, K, V, S> Arbitrary<'a> for IndexMap<K, V, S>
8     where
9         K: Arbitrary<'a> + Hash + Eq,
10         V: Arbitrary<'a>,
11         S: BuildHasher + Default,
12     {
arbitrary(u: &mut Unstructured<'a>) -> Result<Self>13         fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
14             u.arbitrary_iter()?.collect()
15         }
16 
arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self>17         fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
18             u.arbitrary_take_rest_iter()?.collect()
19         }
20     }
21 
22     impl<'a, T, S> Arbitrary<'a> for IndexSet<T, S>
23     where
24         T: Arbitrary<'a> + Hash + Eq,
25         S: BuildHasher + Default,
26     {
arbitrary(u: &mut Unstructured<'a>) -> Result<Self>27         fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
28             u.arbitrary_iter()?.collect()
29         }
30 
arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self>31         fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
32             u.arbitrary_take_rest_iter()?.collect()
33         }
34     }
35 }
36 
37 #[cfg(feature = "quickcheck")]
38 mod impl_quickcheck {
39     use crate::{IndexMap, IndexSet};
40     use alloc::boxed::Box;
41     use alloc::vec::Vec;
42     use core::hash::{BuildHasher, Hash};
43     use quickcheck::{Arbitrary, Gen};
44 
45     impl<K, V, S> Arbitrary for IndexMap<K, V, S>
46     where
47         K: Arbitrary + Hash + Eq,
48         V: Arbitrary,
49         S: BuildHasher + Default + Clone + 'static,
50     {
arbitrary(g: &mut Gen) -> Self51         fn arbitrary(g: &mut Gen) -> Self {
52             Self::from_iter(Vec::arbitrary(g))
53         }
54 
shrink(&self) -> Box<dyn Iterator<Item = Self>>55         fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
56             let vec = Vec::from_iter(self.clone());
57             Box::new(vec.shrink().map(Self::from_iter))
58         }
59     }
60 
61     impl<T, S> Arbitrary for IndexSet<T, S>
62     where
63         T: Arbitrary + Hash + Eq,
64         S: BuildHasher + Default + Clone + 'static,
65     {
arbitrary(g: &mut Gen) -> Self66         fn arbitrary(g: &mut Gen) -> Self {
67             Self::from_iter(Vec::arbitrary(g))
68         }
69 
shrink(&self) -> Box<dyn Iterator<Item = Self>>70         fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
71             let vec = Vec::from_iter(self.clone());
72             Box::new(vec.shrink().map(Self::from_iter))
73         }
74     }
75 }
76