Use itertools::Either
instead of own EitherIter
impl
This commit is contained in:
parent
d4be8efc62
commit
0465201f77
5 changed files with 20 additions and 92 deletions
|
@ -4575,6 +4575,7 @@ dependencies = [
|
||||||
"elsa",
|
"elsa",
|
||||||
"ena",
|
"ena",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
|
"itertools",
|
||||||
"jobserver",
|
"jobserver",
|
||||||
"libc",
|
"libc",
|
||||||
"measureme",
|
"measureme",
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
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;
|
||||||
|
@ -138,8 +138,8 @@ impl<K, V> SsoHashMap<K, 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 @@ impl<K, V> SsoHashMap<K, V> {
|
||||||
/// 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 @@ impl<K, V> SsoHashMap<K, 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 @@ impl<K, V> SsoHashMap<K, 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,7 +406,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
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), 8> as IntoIterator>::IntoIter,
|
||||||
<FxHashMap<K, V> as IntoIterator>::IntoIter,
|
<FxHashMap<K, V> as IntoIterator>::IntoIter,
|
||||||
>;
|
>;
|
||||||
|
@ -414,8 +414,8 @@ impl<K, V> IntoIterator for 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()),
|
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,7 +435,7 @@ 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), 8> as IntoIterator>::IntoIter,
|
||||||
fn(&'a (K, V)) -> (&'a K, &'a V),
|
fn(&'a (K, V)) -> (&'a K, &'a V),
|
||||||
|
@ -446,14 +446,14 @@ 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), 8> as IntoIterator>::IntoIter,
|
||||||
fn(&'a mut (K, V)) -> (&'a K, &'a mut V),
|
fn(&'a mut (K, V)) -> (&'a K, &'a mut V),
|
||||||
|
@ -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()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
mod either_iter;
|
|
||||||
mod map;
|
mod map;
|
||||||
mod set;
|
mod set;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue