summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_data_structures/src/sso
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:20:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:20:39 +0000
commit1376c5a617be5c25655d0d7cb63e3beaa5a6e026 (patch)
tree3bb8d61aee02bc7a15eab3f36e3b921afc2075d0 /compiler/rustc_data_structures/src/sso
parentReleasing progress-linux version 1.69.0+dfsg1-1~progress7.99u1. (diff)
downloadrustc-1376c5a617be5c25655d0d7cb63e3beaa5a6e026.tar.xz
rustc-1376c5a617be5c25655d0d7cb63e3beaa5a6e026.zip
Merging upstream version 1.70.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_data_structures/src/sso')
-rw-r--r--compiler/rustc_data_structures/src/sso/either_iter.rs73
-rw-r--r--compiler/rustc_data_structures/src/sso/map.rs70
-rw-r--r--compiler/rustc_data_structures/src/sso/mod.rs1
3 files changed, 35 insertions, 109 deletions
diff --git a/compiler/rustc_data_structures/src/sso/either_iter.rs b/compiler/rustc_data_structures/src/sso/either_iter.rs
deleted file mode 100644
index bca6c0955..000000000
--- a/compiler/rustc_data_structures/src/sso/either_iter.rs
+++ /dev/null
@@ -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),
- }
- }
-}
diff --git a/compiler/rustc_data_structures/src/sso/map.rs b/compiler/rustc_data_structures/src/sso/map.rs
index 7cdac5819..89b8c8526 100644
--- a/compiler/rustc_data_structures/src/sso/map.rs
+++ b/compiler/rustc_data_structures/src/sso/map.rs
@@ -1,24 +1,24 @@
-use super::either_iter::EitherIter;
use crate::fx::FxHashMap;
use arrayvec::ArrayVec;
+use itertools::Either;
use std::fmt;
use std::hash::Hash;
use std::ops::Index;
-// For pointer-sized arguments arrays
-// are faster than set/map for up to 64
-// arguments.
-//
-// On the other hand such a big array
-// hurts cache performance, makes passing
-// sso structures around very expensive.
-//
-// Biggest performance benefit is gained
-// for reasonably small arrays that stay
-// small in vast majority of cases.
-//
-// '8' is chosen as a sane default, to be
-// reevaluated later.
+/// For pointer-sized arguments arrays
+/// are faster than set/map for up to 64
+/// arguments.
+///
+/// On the other hand such a big array
+/// hurts cache performance, makes passing
+/// sso structures around very expensive.
+///
+/// Biggest performance benefit is gained
+/// for reasonably small arrays that stay
+/// small in vast majority of cases.
+///
+/// '8' is chosen as a sane default, to be
+/// reevaluated later.
const SSO_ARRAY_SIZE: usize = 8;
/// Small-storage-optimized implementation of a map.
@@ -138,8 +138,8 @@ impl<K, V> SsoHashMap<K, V> {
/// The iterator element type is `&'a K`.
pub fn keys(&self) -> impl Iterator<Item = &'_ K> {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.iter().map(|(k, _v)| k)),
- SsoHashMap::Map(map) => EitherIter::Right(map.keys()),
+ SsoHashMap::Array(array) => Either::Left(array.iter().map(|(k, _v)| k)),
+ SsoHashMap::Map(map) => Either::Right(map.keys()),
}
}
@@ -147,8 +147,8 @@ impl<K, V> SsoHashMap<K, V> {
/// The iterator element type is `&'a V`.
pub fn values(&self) -> impl Iterator<Item = &'_ V> {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.iter().map(|(_k, v)| v)),
- SsoHashMap::Map(map) => EitherIter::Right(map.values()),
+ SsoHashMap::Array(array) => Either::Left(array.iter().map(|(_k, v)| v)),
+ 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`.
pub fn values_mut(&mut self) -> impl Iterator<Item = &'_ mut V> {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.iter_mut().map(|(_k, v)| v)),
- SsoHashMap::Map(map) => EitherIter::Right(map.values_mut()),
+ SsoHashMap::Array(array) => Either::Left(array.iter_mut().map(|(_k, v)| v)),
+ SsoHashMap::Map(map) => Either::Right(map.values_mut()),
}
}
@@ -165,8 +165,8 @@ impl<K, V> SsoHashMap<K, V> {
/// allocated memory for reuse.
pub fn drain(&mut self) -> impl Iterator<Item = (K, V)> + '_ {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.drain(..)),
- SsoHashMap::Map(map) => EitherIter::Right(map.drain()),
+ SsoHashMap::Array(array) => Either::Left(array.drain(..)),
+ SsoHashMap::Map(map) => Either::Right(map.drain()),
}
}
}
@@ -406,16 +406,16 @@ where
}
impl<K, V> IntoIterator for SsoHashMap<K, V> {
- type IntoIter = EitherIter<
- <ArrayVec<(K, V), 8> as IntoIterator>::IntoIter,
+ type IntoIter = Either<
+ <ArrayVec<(K, V), SSO_ARRAY_SIZE> as IntoIterator>::IntoIter,
<FxHashMap<K, V> as IntoIterator>::IntoIter,
>;
type Item = <Self::IntoIter as Iterator>::Item;
fn into_iter(self) -> Self::IntoIter {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.into_iter()),
- SsoHashMap::Map(map) => EitherIter::Right(map.into_iter()),
+ SsoHashMap::Array(array) => Either::Left(array.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> {
- type IntoIter = EitherIter<
+ type IntoIter = Either<
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),
>,
<&'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 {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.into_iter().map(adapt_array_ref_it)),
- SsoHashMap::Map(map) => EitherIter::Right(map.iter()),
+ SsoHashMap::Array(array) => Either::Left(array.into_iter().map(adapt_array_ref_it)),
+ SsoHashMap::Map(map) => Either::Right(map.iter()),
}
}
}
impl<'a, K, V> IntoIterator for &'a mut SsoHashMap<K, V> {
- type IntoIter = EitherIter<
+ type IntoIter = Either<
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),
>,
<&'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 {
match self {
- SsoHashMap::Array(array) => EitherIter::Left(array.into_iter().map(adapt_array_mut_it)),
- SsoHashMap::Map(map) => EitherIter::Right(map.iter_mut()),
+ SsoHashMap::Array(array) => Either::Left(array.into_iter().map(adapt_array_mut_it)),
+ SsoHashMap::Map(map) => Either::Right(map.iter_mut()),
}
}
}
diff --git a/compiler/rustc_data_structures/src/sso/mod.rs b/compiler/rustc_data_structures/src/sso/mod.rs
index dd21bc8e6..ef634b9ad 100644
--- a/compiler/rustc_data_structures/src/sso/mod.rs
+++ b/compiler/rustc_data_structures/src/sso/mod.rs
@@ -1,4 +1,3 @@
-mod either_iter;
mod map;
mod set;