2 use bigint_presentation_code_register_allocator::{loc::Loc, loc_set::LocSet};
3 use libfuzzer_sys::fuzz_target;
6 ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Sub, SubAssign},
10 lhs_hash_set: &HashSet<Loc>,
11 rhs_hash_set: &HashSet<Loc>,
12 op: impl Fn(LocSet, LocSet) -> LocSet,
13 expected: impl IntoIterator<Item = Loc>,
15 let lhs = LocSet::from_iter(lhs_hash_set.iter().copied());
16 let rhs = LocSet::from_iter(rhs_hash_set.iter().copied());
17 let result = op(lhs, rhs);
18 let result: Vec<Loc> = result.iter().collect();
19 let mut expected = Vec::from_iter(expected);
21 assert_eq!(result, expected);
24 macro_rules! check_all_op_combos {
26 $lhs_hash_set:expr, $rhs_hash_set:expr, $expected:expr,
27 $bin_op:ident::$bin_op_fn:ident(),
28 $bin_assign_op:ident::$bin_assign_op_fn:ident(),
31 $bin_assign_rev_op_fn:ident(),
37 |lhs, rhs| $bin_op::$bin_op_fn(lhs, rhs),
43 |lhs, rhs| $bin_op::$bin_op_fn(&lhs, rhs),
49 |lhs, rhs| $bin_op::$bin_op_fn(lhs, &rhs),
55 |lhs, rhs| $bin_op::$bin_op_fn(&lhs, &rhs),
62 $bin_assign_op::$bin_assign_op_fn(&mut lhs, &rhs);
71 $bin_assign_op::$bin_assign_op_fn(&mut lhs, rhs);
80 rhs.$bin_assign_rev_op_fn(&lhs);
88 fuzz_target!(|data: (HashSet<Loc>, HashSet<Loc>)| {
89 let (lhs_hash_set, rhs_hash_set) = data;
93 lhs_hash_set.intersection(&rhs_hash_set).copied(),
95 BitAndAssign::bitand_assign(),
100 lhs_hash_set.union(&rhs_hash_set).copied(),
102 BitOrAssign::bitor_assign(),
104 check_all_op_combos!(
107 lhs_hash_set.symmetric_difference(&rhs_hash_set).copied(),
109 BitXorAssign::bitxor_assign(),
111 check_all_op_combos!(
114 lhs_hash_set.difference(&rhs_hash_set).copied(),
116 SubAssign::sub_assign(),