From 0e3918d9fe1a558db5d8f66d2f04c8fcfdd508b5 Mon Sep 17 00:00:00 2001 From: Keith Yeung <kungfukeith11@gmail.com> Date: Tue, 7 Jun 2022 15:32:30 +0100 Subject: [PATCH] Implement more IntoIter traits for bounded types (#11616) --- .../support/src/storage/bounded_btree_map.rs | 18 ++++++++++++++ .../support/src/storage/bounded_btree_set.rs | 9 +++++++ .../frame/support/src/storage/bounded_vec.rs | 24 +++++++++++++++++++ .../support/src/storage/weak_bounded_vec.rs | 16 +++++++++++++ 4 files changed, 67 insertions(+) diff --git a/substrate/frame/support/src/storage/bounded_btree_map.rs b/substrate/frame/support/src/storage/bounded_btree_map.rs index 390330457b9..fd086f1fb23 100644 --- a/substrate/frame/support/src/storage/bounded_btree_map.rs +++ b/substrate/frame/support/src/storage/bounded_btree_map.rs @@ -252,6 +252,24 @@ impl<K, V, S> IntoIterator for BoundedBTreeMap<K, V, S> { } } +impl<'a, K, V, S> IntoIterator for &'a BoundedBTreeMap<K, V, S> { + type Item = (&'a K, &'a V); + type IntoIter = sp_std::collections::btree_map::Iter<'a, K, V>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a, K, V, S> IntoIterator for &'a mut BoundedBTreeMap<K, V, S> { + type Item = (&'a K, &'a mut V); + type IntoIter = sp_std::collections::btree_map::IterMut<'a, K, V>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} + impl<K, V, S> MaxEncodedLen for BoundedBTreeMap<K, V, S> where K: MaxEncodedLen, diff --git a/substrate/frame/support/src/storage/bounded_btree_set.rs b/substrate/frame/support/src/storage/bounded_btree_set.rs index 275bb07c627..77e1c6f1c96 100644 --- a/substrate/frame/support/src/storage/bounded_btree_set.rs +++ b/substrate/frame/support/src/storage/bounded_btree_set.rs @@ -230,6 +230,15 @@ impl<T, S> IntoIterator for BoundedBTreeSet<T, S> { } } +impl<'a, T, S> IntoIterator for &'a BoundedBTreeSet<T, S> { + type Item = &'a T; + type IntoIter = sp_std::collections::btree_set::Iter<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + impl<T, S> MaxEncodedLen for BoundedBTreeSet<T, S> where T: MaxEncodedLen, diff --git a/substrate/frame/support/src/storage/bounded_vec.rs b/substrate/frame/support/src/storage/bounded_vec.rs index 232f9f97fc6..82ae36a82bf 100644 --- a/substrate/frame/support/src/storage/bounded_vec.rs +++ b/substrate/frame/support/src/storage/bounded_vec.rs @@ -149,6 +149,14 @@ impl<'a, T, S> From<BoundedSlice<'a, T, S>> for &'a [T] { } } +impl<'a, T, S> sp_std::iter::IntoIterator for BoundedSlice<'a, T, S> { + type Item = &'a T; + type IntoIter = sp_std::slice::Iter<'a, T>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + impl<T: Decode, S: Get<u32>> Decode for BoundedVec<T, S> { fn decode<I: codec::Input>(input: &mut I) -> Result<Self, codec::Error> { let inner = Vec::<T>::decode(input)?; @@ -605,6 +613,22 @@ impl<T, S> sp_std::iter::IntoIterator for BoundedVec<T, S> { } } +impl<'a, T, S> sp_std::iter::IntoIterator for &'a BoundedVec<T, S> { + type Item = &'a T; + type IntoIter = sp_std::slice::Iter<'a, T>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a, T, S> sp_std::iter::IntoIterator for &'a mut BoundedVec<T, S> { + type Item = &'a mut T; + type IntoIter = sp_std::slice::IterMut<'a, T>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} + impl<T, S> codec::DecodeLength for BoundedVec<T, S> { fn len(self_encoded: &[u8]) -> Result<usize, codec::Error> { // `BoundedVec<T, _>` stored just a `Vec<T>`, thus the length is at the beginning in diff --git a/substrate/frame/support/src/storage/weak_bounded_vec.rs b/substrate/frame/support/src/storage/weak_bounded_vec.rs index 8d1d38374d8..bf9b9a10172 100644 --- a/substrate/frame/support/src/storage/weak_bounded_vec.rs +++ b/substrate/frame/support/src/storage/weak_bounded_vec.rs @@ -262,6 +262,22 @@ impl<T, S> sp_std::iter::IntoIterator for WeakBoundedVec<T, S> { } } +impl<'a, T, S> sp_std::iter::IntoIterator for &'a WeakBoundedVec<T, S> { + type Item = &'a T; + type IntoIter = sp_std::slice::Iter<'a, T>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a, T, S> sp_std::iter::IntoIterator for &'a mut WeakBoundedVec<T, S> { + type Item = &'a mut T; + type IntoIter = sp_std::slice::IterMut<'a, T>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} + impl<T, S> codec::DecodeLength for WeakBoundedVec<T, S> { fn len(self_encoded: &[u8]) -> Result<usize, codec::Error> { // `WeakBoundedVec<T, _>` stored just a `Vec<T>`, thus the length is at the beginning in -- GitLab