1515#[ allow( unused_imports) ]
1616use crate :: polyfill:: prelude:: * ;
1717
18- use super :: start_ptr:: { StartMutPtr , StartPtr } ;
18+ use super :: {
19+ start_ptr:: { StartMutPtr , StartPtr } ,
20+ uninit_slice_cursor:: Cursor ,
21+ } ;
1922use crate :: { error:: LenMismatchError , polyfill} ;
2023use core:: {
2124 marker:: PhantomData ,
@@ -53,11 +56,25 @@ impl<E> StartMutPtr for &mut Uninit<'_, E> {
5356}
5457
5558impl < ' target , E > Uninit < ' target , E > {
59+ pub fn into_cursor ( self ) -> Cursor < ' target , E > {
60+ Cursor :: from ( self )
61+ }
62+
5663 pub fn len ( & self ) -> usize {
5764 self . target . len ( )
5865 }
5966
60- pub ( super ) fn split_off_mut ( & mut self , range : RangeTo < usize > ) -> Option < Uninit < ' target , E > > {
67+ #[ allow( dead_code) ]
68+ pub fn reborrow_mut ( & mut self ) -> Uninit < ' _ , E > {
69+ Uninit {
70+ target : self . target ,
71+ }
72+ }
73+
74+ pub ( super ) fn split_off_mut < ' s > (
75+ & ' s mut self ,
76+ range : RangeTo < usize > ,
77+ ) -> Option < Uninit < ' target , E > > {
6178 if self . target . len ( ) < range. end {
6279 return None ;
6380 }
@@ -71,10 +88,21 @@ impl<'target, E> Uninit<'target, E> {
7188impl < ' target , E : Copy > Uninit < ' target , E > {
7289 #[ allow( dead_code) ]
7390 pub fn write_copy_of_slice (
74- self ,
91+ mut self ,
7592 src : & [ E ] ,
7693 ) -> Result < WriteResult < ' target , E , Self , ( ) > , LenMismatchError > {
77- self . write_iter ( src. iter ( ) . copied ( ) ) . src_empty ( )
94+ let Some ( mut dst) = self . split_off_mut ( ..src. len ( ) ) else {
95+ return Err ( LenMismatchError :: new ( self . len ( ) ) ) ;
96+ } ;
97+ let written = unsafe {
98+ ptr:: copy_nonoverlapping ( src. as_ptr ( ) , dst. start_mut_ptr ( ) , src. len ( ) ) ;
99+ dst. assume_init ( )
100+ } ;
101+ Ok ( WriteResult {
102+ written,
103+ dst_leftover : self ,
104+ src_leftover : ( ) ,
105+ } )
78106 }
79107
80108 pub fn write_iter < Src : IntoIterator < Item = E > > (
@@ -264,6 +292,7 @@ impl<'written, E, Dst, Src> WriteResult<'written, E, Dst, Src> {
264292}
265293
266294impl < ' written , E , Src > WriteResult < ' written , E , Uninit < ' written , E > , Src > {
295+ #[ allow( dead_code) ]
267296 #[ inline( always) ]
268297 pub fn uninit_empty ( self ) -> Result < WriteResult < ' written , E , ( ) , Src > , LenMismatchError > {
269298 let ( res, dst_leftover) = self . take_uninit ( ) ;
0 commit comments