@@ -30,13 +30,15 @@ impl AsciiStr {
30
30
/// Converts `&self` to a `&str` slice.
31
31
#[ inline]
32
32
pub fn as_str ( & self ) -> & str {
33
- unsafe { mem:: transmute ( & self . slice ) }
33
+ let ptr = self as * const AsciiStr as * const str ;
34
+ unsafe { & * ptr }
34
35
}
35
36
36
37
/// Converts `&self` into a byte slice.
37
38
#[ inline]
38
39
pub fn as_bytes ( & self ) -> & [ u8 ] {
39
- unsafe { mem:: transmute ( & self . slice ) }
40
+ let ptr = self as * const AsciiStr as * const [ u8 ] ;
41
+ unsafe { & * ptr }
40
42
}
41
43
42
44
/// Returns the entire string as slice of `AsciiChar`s.
@@ -297,20 +299,23 @@ impl Default for &'static AsciiStr {
297
299
impl < ' a > From < & ' a [ AsciiChar ] > for & ' a AsciiStr {
298
300
#[ inline]
299
301
fn from ( slice : & [ AsciiChar ] ) -> & AsciiStr {
300
- unsafe { mem:: transmute ( slice) }
302
+ let ptr = slice as * const [ AsciiChar ] as * const AsciiStr ;
303
+ unsafe { & * ptr }
301
304
}
302
305
}
303
306
impl < ' a > From < & ' a mut [ AsciiChar ] > for & ' a mut AsciiStr {
304
307
#[ inline]
305
308
fn from ( slice : & mut [ AsciiChar ] ) -> & mut AsciiStr {
306
- unsafe { mem:: transmute ( slice) }
309
+ let ptr = slice as * mut [ AsciiChar ] as * mut AsciiStr ;
310
+ unsafe { & mut * ptr }
307
311
}
308
312
}
309
313
#[ cfg( feature = "std" ) ]
310
314
impl From < Box < [ AsciiChar ] > > for Box < AsciiStr > {
311
315
#[ inline]
312
316
fn from ( owned : Box < [ AsciiChar ] > ) -> Box < AsciiStr > {
313
- unsafe { mem:: transmute ( owned) }
317
+ let ptr = Box :: into_raw ( owned) as * mut AsciiStr ;
318
+ unsafe { Box :: from_raw ( ptr) }
314
319
}
315
320
}
316
321
@@ -319,20 +324,23 @@ macro_rules! impl_into {
319
324
impl <' a> From <& ' a AsciiStr > for & ' a$wider {
320
325
#[ inline]
321
326
fn from( slice: & AsciiStr ) -> & $wider {
322
- unsafe { mem:: transmute( slice) }
327
+ let ptr = slice as * const AsciiStr as * const $wider;
328
+ unsafe { & * ptr }
323
329
}
324
330
}
325
331
impl <' a> From <& ' a mut AsciiStr > for & ' a mut $wider {
326
332
#[ inline]
327
333
fn from( slice: & mut AsciiStr ) -> & mut $wider {
328
- unsafe { mem:: transmute( slice) }
334
+ let ptr = slice as * mut AsciiStr as * mut $wider;
335
+ unsafe { & mut * ptr }
329
336
}
330
337
}
331
338
#[ cfg( feature = "std" ) ]
332
339
impl From <Box <AsciiStr >> for Box <$wider> {
333
340
#[ inline]
334
341
fn from( owned: Box <AsciiStr >) -> Box <$wider> {
335
- unsafe { mem:: transmute( owned) }
342
+ let ptr = Box :: into_raw( owned) as * mut $wider;
343
+ unsafe { Box :: from_raw( ptr) }
336
344
}
337
345
}
338
346
}
@@ -356,30 +364,47 @@ impl fmt::Debug for AsciiStr {
356
364
}
357
365
358
366
macro_rules! impl_index {
359
- ( $lhs : ty , $ idx: ty , $rhs : ty) => {
360
- impl Index <$idx> for $lhs {
361
- type Output = $rhs ;
367
+ ( $idx: ty) => {
368
+ impl Index <$idx> for AsciiStr {
369
+ type Output = AsciiStr ;
362
370
363
371
#[ inline]
364
- fn index( & self , index: $idx) -> & $rhs {
365
- unsafe { mem:: transmute( & self . slice[ index] ) }
372
+ fn index( & self , index: $idx) -> & AsciiStr {
373
+ let ptr = & self . slice[ index] as * const [ AsciiChar ] as * const AsciiStr ;
374
+ unsafe { & * ptr }
366
375
}
367
376
}
368
377
369
- impl IndexMut <$idx> for $lhs {
378
+ impl IndexMut <$idx> for AsciiStr {
370
379
#[ inline]
371
- fn index_mut( & mut self , index: $idx) -> & mut $rhs {
372
- unsafe { mem:: transmute( & mut self . slice[ index] ) }
380
+ fn index_mut( & mut self , index: $idx) -> & mut AsciiStr {
381
+ let ptr = & mut self . slice[ index] as * mut [ AsciiChar ] as * mut AsciiStr ;
382
+ unsafe { & mut * ptr }
373
383
}
374
384
}
375
385
}
376
386
}
377
387
378
- impl_index ! { AsciiStr , usize , AsciiChar }
379
- impl_index ! { AsciiStr , Range <usize >, AsciiStr }
380
- impl_index ! { AsciiStr , RangeTo <usize >, AsciiStr }
381
- impl_index ! { AsciiStr , RangeFrom <usize >, AsciiStr }
382
- impl_index ! { AsciiStr , RangeFull , AsciiStr }
388
+ impl_index ! { Range <usize > }
389
+ impl_index ! { RangeTo <usize > }
390
+ impl_index ! { RangeFrom <usize > }
391
+ impl_index ! { RangeFull }
392
+
393
+ impl Index < usize > for AsciiStr {
394
+ type Output = AsciiChar ;
395
+
396
+ #[ inline]
397
+ fn index ( & self , index : usize ) -> & AsciiChar {
398
+ unsafe { mem:: transmute ( & self . slice [ index] ) }
399
+ }
400
+ }
401
+
402
+ impl IndexMut < usize > for AsciiStr {
403
+ #[ inline]
404
+ fn index_mut ( & mut self , index : usize ) -> & mut AsciiChar {
405
+ unsafe { mem:: transmute ( & mut self . slice [ index] ) }
406
+ }
407
+ }
383
408
384
409
#[ cfg( feature = "std" ) ]
385
410
impl AsciiExt for AsciiStr {
@@ -603,7 +628,8 @@ impl AsAsciiStr for [u8] {
603
628
}
604
629
#[ inline]
605
630
unsafe fn as_ascii_str_unchecked ( & self ) -> & AsciiStr {
606
- mem:: transmute ( self )
631
+ let ptr = self as * const [ u8 ] as * const AsciiStr ;
632
+ & * ptr
607
633
}
608
634
}
609
635
impl AsMutAsciiStr for [ u8 ] {
@@ -615,7 +641,8 @@ impl AsMutAsciiStr for [u8] {
615
641
}
616
642
#[ inline]
617
643
unsafe fn as_mut_ascii_str_unchecked ( & mut self ) -> & mut AsciiStr {
618
- mem:: transmute ( self )
644
+ let ptr = self as * mut [ u8 ] as * mut AsciiStr ;
645
+ & mut * ptr
619
646
}
620
647
}
621
648
@@ -637,7 +664,8 @@ impl AsMutAsciiStr for str {
637
664
}
638
665
#[ inline]
639
666
unsafe fn as_mut_ascii_str_unchecked ( & mut self ) -> & mut AsciiStr {
640
- mem:: transmute ( self )
667
+ let ptr = self as * mut str as * mut AsciiStr ;
668
+ & mut * ptr
641
669
}
642
670
}
643
671
0 commit comments