1use std::hash::{BuildHasher, Hash};
6
7use ::arbitrary::{size_hint, Arbitrary, Result, Unstructured};
8
9use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector};
10
11impl<'a, A: Arbitrary<'a> + Clone> Arbitrary<'a> for Vector<A> {
12 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
13 u.arbitrary_iter()?.collect()
14 }
15
16 fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
17 u.arbitrary_take_rest_iter()?.collect()
18 }
19
20 fn size_hint(depth: usize) -> (usize, Option<usize>) {
21 size_hint::recursion_guard(depth, |depth| {
22 size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
23 })
24 }
25}
26
27impl<'a, K: Arbitrary<'a> + Ord + Clone, V: Arbitrary<'a> + Clone> Arbitrary<'a> for OrdMap<K, V> {
28 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
29 u.arbitrary_iter()?.collect()
30 }
31
32 fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
33 u.arbitrary_take_rest_iter()?.collect()
34 }
35
36 fn size_hint(depth: usize) -> (usize, Option<usize>) {
37 size_hint::recursion_guard(depth, |depth| {
38 size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
39 })
40 }
41}
42
43impl<'a, A: Arbitrary<'a> + Ord + Clone> Arbitrary<'a> for OrdSet<A> {
44 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
45 u.arbitrary_iter()?.collect()
46 }
47
48 fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
49 u.arbitrary_take_rest_iter()?.collect()
50 }
51
52 fn size_hint(depth: usize) -> (usize, Option<usize>) {
53 size_hint::recursion_guard(depth, |depth| {
54 size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
55 })
56 }
57}
58
59impl<'a, K, V, S> Arbitrary<'a> for HashMap<K, V, S>
60where
61 K: Arbitrary<'a> + Hash + Eq + Clone,
62 V: Arbitrary<'a> + Clone,
63 S: BuildHasher + Default + 'static,
64{
65 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
66 u.arbitrary_iter()?.collect()
67 }
68
69 fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
70 u.arbitrary_take_rest_iter()?.collect()
71 }
72
73 fn size_hint(depth: usize) -> (usize, Option<usize>) {
74 size_hint::recursion_guard(depth, |depth| {
75 size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
76 })
77 }
78}
79
80impl<'a, A, S> Arbitrary<'a> for HashSet<A, S>
81where
82 A: Arbitrary<'a> + Hash + Eq + Clone,
83 S: BuildHasher + Default + 'static,
84{
85 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
86 u.arbitrary_iter()?.collect()
87 }
88
89 fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
90 u.arbitrary_take_rest_iter()?.collect()
91 }
92
93 fn size_hint(depth: usize) -> (usize, Option<usize>) {
94 size_hint::recursion_guard(depth, |depth| {
95 size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
96 })
97 }
98}