Rollup merge of #110182 - WaffleLapkin:neither, r=Nilstrieb

Use `itertools::Either` instead of own impl

Yeah.
This commit is contained in:
Matthias Krüger 2023-04-12 17:04:31 +02:00 committed by GitHub
commit f21d8402ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 109 deletions

View File

@ -4576,6 +4576,7 @@ dependencies = [
"elsa", "elsa",
"ena", "ena",
"indexmap", "indexmap",
"itertools",
"jobserver", "jobserver",
"libc", "libc",
"measureme", "measureme",

View File

@ -33,6 +33,7 @@ tempfile = "3.2"
thin-vec = "0.2.12" thin-vec = "0.2.12"
tracing = "0.1" tracing = "0.1"
elsa = "=1.7.1" elsa = "=1.7.1"
itertools = "0.10.1"
[dependencies.parking_lot] [dependencies.parking_lot]
version = "0.11" version = "0.11"

View File

@ -1,73 +0,0 @@
use std::fmt;
use std::iter::FusedIterator;
/// Iterator which may contain instance of
/// one of two specific implementations.
///
/// Note: For most methods providing custom
/// implementation may marginally
/// improve performance by avoiding
/// doing Left/Right match on every step
/// and doing it only once instead.
#[derive(Clone)]
pub enum EitherIter<L, R> {
Left(L),
Right(R),
}
impl<L, R> Iterator for EitherIter<L, R>
where
L: Iterator,
R: Iterator<Item = L::Item>,
{
type Item = L::Item;
fn next(&mut self) -> Option<Self::Item> {
match self {
EitherIter::Left(l) => l.next(),
EitherIter::Right(r) => r.next(),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
match self {
EitherIter::Left(l) => l.size_hint(),
EitherIter::Right(r) => r.size_hint(),
}
}
}
impl<L, R> ExactSizeIterator for EitherIter<L, R>
where
L: ExactSizeIterator,
R: ExactSizeIterator,
EitherIter<L, R>: Iterator,
{
fn len(&self) -> usize {
match self {
EitherIter::Left(l) => l.len(),
EitherIter::Right(r) => r.len(),
}
}
}
impl<L, R> FusedIterator for EitherIter<L, R>
where
L: FusedIterator,
R: FusedIterator,
EitherIter<L, R>: Iterator,
{
}
impl<L, R> fmt::Debug for EitherIter<L, R>
where
L: fmt::Debug,
R: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
EitherIter::Left(l) => l.fmt(f),
EitherIter::Right(r) => r.fmt(f),
}
}
}

View File

