25
25
use crate :: polyfill:: { StartMutPtr , StartPtr } ;
26
26
27
27
#[ allow( dead_code) ]
28
- pub ( crate ) trait SlicePolyfills < T > {
29
- fn as_chunks < const N : usize > ( & self ) -> ( & [ [ T ; N ] ] , & [ T ] ) ;
30
- fn as_chunks_mut < const N : usize > ( & mut self ) -> ( & mut [ [ T ; N ] ] , & mut [ T ] ) ;
31
- fn split_at_checked ( & self , mid : usize ) -> Option < ( & [ T ] , & [ T ] ) > ;
32
- fn split_at_mut_checked ( & mut self , mid : usize ) -> Option < ( & mut [ T ] , & mut [ T ] ) > ;
33
- fn split_first_chunk_mut < const N : usize > ( & mut self ) -> Option < ( & mut [ T ; N ] , & mut [ T ] ) > ;
28
+ pub ( crate ) trait SlicePolyfills {
29
+ type Elem ;
30
+ fn as_chunks < const N : usize > ( & self ) -> ( & [ [ Self :: Elem ; N ] ] , & [ Self :: Elem ] ) ;
31
+ fn as_chunks_mut < const N : usize > ( & mut self ) -> ( & mut [ [ Self :: Elem ; N ] ] , & mut [ Self :: Elem ] ) ;
32
+ fn split_at_checked ( & self , mid : usize ) -> Option < ( & [ Self :: Elem ] , & [ Self :: Elem ] ) > ;
33
+ fn split_at_mut_checked (
34
+ & mut self ,
35
+ mid : usize ,
36
+ ) -> Option < ( & mut [ Self :: Elem ] , & mut [ Self :: Elem ] ) > ;
37
+ fn split_first_chunk_mut < const N : usize > (
38
+ & mut self ,
39
+ ) -> Option < ( & mut [ Self :: Elem ; N ] , & mut [ Self :: Elem ] ) > ;
34
40
}
35
41
36
- impl < T > SlicePolyfills < T > for [ T ] {
42
+ impl < T > SlicePolyfills for [ T ] {
43
+ type Elem = T ;
44
+
37
45
// TODO(MSRV-1.88): Use `slice::as_chunks`.
38
46
#[ inline]
39
- fn as_chunks < const N : usize > ( & self ) -> ( & [ [ T ; N ] ] , & [ T ] ) {
47
+ fn as_chunks < const N : usize > ( & self ) -> ( & [ [ Self :: Elem ; N ] ] , & [ Self :: Elem ] ) {
40
48
assert ! ( N != 0 ) ;
41
49
let len = self . len ( ) ;
42
50
let remainder_len = len % N ;
43
51
let ( chunks, remainder) = self . split_at ( len - remainder_len) ;
44
- let chunks = <* const T >:: cast :: < [ T ; N ] > ( chunks. as_ptr ( ) ) ;
52
+ let chunks = <* const Self :: Elem >:: cast :: < [ Self :: Elem ; N ] > ( chunks. as_ptr ( ) ) ;
45
53
let chunks = unsafe { core:: slice:: from_raw_parts ( chunks, len / N ) } ;
46
54
( chunks, remainder)
47
55
}
48
56
49
57
// TODO(MSRV-1.88): Use `slice::as_chunks_mut`.
50
58
#[ inline]
51
- fn as_chunks_mut < const N : usize > ( & mut self ) -> ( & mut [ [ T ; N ] ] , & mut [ T ] ) {
59
+ fn as_chunks_mut < const N : usize > ( & mut self ) -> ( & mut [ [ Self :: Elem ; N ] ] , & mut [ Self :: Elem ] ) {
52
60
assert ! ( N != 0 ) ;
53
61
let len = self . len ( ) ;
54
62
let remainder_len = len % N ;
55
63
let ( chunks, remainder) = self . split_at_mut ( len - remainder_len) ;
56
- let chunks = <* mut T >:: cast :: < [ T ; N ] > ( chunks. as_mut_ptr ( ) ) ;
64
+ let chunks = <* mut Self :: Elem >:: cast :: < [ Self :: Elem ; N ] > ( chunks. as_mut_ptr ( ) ) ;
57
65
let chunks = unsafe { core:: slice:: from_raw_parts_mut ( chunks, len / N ) } ;
58
66
( chunks, remainder)
59
67
}
@@ -64,7 +72,7 @@ impl<T> SlicePolyfills<T> for [T] {
64
72
// terms of `split_at` and rely on the optimizer to eliminate the panic.
65
73
// TODO(MSRV-1.80): Use `slice::split_at_checked`.
66
74
#[ inline]
67
- fn split_at_checked ( & self , mid : usize ) -> Option < ( & [ T ] , & [ T ] ) > {
75
+ fn split_at_checked ( & self , mid : usize ) -> Option < ( & [ Self :: Elem ] , & [ Self :: Elem ] ) > {
68
76
if self . len ( ) >= mid {
69
77
Some ( self . split_at ( mid) )
70
78
} else {
@@ -74,7 +82,10 @@ impl<T> SlicePolyfills<T> for [T] {
74
82
75
83
// TODO(MSRV-1.80): Use `slice::split_at_checked`.
76
84
#[ inline]
77
- fn split_at_mut_checked ( & mut self , mid : usize ) -> Option < ( & mut [ T ] , & mut [ T ] ) > {
85
+ fn split_at_mut_checked (
86
+ & mut self ,
87
+ mid : usize ,
88
+ ) -> Option < ( & mut [ Self :: Elem ] , & mut [ Self :: Elem ] ) > {
78
89
if self . len ( ) >= mid {
79
90
Some ( self . split_at_mut ( mid) )
80
91
} else {
@@ -84,32 +95,38 @@ impl<T> SlicePolyfills<T> for [T] {
84
95
85
96
// TODO(MSRV-1.77): Use `slice::split_first_chunk_mut`.
86
97
#[ inline]
87
- fn split_first_chunk_mut < const N : usize > ( & mut self ) -> Option < ( & mut [ T ; N ] , & mut [ T ] ) > {
98
+ fn split_first_chunk_mut < const N : usize > (
99
+ & mut self ,
100
+ ) -> Option < ( & mut [ Self :: Elem ; N ] , & mut [ Self :: Elem ] ) > {
88
101
let ( head, tail) = self . split_at_mut_checked ( N ) ?;
89
102
head. try_into ( ) . ok ( ) . map ( |head| ( head, tail) )
90
103
}
91
104
}
92
105
93
106
#[ allow( dead_code) ]
94
- pub ( crate ) trait SliceOfArraysPolyfills < T > {
95
- fn as_flattened ( & self ) -> & [ T ] ;
96
- fn as_flattened_mut ( & mut self ) -> & mut [ T ] ;
107
+ pub ( crate ) trait SliceOfArraysPolyfills : SlicePolyfills {
108
+ type ElemElem ;
109
+
110
+ fn as_flattened ( & self ) -> & [ Self :: ElemElem ] ;
111
+ fn as_flattened_mut ( & mut self ) -> & mut [ Self :: ElemElem ] ;
97
112
}
98
113
99
- impl < T , const N : usize > SliceOfArraysPolyfills < T > for [ [ T ; N ] ] {
114
+ impl < T , const N : usize > SliceOfArraysPolyfills for [ [ T ; N ] ] {
115
+ type ElemElem = T ;
116
+
100
117
#[ inline]
101
- fn as_flattened ( & self ) -> & [ T ] {
118
+ fn as_flattened ( & self ) -> & [ Self :: ElemElem ] {
102
119
let total_len = self . len ( ) * N ;
103
- let p: * const [ T ; N ] = self . as_ptr ( ) ;
104
- let p: * const T = StartPtr :: start_ptr ( p) ;
120
+ let p: * const [ Self :: ElemElem ; N ] = self . as_ptr ( ) ;
121
+ let p: * const Self :: ElemElem = StartPtr :: start_ptr ( p) ;
105
122
unsafe { core:: slice:: from_raw_parts ( p, total_len) }
106
123
}
107
124
108
125
#[ inline]
109
- fn as_flattened_mut ( & mut self ) -> & mut [ T ] {
126
+ fn as_flattened_mut ( & mut self ) -> & mut [ Self :: ElemElem ] {
110
127
let total_len = self . len ( ) * N ;
111
- let p: * mut [ T ; N ] = self . as_mut_ptr ( ) ;
112
- let p: * mut T = StartMutPtr :: start_mut_ptr ( p) ;
128
+ let p: * mut [ Self :: ElemElem ; N ] = self . as_mut_ptr ( ) ;
129
+ let p: * mut Self :: ElemElem = StartMutPtr :: start_mut_ptr ( p) ;
113
130
unsafe { core:: slice:: from_raw_parts_mut ( p, total_len) }
114
131
}
115
132
}
0 commit comments