From 525fc8ebc39f3f7ac5adcb0862ca54716ec5b575 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 14 Jun 2022 11:42:52 +0200 Subject: [PATCH] Implement `Deref` for `BoundedSlice` (#11660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Impl Deref for BoundedSlice Signed-off-by: Oliver Tale-Yazdi * Update primitives/runtime/src/bounded/bounded_vec.rs Co-authored-by: Keith Yeung Co-authored-by: Bastian Köcher Co-authored-by: Keith Yeung --- .../runtime/src/bounded/bounded_vec.rs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/substrate/primitives/runtime/src/bounded/bounded_vec.rs b/substrate/primitives/runtime/src/bounded/bounded_vec.rs index 555a34819a..c9c9f851d3 100644 --- a/substrate/primitives/runtime/src/bounded/bounded_vec.rs +++ b/substrate/primitives/runtime/src/bounded/bounded_vec.rs @@ -223,6 +223,15 @@ impl<'a, T, S> Clone for BoundedSlice<'a, T, S> { // Since a reference `&T` is always `Copy`, so is `BoundedSlice<'a, T, S>`. impl<'a, T, S> Copy for BoundedSlice<'a, T, S> {} +// will allow for all immutable operations of `[T]` on `BoundedSlice`. +impl<'a, T, S> Deref for BoundedSlice<'a, T, S> { + type Target = [T]; + + fn deref(&self) -> &Self::Target { + self.0 + } +} + 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>; @@ -647,7 +656,7 @@ impl AsMut<[T]> for BoundedVec { } } -// will allow for immutable all operations of `Vec` on `BoundedVec`. +// will allow for all immutable operations of `Vec` on `BoundedVec`. impl Deref for BoundedVec { type Target = Vec; @@ -970,7 +979,7 @@ pub mod test { } #[test] - fn deref_coercion_works() { + fn deref_vec_coercion_works() { let bounded: BoundedVec> = bounded_vec![1, 2, 3]; // these methods come from deref-ed vec. assert_eq!(bounded.len(), 3); @@ -978,6 +987,15 @@ pub mod test { assert!(!bounded.is_empty()); } + #[test] + fn deref_slice_coercion_works() { + let bounded = BoundedSlice::>::try_from(&[1, 2, 3][..]).unwrap(); + // these methods come from deref-ed slice. + assert_eq!(bounded.len(), 3); + assert!(bounded.iter().next().is_some()); + assert!(!bounded.is_empty()); + } + #[test] fn try_mutate_works() { let bounded: BoundedVec> = bounded_vec![1, 2, 3, 4, 5, 6];