unc_sdk/collections/unordered_map/
iter.rs1use 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
19pub 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}