From 77cf2608c883a26c6d2dfa081d465979e3ddeae7 Mon Sep 17 00:00:00 2001 From: "Shahar \"Dawn\" Or" Date: Sun, 27 Aug 2023 22:28:50 +0700 Subject: [PATCH] build: resolve clippy problems Co-authored-by: warren2k <846021+warren2k@users.noreply.github.com> --- benches/bench1.rs | 10 +++++++- benches/extra/zipslices.rs | 2 ++ benches/fold_specialization.rs | 2 ++ examples/iris.rs | 4 +-- src/adaptors/mod.rs | 2 +- src/adaptors/multi_product.rs | 2 +- src/combinations.rs | 7 +++-- src/lib.rs | 5 ++-- src/permutations.rs | 4 +-- src/powerset.rs | 4 +-- src/tuple_impl.rs | 2 +- src/unique_impl.rs | 4 +-- tests/quick.rs | 23 ++++++++--------- tests/test_core.rs | 2 +- tests/test_std.rs | 47 +++++++++++++++++----------------- 15 files changed, 68 insertions(+), 52 deletions(-) diff --git a/benches/bench1.rs b/benches/bench1.rs index 71278d17b..c7bde372e 100644 --- a/benches/bench1.rs +++ b/benches/bench1.rs @@ -475,6 +475,8 @@ fn merge_default(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -503,6 +505,8 @@ fn merge_by_cmp(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -531,6 +535,8 @@ fn merge_by_lt(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -559,6 +565,8 @@ fn kmerge_default(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -600,7 +608,7 @@ fn kmerge_tenway(c: &mut Criterion) { let mut chunks = Vec::new(); let mut rest = &mut data[..]; - while rest.len() > 0 { + while !rest.is_empty() { let chunk_len = 1 + rng(&mut state) % 512; let chunk_len = cmp::min(rest.len(), chunk_len as usize); let (fst, tail) = {rest}.split_at_mut(chunk_len); diff --git a/benches/extra/zipslices.rs b/benches/extra/zipslices.rs index 633be5906..19b535f5c 100644 --- a/benches/extra/zipslices.rs +++ b/benches/extra/zipslices.rs @@ -137,6 +137,8 @@ unsafe impl Slice for ZipSlices /// A helper trait to let `ZipSlices` accept both `&[T]` and `&mut [T]`. /// +/// # Safety +/// /// Unsafe trait because: /// /// - Implementors must guarantee that `get_unchecked` is valid for all indices `0..len()`. diff --git a/benches/fold_specialization.rs b/benches/fold_specialization.rs index 6000880f8..cf96b74f2 100644 --- a/benches/fold_specialization.rs +++ b/benches/fold_specialization.rs @@ -50,6 +50,7 @@ mod specialization { c.bench_function("internal specialized", move |b| { b.iter(|| { + #[allow(clippy::unnecessary_fold)] arr.iter().intersperse_wrap(&0).fold(0, |acc, x| acc + x) }) }); @@ -61,6 +62,7 @@ mod specialization { c.bench_function("internal unspecialized", move |b| { b.iter(|| { + #[allow(clippy::unnecessary_fold)] Unspecialized(arr.iter().intersperse_wrap(&0)).fold(0, |acc, x| acc + x) }) }); diff --git a/examples/iris.rs b/examples/iris.rs index 987d9e9cb..07cb396c2 100644 --- a/examples/iris.rs +++ b/examples/iris.rs @@ -10,7 +10,7 @@ use std::iter::repeat; use std::num::ParseFloatError; use std::str::FromStr; -static DATA: &'static str = include_str!("iris.data"); +static DATA: &str = include_str!("iris.data"); #[derive(Clone, Debug)] struct Iris { @@ -36,7 +36,7 @@ impl FromStr for Iris { fn from_str(s: &str) -> Result { let mut iris = Iris { name: "".into(), data: [0.; 4] }; - let mut parts = s.split(",").map(str::trim); + let mut parts = s.split(',').map(str::trim); // using Iterator::by_ref() for (index, part) in parts.by_ref().take(4).enumerate() { diff --git a/src/adaptors/mod.rs b/src/adaptors/mod.rs index a02c6b6e0..829d3ccfa 100644 --- a/src/adaptors/mod.rs +++ b/src/adaptors/mod.rs @@ -891,7 +891,7 @@ impl Iterator for Positions type Item = usize; fn next(&mut self) -> Option { - while let Some(v) = self.iter.next() { + for v in self.iter.by_ref() { let i = self.count; self.count = i + 1; if (self.f)(v) { diff --git a/src/adaptors/multi_product.rs b/src/adaptors/multi_product.rs index 0b3840698..73abc1b94 100644 --- a/src/adaptors/multi_product.rs +++ b/src/adaptors/multi_product.rs @@ -205,7 +205,7 @@ impl Iterator for MultiProduct self.0.iter().fold( (0, Some(0)), - |acc, &MultiProductIter { ref iter, ref iter_orig, cur: _ }| { + |acc, MultiProductIter { iter, iter_orig, cur: _ }| { let cur_size = iter.size_hint(); let total_size = iter_orig.size_hint(); size_hint::add(size_hint::mul(acc, total_size), cur_size) diff --git a/src/combinations.rs b/src/combinations.rs index 4b0742a0d..f7bde0396 100644 --- a/src/combinations.rs +++ b/src/combinations.rs @@ -211,8 +211,11 @@ fn remaining_for(n: usize, first: bool, indices: &[usize]) -> Option { // TODO: Once the MSRV hits 1.37.0, we can sum options instead: // .map(|(i, n0)| checked_binomial(n - 1 - *n0, k - i)) // .sum() - .fold(Some(0), |sum, (i, n0)| { - sum.and_then(|s| s.checked_add(checked_binomial(n - 1 - *n0, k - i)?)) + // .fold(Some(0), |sum, (i, n0)| { + // sum.and_then(|s| s.checked_add(checked_binomial(n - 1 - *n0, k - i)?)) + // }) + .try_fold(0usize, |sum, (i, n0)| { + sum.checked_add(checked_binomial(n - 1 - *n0, k - i)?) }) } } diff --git a/src/lib.rs b/src/lib.rs index 79b4f481d..f716fd9e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1006,7 +1006,7 @@ pub trait Itertools : Iterator { J: IntoIterator, F: FnMut(&Self::Item, &Self::Item) -> bool { - merge_join::merge_by_new(self, other.into_iter(), is_first) + merge_join::merge_by_new(self, other, is_first) } /// Create an iterator that merges items from both this and the specified @@ -2011,6 +2011,7 @@ pub trait Itertools : Iterator { /// let data : Option = None; /// assert_eq!(data.into_iter().all_equal_value(), Err(None)); /// ``` + #[allow(clippy::type_complexity)] fn all_equal_value(&mut self) -> Result> where Self: Sized, @@ -3908,7 +3909,7 @@ pub fn assert_equal(a: I, b: J) (None, None) => return, (a, b) => { let equal = match (&a, &b) { - (&Some(ref a), &Some(ref b)) => a == b, + (Some(a), Some(b)) => a == b, _ => false, }; assert!(equal, "Failed assertion {a:?} == {b:?} for iteration {i}", diff --git a/src/permutations.rs b/src/permutations.rs index a8885a411..2fb7eb374 100644 --- a/src/permutations.rs +++ b/src/permutations.rs @@ -247,8 +247,8 @@ impl CompleteState { return Known(0); } - let count: Option = (n - k + 1..n + 1).fold(Some(1), |acc, i| { - acc.and_then(|acc| acc.checked_mul(i)) + let count: Option = (n - k + 1..n + 1).try_fold(1usize, |acc, i| { + acc.checked_mul(i) }); match count { diff --git a/src/powerset.rs b/src/powerset.rs index f84cecfbd..9f0965bc5 100644 --- a/src/powerset.rs +++ b/src/powerset.rs @@ -82,7 +82,7 @@ impl FusedIterator for Powerset {} fn remaining_for(n: usize, k: usize) -> Option { - (k + 1..=n).fold(Some(0), |sum, i| { - sum.and_then(|s| s.checked_add(checked_binomial(n, i)?)) + (k + 1..=n).try_fold(0usize, |sum, i| { + sum.checked_add(checked_binomial(n, i)?) }) } diff --git a/src/tuple_impl.rs b/src/tuple_impl.rs index fdf086585..b79d65d66 100644 --- a/src/tuple_impl.rs +++ b/src/tuple_impl.rs @@ -63,7 +63,7 @@ impl Iterator for TupleBuffer } else { buffer.iter() .position(|x| x.is_none()) - .unwrap_or_else(|| buffer.len()) + .unwrap_or(buffer.len()) }; (len, Some(len)) } diff --git a/src/unique_impl.rs b/src/unique_impl.rs index 4e81e78ec..d71b24a70 100644 --- a/src/unique_impl.rs +++ b/src/unique_impl.rs @@ -57,7 +57,7 @@ impl Iterator for UniqueBy type Item = I::Item; fn next(&mut self) -> Option { - while let Some(v) = self.iter.next() { + for v in self.iter.by_ref() { let key = (self.f)(&v); if self.used.insert(key, ()).is_none() { return Some(v); @@ -107,7 +107,7 @@ impl Iterator for Unique type Item = I::Item; fn next(&mut self) -> Option { - while let Some(v) = self.iter.iter.next() { + for v in self.iter.iter.by_ref() { if let Entry::Vacant(entry) = self.iter.used.entry(v) { let elt = entry.key().clone(); entry.insert(()); diff --git a/tests/quick.rs b/tests/quick.rs index d9382738a..e6dbc0304 100644 --- a/tests/quick.rs +++ b/tests/quick.rs @@ -817,9 +817,8 @@ quickcheck! { quickcheck! { fn size_put_back(a: Vec, x: Option) -> bool { let mut it = put_back(a.into_iter()); - match x { - Some(t) => it.put_back(t), - None => {} + if let Some(t) = x { + it.put_back(t) } correct_size_hint(it) } @@ -918,7 +917,7 @@ quickcheck! { } } } - cmb.next() == None + cmb.next().is_none() } } @@ -1205,7 +1204,7 @@ struct Val(u32, u32); impl PartialOrd for Val { fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + Some(self.cmp(other)) } } @@ -1308,7 +1307,7 @@ quickcheck! { fn at_most_one_i32(a: Vec) -> TestResult { let ret = a.iter().cloned().at_most_one(); match a.len() { - 0 => TestResult::from_bool(ret.unwrap() == None), + 0 => TestResult::from_bool(ret.unwrap().is_none()), 1 => TestResult::from_bool(ret.unwrap() == Some(a[0])), _ => TestResult::from_bool(ret.unwrap_err().eq(a.iter().cloned())), } @@ -1338,7 +1337,7 @@ quickcheck! { Some(acc.unwrap_or(0) + val) } }); - + let group_map_lookup = a.iter() .map(|&b| b as u64) .map(|i| (i % modulo, i)) @@ -1358,7 +1357,7 @@ quickcheck! { for m in 0..modulo { assert_eq!( - lookup.get(&m).copied(), + lookup.get(&m).copied(), a.iter() .map(|&b| b as u64) .filter(|&val| val % modulo == m) @@ -1478,7 +1477,7 @@ quickcheck! { assert_eq!(Some(max), a.iter().copied().filter(|&val| val % modulo == key).max_by_key(|&val| val)); } } - + fn correct_grouping_map_by_min_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).min(); @@ -1529,7 +1528,7 @@ quickcheck! { assert_eq!(Some(min), a.iter().copied().filter(|&val| val % modulo == key).min_by_key(|&val| val)); } } - + fn correct_grouping_map_by_minmax_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).minmax(); @@ -1642,7 +1641,7 @@ quickcheck! { .min_by(|_, _, _| Ordering::Equal); assert_eq!(lookup[&0], 0); - + let lookup = (0..=10) .into_grouping_map_by(|_| 0) .minmax_by(|_, _, _| Ordering::Equal); @@ -1746,7 +1745,7 @@ quickcheck! { !is_fused(a.clone().interleave_shortest(b.clone())) && is_fused(a.fuse().interleave_shortest(b.fuse())) } - + fn fused_product(a: Iter, b: Iter) -> bool { is_fused(a.fuse().cartesian_product(b.fuse())) diff --git a/tests/test_core.rs b/tests/test_core.rs index addd42400..6c967eeff 100644 --- a/tests/test_core.rs +++ b/tests/test_core.rs @@ -30,7 +30,7 @@ fn product2() { assert!(prod.next() == Some(('α', 1))); assert!(prod.next() == Some(('β', 0))); assert!(prod.next() == Some(('β', 1))); - assert!(prod.next() == None); + assert!(prod.next().is_none()); } #[test] diff --git a/tests/test_std.rs b/tests/test_std.rs index 42320f5ee..56c3c075a 100644 --- a/tests/test_std.rs +++ b/tests/test_std.rs @@ -39,19 +39,19 @@ fn product3() { fn interleave_shortest() { let v0: Vec = vec![0, 2, 4]; let v1: Vec = vec![1, 3, 5, 7]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); + let it = v0.into_iter().interleave_shortest(v1); assert_eq!(it.size_hint(), (6, Some(6))); assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5]); let v0: Vec = vec![0, 2, 4, 6, 8]; let v1: Vec = vec![1, 3, 5]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); + let it = v0.into_iter().interleave_shortest(v1); assert_eq!(it.size_hint(), (7, Some(7))); assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5, 6]); let i0 = ::std::iter::repeat(0); let v1: Vec<_> = vec![1, 3, 5]; - let it = i0.interleave_shortest(v1.into_iter()); + let it = i0.interleave_shortest(v1); assert_eq!(it.size_hint(), (7, Some(7))); let v0: Vec<_> = vec![0, 2, 4]; @@ -86,7 +86,7 @@ fn duplicates() { let ys_rev = [1, 0]; it::assert_equal(ys_rev.iter(), xs.iter().duplicates().rev()); - let xs = vec![0, 1, 2, 1, 2]; + let xs = [0, 1, 2, 1, 2]; let ys = vec![1, 2]; assert_eq!(ys, xs.iter().duplicates().cloned().collect_vec()); assert_eq!(ys, xs.iter().rev().duplicates().rev().cloned().collect_vec()); @@ -130,7 +130,7 @@ fn intersperse() { let ys = [0, 1, 2, 3]; let mut it = ys[..0].iter().copied().intersperse_wrap(1); - assert!(it.next() == None); + assert!(it.next().is_none()); } #[test] @@ -151,7 +151,7 @@ fn dedup() { #[test] fn coalesce() { - let data = vec![-1., -2., -3., 3., 1., 0., -1.]; + let data = [-1., -2., -3., 3., 1., 0., -1.]; let it = data.iter().cloned().coalesce(|x, y| if (x >= 0.) == (y >= 0.) { Ok(x + y) @@ -340,8 +340,8 @@ fn trait_pointers() { #[test] fn merge_by() { let odd : Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; - let even = vec![(2, "foo"), (4, "bar"), (6, "baz")]; - let expected = vec![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")]; + let even = [(2, "foo"), (4, "bar"), (6, "baz")]; + let expected = [(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")]; let results = odd.iter().merge_by(even.iter(), |a, b| a.0 <= b.0); it::assert_equal(results, expected.iter()); } @@ -355,9 +355,9 @@ fn merge_by_btree() { let mut bt2 = BTreeMap::new(); bt2.insert("foo", 2); bt2.insert("bar", 4); - let results = bt1.into_iter().merge_by(bt2.into_iter(), |a, b| a.0 <= b.0 ); + let results = bt1.into_iter().merge_by(bt2, |a, b| a.0 <= b.0 ); let expected = vec![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)]; - it::assert_equal(results, expected.into_iter()); + it::assert_equal(results, expected); } #[allow(deprecated)] @@ -594,7 +594,7 @@ fn test_multipeek_reset() { #[test] fn test_multipeek_peeking_next() { use crate::it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; + let nums = [1u8,2,3,4,5,6,7]; let mut mp = multipeek(nums.iter().copied()); assert_eq!(mp.peeking_next(|&x| x != 0), Some(1)); @@ -654,7 +654,7 @@ fn test_peek_nth() { #[test] fn test_peek_nth_peeking_next() { use it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; + let nums = [1u8,2,3,4,5,6,7]; let mut iter = peek_nth(nums.iter().copied()); assert_eq!(iter.peeking_next(|&x| x != 0), Some(1)); @@ -773,12 +773,12 @@ fn group_by() { #[test] fn group_by_lazy_2() { - let data = vec![0, 1]; + let data = [0, 1]; let groups = data.iter().group_by(|k| *k); let gs = groups.into_iter().collect_vec(); it::assert_equal(data.iter(), gs.into_iter().flat_map(|(_k, g)| g)); - let data = vec![0, 1, 1, 0, 0]; + let data = [0, 1, 1, 0, 0]; let groups = data.iter().group_by(|k| *k); let mut gs = groups.into_iter().collect_vec(); gs[1..].reverse(); @@ -793,7 +793,7 @@ fn group_by_lazy_2() { } it::assert_equal(&mut groups[0], &[1, 1]); - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let grouper = data.iter().group_by(|k| *k); let mut groups = Vec::new(); for (i, (_, group)) in grouper.into_iter().enumerate() { @@ -811,7 +811,7 @@ fn group_by_lazy_2() { it::assert_equal(&mut groups[2], &[3, 3]); // use groups as chunks - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let mut i = 0; let grouper = data.iter().group_by(move |_| { let k = i / 3; i += 1; k }); for (i, group) in &grouper { @@ -828,7 +828,7 @@ fn group_by_lazy_2() { #[test] fn group_by_lazy_3() { // test consuming each group on the lap after it was produced - let data = vec![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; + let data = [0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; let grouper = data.iter().group_by(|elt| *elt); let mut last = None; for (key, group) in &grouper { @@ -843,7 +843,7 @@ fn group_by_lazy_3() { #[test] fn chunks() { - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let grouper = data.iter().chunks(3); for (i, chunk) in grouper.into_iter().enumerate() { match i { @@ -1058,7 +1058,7 @@ fn powerset() { #[test] fn diff_mismatch() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 5.0, 3.0, 4.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -1072,7 +1072,7 @@ fn diff_mismatch() { #[test] fn diff_longer() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -1086,7 +1086,7 @@ fn diff_longer() { #[test] fn diff_shorter() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 2.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -1108,7 +1108,7 @@ fn extrema_set() { impl PartialOrd for Val { fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + Some(self.cmp(other)) } } @@ -1157,7 +1157,7 @@ fn minmax() { impl PartialOrd for Val { fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + Some(self.cmp(other)) } } @@ -1270,6 +1270,7 @@ fn multiunzip() { let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)].iter().cloned().multiunzip(); assert_eq!((a, b, c), (vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8])); let (): () = [(), (), ()].iter().cloned().multiunzip(); + #[allow(clippy::type_complexity)] let t: (Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)].iter().cloned().multiunzip(); assert_eq!(t, (vec![0], vec![1], vec![2], vec![3], vec![4], vec![5], vec![6], vec![7], vec![8], vec![9], vec![10], vec![11])); }