@@ -16,6 +16,8 @@ use char::encode_utf8;
16
16
#[ cfg( feature="serde-1" ) ]
17
17
use serde:: { Serialize , Deserialize , Serializer , Deserializer } ;
18
18
19
+ use super :: MaybeUninit ;
20
+
19
21
/// A string with a fixed capacity.
20
22
///
21
23
/// The `ArrayString` is a string backed by a fixed size array. It keeps track
@@ -25,7 +27,7 @@ use serde::{Serialize, Deserialize, Serializer, Deserializer};
25
27
/// if needed.
26
28
#[ derive( Copy ) ]
27
29
pub struct ArrayString < A : Array < Item =u8 > > {
28
- xs : A ,
30
+ xs : MaybeUninit < A > ,
29
31
len : A :: Index ,
30
32
}
31
33
@@ -52,7 +54,7 @@ impl<A: Array<Item=u8>> ArrayString<A> {
52
54
pub fn new ( ) -> ArrayString < A > {
53
55
unsafe {
54
56
ArrayString {
55
- xs : :: new_array ( ) ,
57
+ xs : MaybeUninit :: uninitialized ( ) ,
56
58
len : Index :: from ( 0 ) ,
57
59
}
58
60
}
@@ -210,7 +212,7 @@ impl<A: Array<Item=u8>> ArrayString<A> {
210
212
return Err ( CapacityError :: new ( s) ) ;
211
213
}
212
214
unsafe {
213
- let dst = self . xs . as_mut_ptr ( ) . offset ( self . len ( ) as isize ) ;
215
+ let dst = self . xs . ptr_mut ( ) . offset ( self . len ( ) as isize ) ;
214
216
let src = s. as_ptr ( ) ;
215
217
ptr:: copy_nonoverlapping ( src, dst, s. len ( ) ) ;
216
218
let newl = self . len ( ) + s. len ( ) ;
@@ -304,8 +306,8 @@ impl<A: Array<Item=u8>> ArrayString<A> {
304
306
let next = idx + ch. len_utf8 ( ) ;
305
307
let len = self . len ( ) ;
306
308
unsafe {
307
- ptr:: copy ( self . xs . as_ptr ( ) . offset ( next as isize ) ,
308
- self . xs . as_mut_ptr ( ) . offset ( idx as isize ) ,
309
+ ptr:: copy ( self . xs . ptr ( ) . offset ( next as isize ) ,
310
+ self . xs . ptr_mut ( ) . offset ( idx as isize ) ,
309
311
len - next) ;
310
312
self . set_len ( len - ( next - idx) ) ;
311
313
}
@@ -339,7 +341,7 @@ impl<A: Array<Item=u8>> ArrayString<A> {
339
341
340
342
/// Return a mutable slice of the whole string’s buffer
341
343
unsafe fn raw_mut_bytes ( & mut self ) -> & mut [ u8 ] {
342
- slice:: from_raw_parts_mut ( self . xs . as_mut_ptr ( ) , self . capacity ( ) )
344
+ slice:: from_raw_parts_mut ( self . xs . ptr_mut ( ) , self . capacity ( ) )
343
345
}
344
346
}
345
347
@@ -348,7 +350,7 @@ impl<A: Array<Item=u8>> Deref for ArrayString<A> {
348
350
#[ inline]
349
351
fn deref ( & self ) -> & str {
350
352
unsafe {
351
- let sl = slice:: from_raw_parts ( self . xs . as_ptr ( ) , self . len . to_usize ( ) ) ;
353
+ let sl = slice:: from_raw_parts ( self . xs . ptr ( ) , self . len . to_usize ( ) ) ;
352
354
str:: from_utf8_unchecked ( sl)
353
355
}
354
356
}
@@ -358,7 +360,7 @@ impl<A: Array<Item=u8>> DerefMut for ArrayString<A> {
358
360
#[ inline]
359
361
fn deref_mut ( & mut self ) -> & mut str {
360
362
unsafe {
361
- let sl = slice:: from_raw_parts_mut ( self . xs . as_mut_ptr ( ) , self . len . to_usize ( ) ) ;
363
+ let sl = slice:: from_raw_parts_mut ( self . xs . ptr_mut ( ) , self . len . to_usize ( ) ) ;
362
364
str:: from_utf8_unchecked_mut ( sl)
363
365
}
364
366
}
0 commit comments