From 0c51f9129975ebdd0687e8770b337d08525cceeb Mon Sep 17 00:00:00 2001 From: Alin Cruceat Date: Tue, 20 Feb 2024 13:46:21 +0200 Subject: [PATCH 1/4] remove maybe uninit --- framework/base/src/lib.rs | 2 -- .../src/types/managed/wrapped/managed_vec.rs | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/framework/base/src/lib.rs b/framework/base/src/lib.rs index 060fdb85b9..951e3b5b4f 100644 --- a/framework/base/src/lib.rs +++ b/framework/base/src/lib.rs @@ -3,8 +3,6 @@ #![feature(exhaustive_patterns)] #![feature(try_trait_v2)] #![feature(control_flow_enum)] -#![feature(maybe_uninit_uninit_array)] -#![feature(maybe_uninit_array_assume_init)] #![feature(negative_impls)] #![feature(generic_const_exprs)] #![allow(incomplete_features)] diff --git a/framework/base/src/types/managed/wrapped/managed_vec.rs b/framework/base/src/types/managed/wrapped/managed_vec.rs index 6a938c6412..84b42bbdae 100644 --- a/framework/base/src/types/managed/wrapped/managed_vec.rs +++ b/framework/base/src/types/managed/wrapped/managed_vec.rs @@ -1,3 +1,4 @@ +use super::EncodedManagedVecItem; use crate::{ abi::{TypeAbi, TypeDescriptionContainer, TypeName}, api::{ErrorApiImpl, InvalidSliceError, ManagedTypeApi}, @@ -12,9 +13,14 @@ use crate::{ }, }; use alloc::vec::Vec; -use core::{borrow::Borrow, cmp::Ordering, fmt::Debug, iter::FromIterator, marker::PhantomData}; - -use super::EncodedManagedVecItem; +use core::{ + borrow::Borrow, + cmp::Ordering, + fmt::Debug, + iter::FromIterator, + marker::PhantomData, + mem::{transmute_copy, ManuallyDrop, MaybeUninit}, +}; pub(crate) const INDEX_OUT_OF_RANGE_MSG: &[u8] = b"ManagedVec index out of range"; @@ -146,13 +152,23 @@ where if self.len() != N { return None; } - + /* let mut result_uninit = core::mem::MaybeUninit::>::uninit_array(); for (index, value) in self.iter().enumerate() { result_uninit[index].write(value); } let result = unsafe { core::mem::MaybeUninit::array_assume_init(result_uninit) }; + */ + + let mut result_uninit = + unsafe { MaybeUninit::<[MaybeUninit>; N]>::uninit().assume_init() }; + + for (index, value) in self.iter().enumerate() { + result_uninit[index].write(value); + } + + let result = unsafe { transmute_copy(&ManuallyDrop::new(result_uninit)) }; Some(result) } From f1fa4c19e97053f57e969bdf473f4cd5e531dde6 Mon Sep 17 00:00:00 2001 From: Alin Cruceat Date: Tue, 20 Feb 2024 14:00:23 +0200 Subject: [PATCH 2/4] remove commented code --- framework/base/src/types/managed/wrapped/managed_vec.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/framework/base/src/types/managed/wrapped/managed_vec.rs b/framework/base/src/types/managed/wrapped/managed_vec.rs index 84b42bbdae..f7b8cad171 100644 --- a/framework/base/src/types/managed/wrapped/managed_vec.rs +++ b/framework/base/src/types/managed/wrapped/managed_vec.rs @@ -152,14 +152,6 @@ where if self.len() != N { return None; } - /* - let mut result_uninit = core::mem::MaybeUninit::>::uninit_array(); - for (index, value) in self.iter().enumerate() { - result_uninit[index].write(value); - } - - let result = unsafe { core::mem::MaybeUninit::array_assume_init(result_uninit) }; - */ let mut result_uninit = unsafe { MaybeUninit::<[MaybeUninit>; N]>::uninit().assume_init() }; From 8e45b11807f9d5241bf64445fd16631b11c5c934 Mon Sep 17 00:00:00 2001 From: Laurentiu Ciobanu Date: Fri, 8 Mar 2024 12:29:26 +0200 Subject: [PATCH 3/4] add tests for ManagedVec::to_array_of_refs --- framework/scenario/tests/managed_vec_test.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/framework/scenario/tests/managed_vec_test.rs b/framework/scenario/tests/managed_vec_test.rs index 90fa88c376..4fc3ede7c6 100644 --- a/framework/scenario/tests/managed_vec_test.rs +++ b/framework/scenario/tests/managed_vec_test.rs @@ -97,6 +97,25 @@ fn test_into_vec() { assert_eq!(vec, managed_vec.into_vec()); } +#[test] +fn test_to_array_of_refs() { + let mut vec = ManagedVec::::new(); + for i in 0..10 { + vec.push(i); + } + + let refs: Option<[i32; 20]> = vec.to_array_of_refs(); + assert!(refs.is_none()); + + let refs: Option<[i32; 10]> = vec.to_array_of_refs(); + assert!(refs.is_some()); + + let refs = refs.unwrap(); + for i in 0..10 { + assert_eq!(refs[i], i as i32); + } +} + #[test] fn test_take_u64() { let mut vec = Vec::::new(); From b43ed2eb2d960cb69ef4513ece3ef0e38b84cc9a Mon Sep 17 00:00:00 2001 From: Laurentiu Ciobanu Date: Fri, 8 Mar 2024 12:47:23 +0200 Subject: [PATCH 4/4] fix clippy warning in tests for ManagedVec::to_array_of_refs --- framework/scenario/tests/managed_vec_test.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/scenario/tests/managed_vec_test.rs b/framework/scenario/tests/managed_vec_test.rs index 4fc3ede7c6..c24802e599 100644 --- a/framework/scenario/tests/managed_vec_test.rs +++ b/framework/scenario/tests/managed_vec_test.rs @@ -111,8 +111,8 @@ fn test_to_array_of_refs() { assert!(refs.is_some()); let refs = refs.unwrap(); - for i in 0..10 { - assert_eq!(refs[i], i as i32); + for (i, &item) in refs.iter().enumerate() { + assert_eq!(item, i as i32); } }