unc_sdk/collections/unordered_map/
iter.rs

1use super::UnorderedMap;
2use crate::collections::vector;
3use borsh::{BorshDeserialize, BorshSerialize};
4use std::iter::FusedIterator;
5
6impl<'a, K, V> IntoIterator for &'a UnorderedMap<K, V>
7where
8    K: BorshSerialize + BorshDeserialize,
9    V: BorshSerialize + BorshDeserialize,
10{
11    type Item = (K, V);
12    type IntoIter = Iter<'a, K, V>;
13
14    fn into_iter(self) -> Self::IntoIter {
15        self.iter()
16    }
17}
18
19/// An iterator over each element deserialized in the [`UnorderedMap`].
20pub struct Iter<'a, K, V> {
21    keys: vector::Iter<'a, K>,
22    values: vector::Iter<'a, V>,
23}
24
25impl<'a, K, V> Iter<'a, K, V>
26where
27    K: BorshSerialize + BorshDeserialize,
28    V: BorshSerialize + BorshDeserialize,
29{
30    pub(super) fn new(map: &'a UnorderedMap<K, V>) -> Self {
31        Self { keys: map.keys.iter(), values: map.values.iter() }
32    }
33}
34
35impl<'a, K, V> Iterator for Iter<'a, K, V>
36where
37    K: BorshSerialize + BorshDeserialize,
38    V: BorshSerialize + BorshDeserialize,
39{
40    type Item = (K, V);
41
42    fn next(&mut self) -> Option<Self::Item> {
43        <Self as Iterator>::nth(self, 0)
44    }
45
46    fn nth(&mut self, n: usize) -> Option<Self::Item> {
47        Some((self.keys.nth(n)?, self.values.nth(n)?))
48    }
49
50    fn size_hint(&self) -> (usize, Option<usize>) {
51        self.keys.size_hint()
52    }
53
54    fn count(self) -> usize {
55        self.keys.count()
56    }
57}
58
59impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V>
60where
61    K: BorshSerialize + BorshDeserialize,
62    V: BorshSerialize + BorshDeserialize,
63{
64}
65impl<'a, K, V> FusedIterator for Iter<'a, K, V>
66where
67    K: BorshSerialize + BorshDeserialize,
68    V: BorshSerialize + BorshDeserialize,
69{
70}
71
72impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V>
73where
74    K: BorshSerialize + BorshDeserialize,
75    V: BorshSerialize + BorshDeserialize,
76{
77    fn next_back(&mut self) -> Option<Self::Item> {
78        <Self as DoubleEndedIterator>::nth_back(self, 0)
79    }
80
81    fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
82        Some((self.keys.nth_back(n)?, self.values.nth_back(n)?))
83    }
84}