use alloc::vec::{self, Vec}; use core::fmt; use core::hash::{BuildHasher, Hash}; use core::iter::FusedIterator; use core::ops::{Index, RangeBounds}; use core::slice;
impl<'a, K, V, S> IntoIterator for &'a IndexMap<K, V, S> { type Item = (&'a K, &'a V); type IntoIter = Iter<'a, K, V>;
/// An iterator over the entries of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::iter`] method. /// See its documentation for more. pubstruct Iter<'a, K, V> {
iter: slice::Iter<'a, Bucket<K, V>>,
}
/// A mutable iterator over the entries of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::iter_mut`] method. /// See its documentation for more. pubstruct IterMut<'a, K, V> {
iter: slice::IterMut<'a, Bucket<K, V>>,
}
/// Returns a slice of the remaining entries in the iterator. pubfn as_slice(&self) -> &Slice<K, V> {
Slice::from_slice(self.iter.as_slice())
}
/// Returns a mutable slice of the remaining entries in the iterator. /// /// To avoid creating `&mut` references that alias, this is forced to consume the iterator. pubfn into_slice(self) -> &'a mut Slice<K, V> {
Slice::from_mut_slice(self.iter.into_slice())
}
}
impl<'a, K, V> Iterator for IterMut<'a, K, V> { type Item = (&'a K, &'a mut V);
iterator_methods!(Bucket::ref_mut);
}
impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> {
double_ended_iterator_methods!(Bucket::ref_mut);
}
/// An owning iterator over the entries of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::into_iter`] method /// (provided by the [`IntoIterator`] trait). See its documentation for more. pubstruct IntoIter<K, V> {
iter: vec::IntoIter<Bucket<K, V>>,
}
/// Returns a slice of the remaining entries in the iterator. pubfn as_slice(&self) -> &Slice<K, V> {
Slice::from_slice(self.iter.as_slice())
}
/// Returns a mutable slice of the remaining entries in the iterator. pubfn as_mut_slice(&mutself) -> &mut Slice<K, V> {
Slice::from_mut_slice(self.iter.as_mut_slice())
}
}
impl<K, V> Iterator for IntoIter<K, V> { type Item = (K, V);
iterator_methods!(Bucket::key_value);
}
impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
double_ended_iterator_methods!(Bucket::key_value);
}
/// A draining iterator over the entries of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::drain`] method. /// See its documentation for more. pubstruct Drain<'a, K, V> {
iter: vec::Drain<'a, Bucket<K, V>>,
}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Drain<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let iter = self.iter.as_slice().iter().map(Bucket::refs);
f.debug_list().entries(iter).finish()
}
}
/// An iterator over the keys of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::keys`] method. /// See its documentation for more. pubstruct Keys<'a, K, V> {
iter: slice::Iter<'a, Bucket<K, V>>,
}
/// Access [`IndexMap`] keys at indexed positions. /// /// While [`Index<usize> for IndexMap`][values] accesses a map's values, /// indexing through [`IndexMap::keys`] offers an alternative to access a map's /// keys instead. /// /// [values]: IndexMap#impl-Index<usize>-for-IndexMap<K,+V,+S> /// /// Since `Keys` is also an iterator, consuming items from the iterator will /// offset the effective indexes. Similarly, if `Keys` is obtained from /// [`Slice::keys`], indexes will be interpreted relative to the position of /// that slice. /// /// # Examples /// /// ``` /// use indexmap::IndexMap; /// /// let mut map = IndexMap::new(); /// for word in "Lorem ipsum dolor sit amet".split_whitespace() { /// map.insert(word.to_lowercase(), word.to_uppercase()); /// } /// /// assert_eq!(map[0], "LOREM"); /// assert_eq!(map.keys()[0], "lorem"); /// assert_eq!(map[1], "IPSUM"); /// assert_eq!(map.keys()[1], "ipsum"); /// /// map.reverse(); /// assert_eq!(map.keys()[0], "amet"); /// assert_eq!(map.keys()[1], "sit"); /// /// map.sort_keys(); /// assert_eq!(map.keys()[0], "amet"); /// assert_eq!(map.keys()[1], "dolor"); /// /// // Advancing the iterator will offset the indexing /// let mut keys = map.keys(); /// assert_eq!(keys[0], "amet"); /// assert_eq!(keys.next().map(|s| &**s), Some("amet")); /// assert_eq!(keys[0], "dolor"); /// assert_eq!(keys[1], "ipsum"); /// /// // Slices may have an offset as well /// let slice = &map[2..]; /// assert_eq!(slice[0], "IPSUM"); /// assert_eq!(slice.keys()[0], "ipsum"); /// ``` /// /// ```should_panic /// use indexmap::IndexMap; /// /// let mut map = IndexMap::new(); /// map.insert("foo", 1); /// println!("{:?}", map.keys()[10]); // panics! /// ``` impl<'a, K, V> Index<usize> for Keys<'a, K, V> { type Output = K;
/// Returns a reference to the key at the supplied `index`. /// /// ***Panics*** if `index` is out of bounds. fn index(&self, index: usize) -> &K {
&self.iter.as_slice()[index].key
}
}
/// An owning iterator over the keys of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::into_keys`] method. /// See its documentation for more. pubstruct IntoKeys<K, V> {
iter: vec::IntoIter<Bucket<K, V>>,
}
/// An iterator over the values of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::values`] method. /// See its documentation for more. pubstruct Values<'a, K, V> {
iter: slice::Iter<'a, Bucket<K, V>>,
}
/// A mutable iterator over the values of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::values_mut`] method. /// See its documentation for more. pubstruct ValuesMut<'a, K, V> {
iter: slice::IterMut<'a, Bucket<K, V>>,
}
/// An owning iterator over the values of an [`IndexMap`]. /// /// This `struct` is created by the [`IndexMap::into_values`] method. /// See its documentation for more. pubstruct IntoValues<K, V> {
iter: vec::IntoIter<Bucket<K, V>>,
}
/// A splicing iterator for `IndexMap`. /// /// This `struct` is created by [`IndexMap::splice()`]. /// See its documentation for more. pubstruct Splice<'a, I, K, V, S> where
I: Iterator<Item = (K, V)>,
K: Hash + Eq,
S: BuildHasher,
{
map: &'a mut IndexMap<K, V, S>,
tail: IndexMapCore<K, V>,
drain: vec::IntoIter<Bucket<K, V>>,
replace_with: I,
}
impl<I, K, V, S> Drop for Splice<'_, I, K, V, S> where
I: Iterator<Item = (K, V)>,
K: Hash + Eq,
S: BuildHasher,
{ fn drop(&mutself) { // Finish draining unconsumed items. We don't strictly *have* to do this // manually, since we already split it into separate memory, but it will // match the drop order of `vec::Splice` items this way. let _ = self.drain.nth(usize::MAX);
// Now insert all the new items. If a key matches an existing entry, it // keeps the original position and only replaces the value, like `insert`. whilelet Some((key, value)) = self.replace_with.next() { // Since the tail is disjoint, we can try to update it first, // or else insert (update or append) the primary map. let hash = self.map.hash(&key); iflet Some(i) = self.tail.get_index_of(hash, &key) { self.tail.as_entries_mut()[i].value = value;
} else { self.map.core.insert_full(hash, key, value);
}
}
// Finally, re-append the tail self.map.core.append_unchecked(&mutself.tail);
}
}
impl<I, K, V, S> Iterator for Splice<'_, I, K, V, S> where
I: Iterator<Item = (K, V)>,
K: Hash + Eq,
S: BuildHasher,
{ type Item = (K, V);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.