@@ -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 :: MaybeUninitCopy ;
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
@@ -24,19 +26,25 @@ use serde::{Serialize, Deserialize, Serializer, Deserializer};
24
26
/// The string is a contiguous value that you can store directly on the stack
25
27
/// if needed.
26
28
#[ derive( Copy ) ]
27
- pub struct ArrayString < A : Array < Item =u8 > > {
28
- xs : A ,
29
+ pub struct ArrayString < A >
30
+ where A : Array < Item =u8 > + Copy
31
+ {
32
+ xs : MaybeUninitCopy < A > ,
29
33
len : A :: Index ,
30
34
}
31
35
32
- impl < A : Array < Item =u8 > > Default for ArrayString < A > {
36
+ impl < A > Default for ArrayString < A >
37
+ where A : Array < Item =u8 > + Copy
38
+ {
33
39
/// Return an empty `ArrayString`
34
40
fn default ( ) -> ArrayString < A > {
35
41
ArrayString :: new ( )
36
42
}
37
43
}
38
44
39
- impl < A : Array < Item =u8 > > ArrayString < A > {
45
+ impl < A > ArrayString < A >
46
+ where A : Array < Item =u8 > + Copy
47
+ {
40
48
/// Create a new empty `ArrayString`.
41
49
///
42
50
/// Capacity is inferred from the type parameter.
@@ -52,7 +60,7 @@ impl<A: Array<Item=u8>> ArrayString<A> {
52
60
pub fn new ( ) -> ArrayString < A > {
53
61
unsafe {
54
62
ArrayString {
55
- xs : :: new_array ( ) ,
63
+ xs : MaybeUninitCopy :: uninitialized ( ) ,
56
64
len : Index :: from ( 0 ) ,
57
65
}
58
66
}
@@ -88,11 +96,12 @@ impl<A: Array<Item=u8>> ArrayString<A> {
88
96
/// let string = ArrayString::from_byte_string(b"hello world").unwrap();
89
97
/// ```
90
98
pub fn from_byte_string ( b : & A ) -> Result < Self , Utf8Error > {
91
- let mut arraystr = Self :: new ( ) ;
92
- let s = try!( str:: from_utf8 ( b. as_slice ( ) ) ) ;
93
- let _result = arraystr. try_push_str ( s) ;
94
- debug_assert ! ( _result. is_ok( ) ) ;
95
- Ok ( arraystr)
99
+ let len = str:: from_utf8 ( b. as_slice ( ) ) ?. len ( ) ;
100
+ debug_assert_eq ! ( len, A :: capacity( ) ) ;
101
+ Ok ( ArrayString {
102
+ xs : MaybeUninitCopy :: from ( * b) ,
103
+ len : Index :: from ( A :: capacity ( ) ) ,
104
+ } )
96
105
}
97
106
98
107
/// Return the capacity of the `ArrayString`.
@@ -210,7 +219,7 @@ impl<A: Array<Item=u8>> ArrayString<A> {
210
219
return Err ( CapacityError :: new ( s) ) ;
211
220
}
212
221
unsafe {
213
- let dst = self . xs . as_mut_ptr ( ) . offset ( self . len ( ) as isize ) ;
222
+ let dst = self . xs . ptr_mut ( ) . offset ( self . len ( ) as isize ) ;
214
223
let src = s. as_ptr ( ) ;
215
224
ptr:: copy_nonoverlapping ( src, dst, s. len ( ) ) ;
216
225
let newl = self . len ( ) + s. len ( ) ;
@@ -304,8 +313,8 @@ impl<A: Array<Item=u8>> ArrayString<A> {
304
313
let next = idx + ch. len_utf8 ( ) ;
305
314
let len = self . len ( ) ;
306
315
unsafe {
307
- ptr:: copy ( self . xs . as_ptr ( ) . offset ( next as isize ) ,
308
- self . xs . as_mut_ptr ( ) . offset ( idx as isize ) ,
316
+ ptr:: copy ( self . xs . ptr ( ) . offset ( next as isize ) ,
317
+ self . xs . ptr_mut ( ) . offset ( idx as isize ) ,
309
318
len - next) ;
310
319
self . set_len ( len - ( next - idx) ) ;
311
320
}
@@ -339,75 +348,99 @@ impl<A: Array<Item=u8>> ArrayString<A> {
339
348
340
349
/// Return a mutable slice of the whole string’s buffer
341
350
unsafe fn raw_mut_bytes ( & mut self ) -> & mut [ u8 ] {
342
- slice:: from_raw_parts_mut ( self . xs . as_mut_ptr ( ) , self . capacity ( ) )
351
+ slice:: from_raw_parts_mut ( self . xs . ptr_mut ( ) , self . capacity ( ) )
343
352
}
344
353
}
345
354
346
- impl < A : Array < Item =u8 > > Deref for ArrayString < A > {
355
+ impl < A > Deref for ArrayString < A >
356
+ where A : Array < Item =u8 > + Copy
357
+ {
347
358
type Target = str ;
348
359
#[ inline]
349
360
fn deref ( & self ) -> & str {
350
361
unsafe {
351
- let sl = slice:: from_raw_parts ( self . xs . as_ptr ( ) , self . len . to_usize ( ) ) ;
362
+ let sl = slice:: from_raw_parts ( self . xs . ptr ( ) , self . len . to_usize ( ) ) ;
352
363
str:: from_utf8_unchecked ( sl)
353
364
}
354
365
}
355
366
}
356
367
357
- impl < A : Array < Item =u8 > > DerefMut for ArrayString < A > {
368
+ impl < A > DerefMut for ArrayString < A >
369
+ where A : Array < Item =u8 > + Copy
370
+ {
358
371
#[ inline]
359
372
fn deref_mut ( & mut self ) -> & mut str {
360
373
unsafe {
361
- let sl = slice:: from_raw_parts_mut ( self . xs . as_mut_ptr ( ) , self . len . to_usize ( ) ) ;
374
+ let sl = slice:: from_raw_parts_mut ( self . xs . ptr_mut ( ) , self . len . to_usize ( ) ) ;
362
375
str:: from_utf8_unchecked_mut ( sl)
363
376
}
364
377
}
365
378
}
366
379
367
- impl < A : Array < Item =u8 > > PartialEq for ArrayString < A > {
380
+ impl < A > PartialEq for ArrayString < A >
381
+ where A : Array < Item =u8 > + Copy
382
+ {
368
383
fn eq ( & self , rhs : & Self ) -> bool {
369
384
* * self == * * rhs
370
385
}
371
386
}
372
387
373
- impl < A : Array < Item =u8 > > PartialEq < str > for ArrayString < A > {
388
+ impl < A > PartialEq < str > for ArrayString < A >
389
+ where A : Array < Item =u8 > + Copy
390
+ {
374
391
fn eq ( & self , rhs : & str ) -> bool {
375
392
& * * self == rhs
376
393
}
377
394
}
378
395
379
- impl < A : Array < Item =u8 > > PartialEq < ArrayString < A > > for str {
396
+ impl < A > PartialEq < ArrayString < A > > for str
397
+ where A : Array < Item =u8 > + Copy
398
+ {
380
399
fn eq ( & self , rhs : & ArrayString < A > ) -> bool {
381
400
self == & * * rhs
382
401
}
383
402
}
384
403
385
- impl < A : Array < Item =u8 > > Eq for ArrayString < A > { }
404
+ impl < A > Eq for ArrayString < A >
405
+ where A : Array < Item =u8 > + Copy
406
+ { }
386
407
387
- impl < A : Array < Item =u8 > > Hash for ArrayString < A > {
408
+ impl < A > Hash for ArrayString < A >
409
+ where A : Array < Item =u8 > + Copy
410
+ {
388
411
fn hash < H : Hasher > ( & self , h : & mut H ) {
389
412
( * * self ) . hash ( h)
390
413
}
391
414
}
392
415
393
- impl < A : Array < Item =u8 > > Borrow < str > for ArrayString < A > {
416
+ impl < A > Borrow < str > for ArrayString < A >
417
+ where A : Array < Item =u8 > + Copy
418
+ {
394
419
fn borrow ( & self ) -> & str { self }
395
420
}
396
421
397
- impl < A : Array < Item =u8 > > AsRef < str > for ArrayString < A > {
422
+ impl < A > AsRef < str > for ArrayString < A >
423
+ where A : Array < Item =u8 > + Copy
424
+ {
398
425
fn as_ref ( & self ) -> & str { self }
399
426
}
400
427
401
- impl < A : Array < Item =u8 > > fmt:: Debug for ArrayString < A > {
428
+ impl < A > fmt:: Debug for ArrayString < A >
429
+ where A : Array < Item =u8 > + Copy
430
+ {
402
431
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result { ( * * self ) . fmt ( f) }
403
432
}
404
433
405
- impl < A : Array < Item =u8 > > fmt:: Display for ArrayString < A > {
434
+ impl < A > fmt:: Display for ArrayString < A >
435
+ where A : Array < Item =u8 > + Copy
436
+ {
406
437
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result { ( * * self ) . fmt ( f) }
407
438
}
408
439
409
440
/// `Write` appends written data to the end of the string.
410
- impl < A : Array < Item =u8 > > fmt:: Write for ArrayString < A > {
441
+ impl < A > fmt:: Write for ArrayString < A >
442
+ where A : Array < Item =u8 > + Copy
443
+ {
411
444
fn write_char ( & mut self , c : char ) -> fmt:: Result {
412
445
self . try_push ( c) . map_err ( |_| fmt:: Error )
413
446
}
@@ -417,7 +450,9 @@ impl<A: Array<Item=u8>> fmt::Write for ArrayString<A> {
417
450
}
418
451
}
419
452
420
- impl < A : Array < Item =u8 > + Copy > Clone for ArrayString < A > {
453
+ impl < A > Clone for ArrayString < A >
454
+ where A : Array < Item =u8 > + Copy
455
+ {
421
456
fn clone ( & self ) -> ArrayString < A > {
422
457
* self
423
458
}
@@ -428,7 +463,9 @@ impl<A: Array<Item=u8> + Copy> Clone for ArrayString<A> {
428
463
}
429
464
}
430
465
431
- impl < A : Array < Item =u8 > > PartialOrd for ArrayString < A > {
466
+ impl < A > PartialOrd for ArrayString < A >
467
+ where A : Array < Item =u8 > + Copy
468
+ {
432
469
fn partial_cmp ( & self , rhs : & Self ) -> Option < cmp:: Ordering > {
433
470
( * * self ) . partial_cmp ( & * * rhs)
434
471
}
@@ -438,7 +475,9 @@ impl<A: Array<Item=u8>> PartialOrd for ArrayString<A> {
438
475
fn ge ( & self , rhs : & Self ) -> bool { * * self >= * * rhs }
439
476
}
440
477
441
- impl < A : Array < Item =u8 > > PartialOrd < str > for ArrayString < A > {
478
+ impl < A > PartialOrd < str > for ArrayString < A >
479
+ where A : Array < Item =u8 > + Copy
480
+ {
442
481
fn partial_cmp ( & self , rhs : & str ) -> Option < cmp:: Ordering > {
443
482
( * * self ) . partial_cmp ( rhs)
444
483
}
@@ -448,7 +487,9 @@ impl<A: Array<Item=u8>> PartialOrd<str> for ArrayString<A> {
448
487
fn ge ( & self , rhs : & str ) -> bool { & * * self >= rhs }
449
488
}
450
489
451
- impl < A : Array < Item =u8 > > PartialOrd < ArrayString < A > > for str {
490
+ impl < A > PartialOrd < ArrayString < A > > for str
491
+ where A : Array < Item =u8 > + Copy
492
+ {
452
493
fn partial_cmp ( & self , rhs : & ArrayString < A > ) -> Option < cmp:: Ordering > {
453
494
self . partial_cmp ( & * * rhs)
454
495
}
@@ -458,15 +499,19 @@ impl<A: Array<Item=u8>> PartialOrd<ArrayString<A>> for str {
458
499
fn ge ( & self , rhs : & ArrayString < A > ) -> bool { self >= & * * rhs }
459
500
}
460
501
461
- impl < A : Array < Item =u8 > > Ord for ArrayString < A > {
502
+ impl < A > Ord for ArrayString < A >
503
+ where A : Array < Item =u8 > + Copy
504
+ {
462
505
fn cmp ( & self , rhs : & Self ) -> cmp:: Ordering {
463
506
( * * self ) . cmp ( & * * rhs)
464
507
}
465
508
}
466
509
467
510
#[ cfg( feature="serde-1" ) ]
468
511
/// Requires crate feature `"serde-1"`
469
- impl < A : Array < Item =u8 > > Serialize for ArrayString < A > {
512
+ impl < A > Serialize for ArrayString < A >
513
+ where A : Array < Item =u8 > + Copy
514
+ {
470
515
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
471
516
where S : Serializer
472
517
{
@@ -476,7 +521,9 @@ impl<A: Array<Item=u8>> Serialize for ArrayString<A> {
476
521
477
522
#[ cfg( feature="serde-1" ) ]
478
523
/// Requires crate feature `"serde-1"`
479
- impl < ' de , A : Array < Item =u8 > > Deserialize < ' de > for ArrayString < A > {
524
+ impl < ' de , A > Deserialize < ' de > for ArrayString < A >
525
+ where A : Array < Item =u8 > + Copy
526
+ {
480
527
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
481
528
where D : Deserializer < ' de >
482
529
{
@@ -485,7 +532,7 @@ impl<'de, A: Array<Item=u8>> Deserialize<'de> for ArrayString<A> {
485
532
486
533
struct ArrayStringVisitor < A : Array < Item =u8 > > ( PhantomData < A > ) ;
487
534
488
- impl < ' de , A : Array < Item =u8 > > Visitor < ' de > for ArrayStringVisitor < A > {
535
+ impl < ' de , A : Copy + Array < Item =u8 > > Visitor < ' de > for ArrayStringVisitor < A > {
489
536
type Value = ArrayString < A > ;
490
537
491
538
fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
0 commit comments