diff options
Diffstat (limited to 'vendor/im-rc/src/arbitrary.rs')
-rw-r--r-- | vendor/im-rc/src/arbitrary.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/vendor/im-rc/src/arbitrary.rs b/vendor/im-rc/src/arbitrary.rs new file mode 100644 index 000000000..777a3b36f --- /dev/null +++ b/vendor/im-rc/src/arbitrary.rs @@ -0,0 +1,98 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +use std::hash::{BuildHasher, Hash}; + +use ::arbitrary::{size_hint, Arbitrary, Result, Unstructured}; + +use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector}; + +impl<'a, A: Arbitrary<'a> + Clone> Arbitrary<'a> for Vector<A> { + fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> { + u.arbitrary_iter()?.collect() + } + + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> { + u.arbitrary_take_rest_iter()?.collect() + } + + fn size_hint(depth: usize) -> (usize, Option<usize>) { + size_hint::recursion_guard(depth, |depth| { + size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None)) + }) + } +} + +impl<'a, K: Arbitrary<'a> + Ord + Clone, V: Arbitrary<'a> + Clone> Arbitrary<'a> for OrdMap<K, V> { + fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> { + u.arbitrary_iter()?.collect() + } + + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> { + u.arbitrary_take_rest_iter()?.collect() + } + + fn size_hint(depth: usize) -> (usize, Option<usize>) { + size_hint::recursion_guard(depth, |depth| { + size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None)) + }) + } +} + +impl<'a, A: Arbitrary<'a> + Ord + Clone> Arbitrary<'a> for OrdSet<A> { + fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> { + u.arbitrary_iter()?.collect() + } + + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> { + u.arbitrary_take_rest_iter()?.collect() + } + + fn size_hint(depth: usize) -> (usize, Option<usize>) { + size_hint::recursion_guard(depth, |depth| { + size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None)) + }) + } +} + +impl<'a, K, V, S> Arbitrary<'a> for HashMap<K, V, S> +where + K: Arbitrary<'a> + Hash + Eq + Clone, + V: Arbitrary<'a> + Clone, + S: BuildHasher + Default + 'static, +{ + fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> { + u.arbitrary_iter()?.collect() + } + + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> { + u.arbitrary_take_rest_iter()?.collect() + } + + fn size_hint(depth: usize) -> (usize, Option<usize>) { + size_hint::recursion_guard(depth, |depth| { + size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None)) + }) + } +} + +impl<'a, A, S> Arbitrary<'a> for HashSet<A, S> +where + A: Arbitrary<'a> + Hash + Eq + Clone, + S: BuildHasher + Default + 'static, +{ + fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> { + u.arbitrary_iter()?.collect() + } + + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> { + u.arbitrary_take_rest_iter()?.collect() + } + + fn size_hint(depth: usize) -> (usize, Option<usize>) { + size_hint::recursion_guard(depth, |depth| { + size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None)) + }) + } +} |