@ -1,24 +1,24 @@
use super::either_iter::EitherIter;
use crate::fx::FxHashMap; use crate::fx::FxHashMap;
use arrayvec::ArrayVec; use arrayvec::ArrayVec;
use itertools::Either;
use std::fmt; use std::fmt;
use std::hash::Hash; use std::hash::Hash;
use std::ops::Index; use std::ops::Index;
// For pointer-sized arguments arrays /// For pointer-sized arguments arrays
// are faster than set/map for up to 64 /// are faster than set/map for up to 64
// arguments. /// arguments.
// ///
// On the other hand such a big array /// On the other hand such a big array
// hurts cache performance, makes passing /// hurts cache performance, makes passing
// sso structures around very expensive. /// sso structures around very expensive.
// ///
// Biggest performance benefit is gained /// Biggest performance benefit is gained
// for reasonably small arrays that stay /// for reasonably small arrays that stay
// small in vast majority of cases. /// small in vast majority of cases.
// ///
// '8' is chosen as a sane default, to be /// '8' is chosen as a sane default, to be
// reevaluated later. /// reevaluated later.
const SSO_ARRAY_SIZE: usize = 8; const SSO_ARRAY_SIZE: usize = 8;
/// Small-storage-optimized implementation of a map. /// Small-storage-optimized implementation of a map.
@ -138,8 +138,8 @@ pub fn iter_mut(&mut self) -> impl Iterator<Item = (&'_ K, &'_ mut V)> {
/// The iterator element type is `&'a K`. /// The iterator element type is `&'a K`.
pub fn keys(&self) -> impl Iterator<Item = &'_ K> { pub fn keys(&self) -> impl Iterator<Item = &'_ K> {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.iter().map(|(k, _v)| k)), SsoHashMap::Array(array) => Either::Left(array.iter().map(|(k, _v)| k)),
SsoHashMap::Map(map) => EitherIter::Right(map.keys()), SsoHashMap::Map(map) => Either::Right(map.keys()),
} }
} }
@ -147,8 +147,8 @@ pub fn keys(&self) -> impl Iterator<Item = &'_ K> {
/// The iterator element type is `&'a V`. /// The iterator element type is `&'a V`.
pub fn values(&self) -> impl Iterator<Item = &'_ V> { pub fn values(&self) -> impl Iterator<Item = &'_ V> {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.iter().map(|(_k, v)| v)), SsoHashMap::Array(array) => Either::Left(array.iter().map(|(_k, v)| v)),
SsoHashMap::Map(map) => EitherIter::Right(map.values()), SsoHashMap::Map(map) => Either::Right(map.values()),
} }
} }
@ -156,8 +156,8 @@ pub fn values(&self) -> impl Iterator<Item = &'_ V> {
/// The iterator element type is `&'a mut V`. /// The iterator element type is `&'a mut V`.
pub fn values_mut(&mut self) -> impl Iterator<Item = &'_ mut V> { pub fn values_mut(&mut self) -> impl Iterator<Item = &'_ mut V> {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.iter_mut().map(|(_k, v)| v)), SsoHashMap::Array(array) => Either::Left(array.iter_mut().map(|(_k, v)| v)),
SsoHashMap::Map(map) => EitherIter::Right(map.values_mut()), SsoHashMap::Map(map) => Either::Right(map.values_mut()),
} }
} }
@ -165,8 +165,8 @@ pub fn values_mut(&mut self) -> impl Iterator<Item = &'_ mut V> {
/// allocated memory for reuse. /// allocated memory for reuse.
pub fn drain(&mut self) -> impl Iterator<Item = (K, V)> + '_ { pub fn drain(&mut self) -> impl Iterator<Item = (K, V)> + '_ {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.drain(..)), SsoHashMap::Array(array) => Either::Left(array.drain(..)),
SsoHashMap::Map(map) => EitherIter::Right(map.drain()), SsoHashMap::Map(map) => Either::Right(map.drain()),
} }
} }
} }
@ -406,16 +406,16 @@ fn extend_reserve(&mut self, additional: usize) {
} }
impl<K, V> IntoIterator for SsoHashMap<K, V> { impl<K, V> IntoIterator for SsoHashMap<K, V> {
type IntoIter = EitherIter< type IntoIter = Either<
<ArrayVec<(K, V), 8> as IntoIterator>::IntoIter, <ArrayVec<(K, V), SSO_ARRAY_SIZE> as IntoIterator>::IntoIter,
<FxHashMap<K, V> as IntoIterator>::IntoIter, <FxHashMap<K, V> as IntoIterator>::IntoIter,
>; >;
type Item = <Self::IntoIter as Iterator>::Item; type Item = <Self::IntoIter as Iterator>::Item;
fn into_iter(self) -> Self::IntoIter { fn into_iter(self) -> Self::IntoIter {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.into_iter()), SsoHashMap::Array(array) => Either::Left(array.into_iter()),
SsoHashMap::Map(map) => EitherIter::Right(map.into_iter()), SsoHashMap::Map(map) => Either::Right(map.into_iter()),
} }
} }
} }
@ -435,9 +435,9 @@ fn adapt_array_mut_it<K, V>(pair: &mut (K, V)) -> (&K, &mut V) {
} }
impl<'a, K, V> IntoIterator for &'a SsoHashMap<K, V> { impl<'a, K, V> IntoIterator for &'a SsoHashMap<K, V> {
type IntoIter = EitherIter< type IntoIter = Either<
std::iter::Map< std::iter::Map<
<&'a ArrayVec<(K, V), 8> as IntoIterator>::IntoIter, <&'a ArrayVec<(K, V), SSO_ARRAY_SIZE> as IntoIterator>::IntoIter,
fn(&'a (K, V)) -> (&'a K, &'a V), fn(&'a (K, V)) -> (&'a K, &'a V),
>, >,
<&'a FxHashMap<K, V> as IntoIterator>::IntoIter, <&'a FxHashMap<K, V> as IntoIterator>::IntoIter,
@ -446,16 +446,16 @@ impl<'a, K, V> IntoIterator for &'a SsoHashMap<K, V> {
fn into_iter(self) -> Self::IntoIter { fn into_iter(self) -> Self::IntoIter {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.into_iter().map(adapt_array_ref_it)), SsoHashMap::Array(array) => Either::Left(array.into_iter().map(adapt_array_ref_it)),
SsoHashMap::Map(map) => EitherIter::Right(map.iter()), SsoHashMap::Map(map) => Either::Right(map.iter()),
} }
} }
} }
impl<'a, K, V> IntoIterator for &'a mut SsoHashMap<K, V> { impl<'a, K, V> IntoIterator for &'a mut SsoHashMap<K, V> {
type IntoIter = EitherIter< type IntoIter = Either<
std::iter::Map< std::iter::Map<
<&'a mut ArrayVec<(K, V), 8> as IntoIterator>::IntoIter, <&'a mut ArrayVec<(K, V), SSO_ARRAY_SIZE> as IntoIterator>::IntoIter,
fn(&'a mut (K, V)) -> (&'a K, &'a mut V), fn(&'a mut (K, V)) -> (&'a K, &'a mut V),
>, >,
<&'a mut FxHashMap<K, V> as IntoIterator>::IntoIter, <&'a mut FxHashMap<K, V> as IntoIterator>::IntoIter,
@ -464,8 +464,8 @@ impl<'a, K, V> IntoIterator for &'a mut SsoHashMap<K, V> {
fn into_iter(self) -> Self::IntoIter { fn into_iter(self) -> Self::IntoIter {
match self { match self {
SsoHashMap::Array(array) => EitherIter::Left(array.into_iter().map(adapt_array_mut_it)), SsoHashMap::Array(array) => Either::Left(array.into_iter().map(adapt_array_mut_it)),
SsoHashMap::Map(map) => EitherIter::Right(map.iter_mut()), SsoHashMap::Map(map) => Either::Right(map.iter_mut()),
} }
} }
} }

View File

@ -1,4 +1,3 @@
mod either_iter;
mod map; mod map;
mod set; mod set;