Skip to content

Commit

Permalink
#10 Values, ValuesMut and IntoValues.
Browse files Browse the repository at this point in the history
  • Loading branch information
Zefick committed May 3, 2023
1 parent 53e6d93 commit e88a33f
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/lib.rs
Expand Up @@ -57,6 +57,7 @@ mod iterators;
mod map;
#[cfg(feature = "serde")]
mod serialization;
mod values;

use std::mem::MaybeUninit;

Expand Down Expand Up @@ -113,3 +114,18 @@ pub struct IntoIter<K: PartialEq, V, const N: usize> {
pos: usize,
map: Map<K, V, N>,
}

/// An iterator over the values of the [`Map`].
pub struct Values<'a, K: PartialEq, V, const N: usize> {
iter: Iter<'a, K, V, N>,
}

/// Mutable iterator over the values of the [`Map`].
pub struct ValuesMut<'a, K: PartialEq, V> {
iter: IterMut<'a, K, V>,
}

/// Consuming iterator over the values of the [`Map`].
pub struct IntoValues<K: PartialEq, V, const N: usize> {
iter: IntoIter<K, V, N>,
}
112 changes: 112 additions & 0 deletions src/values.rs
@@ -0,0 +1,112 @@
// Copyright (c) 2023 Yegor Bugayenko
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

use crate::{IntoValues, Map, Values, ValuesMut};

impl<K: PartialEq, V, const N: usize> Map<K, V, N> {
/// An iterator visiting all values in arbitrary order.
#[inline]
pub const fn values(&self) -> Values<'_, K, V, N> {
Values { iter: self.iter() }
}

/// An iterator visiting all values mutably in arbitrary order.
#[inline]
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
ValuesMut {
iter: self.iter_mut(),
}
}

/// Consuming iterator visiting all the values in arbitrary order.
#[inline]
pub fn into_values(self) -> IntoValues<K, V, N> {
IntoValues {
iter: self.into_iter(),
}
}
}

impl<'a, K: PartialEq, V, const N: usize> Iterator for Values<'a, K, V, N> {
type Item = &'a V;

#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|p| p.1)
}
}

impl<'a, K: PartialEq, V> Iterator for ValuesMut<'a, K, V> {
type Item = &'a mut V;

#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|p| p.1)
}
}

impl<K: PartialEq, V, const N: usize> Iterator for IntoValues<K, V, N> {
type Item = V;

#[inline]
fn next(&mut self) -> Option<V> {
self.iter.next().map(|p| p.1)
}
}

#[test]
fn iterate_values() {
let mut m: Map<&str, i32, 10> = Map::new();
m.insert("one", 42);
m.insert("two", 16);
assert_eq!(58, m.values().sum());
}

#[test]
fn iterate_values_mut() {
let mut m: Map<&str, i32, 10> = Map::new();
m.insert("one", 42);
m.insert("two", 16);
m.values_mut().for_each(|v| *v *= 2);
assert_eq!(116, m.values().sum());
}

#[test]
fn iterate_values_with_blanks() {
let mut m: Map<&str, i32, 10> = Map::new();
m.insert("one", 1);
m.insert("two", 3);
m.insert("three", 5);
m.remove(&"two");
assert_eq!(m.values().collect::<Vec<_>>(), [&1, &5]);
}

#[test]
fn into_values_drop() {
use std::rc::Rc;
let mut m: Map<i32, Rc<()>, 8> = Map::new();
let v = Rc::new(());
for i in 0..8 {
m.insert(i, Rc::clone(&v));
}
assert_eq!(9, Rc::strong_count(&v));
m.into_values();
assert_eq!(1, Rc::strong_count(&v));
}

0 comments on commit e88a33f

Please sign in to comment.