im_rc/
arbitrary.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use 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}