use std::collections::hash_map;
use std::slice;
use std::hash::Hash;
use std::cmp::Eq;
use std::ops::DerefMut;
use std::fmt::{self, Debug};
use std::iter::{Iterator, ExactSizeIterator};
use stable_deref_trait::StableDeref;
use super::TotalOrderMultiMap;
impl<K, V> TotalOrderMultiMap<K, V>
where K: Hash+Eq+Copy,
V: StableDeref + DerefMut
{
pub fn keys(&self) -> Keys<K, V::Target> {
Keys { inner_iter: self.map_access.keys() }
}
pub fn group_iter(&self) -> GroupedValues<K, V::Target> {
GroupedValues { inner_iter: self.map_access.iter() }
}
pub fn group_iter_mut(&mut self) -> GroupedValuesMut<K, V::Target> {
GroupedValuesMut { inner_iter: self.map_access.iter_mut() }
}
pub fn values(&self) -> Values<K, V> {
Values { inner_iter: self.vec_data.iter() }
}
pub fn values_mut(&mut self) -> ValuesMut<K, V> {
ValuesMut { inner_iter: self.vec_data.iter_mut() }
}
}
#[derive(Clone)]
pub struct Keys<'a, K: 'a, T: ?Sized + 'a> {
inner_iter: hash_map::Keys<'a, K, Vec<*mut T>>
}
impl<'a, K: Debug+'a, T: 'a> Debug for Keys<'a, K, T> {
fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
self.inner_iter.fmt(fter)
}
}
impl<'a, K: 'a, T: 'a> Iterator for Keys<'a, K, T>
where K: Copy
{
type Item = K;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next().map(|&k|k)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner_iter.size_hint()
}
}
impl<'a, K, T> ExactSizeIterator for Keys<'a, K, T>
where K: Copy + 'a, T: 'a
{
#[inline]
fn len(&self) -> usize {
self.inner_iter.len()
}
}
pub struct Group<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
inner_iter: slice::Iter<'a, *mut T>,
key: K
}
impl<'a, K, T> Clone for Group<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
fn clone(&self) -> Self {
Group {
key: self.key.clone(),
inner_iter: self.inner_iter.clone(),
}
}
}
impl<'a, K, T> Group<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
pub fn key(&self) -> K {
self.key
}
}
impl<'a, K, T> Iterator for Group<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a
{
type Item = &'a T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next().map(|&ptr| unsafe { &*ptr } )
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner_iter.size_hint()
}
}
pub struct GroupMut<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
inner_iter: slice::IterMut<'a, *mut T>,
key: K
}
impl<'a, K, T> GroupMut<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
pub fn key(&self) -> K {
self.key
}
}
impl<'a, K, T> Iterator for GroupMut<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a
{
type Item = &'a mut T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next().map(|&mut ptr| unsafe { &mut *ptr } )
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner_iter.size_hint()
}
}
impl<'a, K, T> ExactSizeIterator for GroupMut<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
#[inline]
fn len(&self) -> usize {
self.inner_iter.len()
}
}
impl<'a, K, T> Debug for Group<'a, K, T>
where K: Debug + Copy + 'a,
T: Debug + ?Sized + 'a,
{
fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
fter.write_str("Group { .. }")
}
}
pub struct GroupedValues<
'a,
K: Copy + 'a,
T: ?Sized + 'a,
> {
inner_iter: hash_map::Iter<'a, K, Vec<*mut T>>
}
impl<'a, K, T> Clone for GroupedValues<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
#[inline]
fn clone(&self) -> Self {
GroupedValues { inner_iter: self.inner_iter.clone() }
}
}
impl<'a, K, T> Debug for GroupedValues<'a, K, T>
where K: Copy + 'a,
T: Debug + ?Sized + 'a,
{
fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
fter.debug_list()
.entry(&self.clone())
.finish()
}
}
impl<'a, K, T> Iterator for GroupedValues<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
type Item = Group<'a, K, T>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next().map(|(k, values)| {
Group {
inner_iter: values.iter(),
key: *k,
}
})
}
}
pub struct GroupedValuesMut<
'a,
K: Copy + 'a,
T: ?Sized + 'a,
> {
inner_iter: hash_map::IterMut<'a, K, Vec<*mut T>>
}
impl<'a, K, T> Debug for GroupedValuesMut<'a, K, T>
where K: Copy + 'a,
T: Debug + ?Sized + 'a,
{
fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
fter.write_str("GroupedValuesMut { .. }")
}
}
impl<'a, K, T> Iterator for GroupedValuesMut<'a, K, T>
where K: Copy + 'a,
T: ?Sized + 'a,
{
type Item = GroupMut<'a, K, T>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next().map(|(k, values)| {
GroupMut {
inner_iter: values.iter_mut(),
key: *k,
}
})
}
}
pub struct Values<'a, K: 'a, V: 'a> {
inner_iter: slice::Iter<'a, (K, V)>
}
pub struct ValuesMut<'a, K: 'a, V: 'a> {
inner_iter: slice::IterMut<'a, (K, V)>
}
impl<'a, K: 'a, V: 'a> From<ValuesMut<'a, K, V>> for Values<'a, K, V> {
fn from(valsmut: ValuesMut<'a, K, V>) -> Self {
let ValuesMut { inner_iter } = valsmut;
let as_slice = inner_iter.into_slice();
let inner_iter = as_slice.iter();
Values { inner_iter }
}
}
impl<'a, K: 'a, V: 'a> Clone for Values<'a, K, V> {
fn clone(&self) -> Self {
Values { inner_iter: self.inner_iter.clone() }
}
}
impl<'a, K: 'a, V: 'a> Iterator for Values<'a, K, V>
where V: StableDeref + DerefMut
{
type Item = &'a V::Target;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next()
.map(|&(_, ref v)| &**v)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner_iter.size_hint()
}
}
impl<'a, K: 'a, V: 'a> ExactSizeIterator for Values<'a, K, V>
where V: StableDeref + DerefMut
{
fn len(&self) -> usize {
self.inner_iter.len()
}
}
impl<'a, K: 'a, V: 'a> Debug for Values<'a, K, V>
where V: StableDeref + DerefMut, V::Target: Debug
{
fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
fter.debug_list().entries(self.clone()).finish()
}
}
impl<'a, K: 'a, V: 'a> Iterator for ValuesMut<'a, K, V>
where V: StableDeref + DerefMut
{
type Item = &'a mut V::Target;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner_iter.next().map(|&mut (_, ref mut v)| {
&mut **v
})
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner_iter.size_hint()
}
}
impl<'a, K: 'a, V: 'a> ExactSizeIterator for ValuesMut<'a, K, V>
where V: StableDeref + DerefMut
{
fn len(&self) -> usize {
self.inner_iter.len()
}
}
impl<'a, K: 'a, V: 'a> Debug for ValuesMut<'a, K, V>
where V: StableDeref + DerefMut, V::Target: Debug
{
fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
fter.write_str("ValuesMut { .. }")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn convert_mut_values_to_non_mut() {
let mut map = TotalOrderMultiMap::new();
map.add("k1", "v1".to_owned());
map.add("k0", "v2".to_owned());
let iter: Values<_, _> = map.values_mut().into();
assert_eq!(
vec!["v1", "v2"],
iter.collect::<Vec<_>>()
)
}
}