@@ -103,7 +103,7 @@ impl<T> [T] {
103103 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
104104 #[ inline]
105105 pub fn first ( & self ) -> Option < & T > {
106- self . get ( 0 )
106+ if let [ first , .. ] = self { Some ( first ) } else { None }
107107 }
108108
109109 /// Returns a mutable pointer to the first element of the slice, or `None` if it is empty.
@@ -121,7 +121,7 @@ impl<T> [T] {
121121 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
122122 #[ inline]
123123 pub fn first_mut ( & mut self ) -> Option < & mut T > {
124- self . get_mut ( 0 )
124+ if let [ first , .. ] = self { Some ( first ) } else { None }
125125 }
126126
127127 /// Returns the first and all the rest of the elements of the slice, or `None` if it is empty.
@@ -139,7 +139,7 @@ impl<T> [T] {
139139 #[ stable( feature = "slice_splits" , since = "1.5.0" ) ]
140140 #[ inline]
141141 pub fn split_first ( & self ) -> Option < ( & T , & [ T ] ) > {
142- if self . is_empty ( ) { None } else { Some ( ( & self [ 0 ] , & self [ 1 .. ] ) ) }
142+ if let [ first , tail @ .. ] = self { Some ( ( first , tail ) ) } else { None }
143143 }
144144
145145 /// Returns the first and all the rest of the elements of the slice, or `None` if it is empty.
@@ -159,12 +159,7 @@ impl<T> [T] {
159159 #[ stable( feature = "slice_splits" , since = "1.5.0" ) ]
160160 #[ inline]
161161 pub fn split_first_mut ( & mut self ) -> Option < ( & mut T , & mut [ T ] ) > {
162- if self . is_empty ( ) {
163- None
164- } else {
165- let split = self . split_at_mut ( 1 ) ;
166- Some ( ( & mut split. 0 [ 0 ] , split. 1 ) )
167- }
162+ if let [ first, tail @ ..] = self { Some ( ( first, tail) ) } else { None }
168163 }
169164
170165 /// Returns the last and all the rest of the elements of the slice, or `None` if it is empty.
@@ -182,8 +177,7 @@ impl<T> [T] {
182177 #[ stable( feature = "slice_splits" , since = "1.5.0" ) ]
183178 #[ inline]
184179 pub fn split_last ( & self ) -> Option < ( & T , & [ T ] ) > {
185- let len = self . len ( ) ;
186- if len == 0 { None } else { Some ( ( & self [ len - 1 ] , & self [ ..( len - 1 ) ] ) ) }
180+ if let [ init @ .., last] = self { Some ( ( last, init) ) } else { None }
187181 }
188182
189183 /// Returns the last and all the rest of the elements of the slice, or `None` if it is empty.
@@ -203,13 +197,7 @@ impl<T> [T] {
203197 #[ stable( feature = "slice_splits" , since = "1.5.0" ) ]
204198 #[ inline]
205199 pub fn split_last_mut ( & mut self ) -> Option < ( & mut T , & mut [ T ] ) > {
206- let len = self . len ( ) ;
207- if len == 0 {
208- None
209- } else {
210- let split = self . split_at_mut ( len - 1 ) ;
211- Some ( ( & mut split. 1 [ 0 ] , split. 0 ) )
212- }
200+ if let [ init @ .., last] = self { Some ( ( last, init) ) } else { None }
213201 }
214202
215203 /// Returns the last element of the slice, or `None` if it is empty.
@@ -226,8 +214,7 @@ impl<T> [T] {
226214 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
227215 #[ inline]
228216 pub fn last ( & self ) -> Option < & T > {
229- let last_idx = self . len ( ) . checked_sub ( 1 ) ?;
230- self . get ( last_idx)
217+ if let [ .., last] = self { Some ( last) } else { None }
231218 }
232219
233220 /// Returns a mutable pointer to the last item in the slice.
@@ -245,8 +232,7 @@ impl<T> [T] {
245232 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
246233 #[ inline]
247234 pub fn last_mut ( & mut self ) -> Option < & mut T > {
248- let last_idx = self . len ( ) . checked_sub ( 1 ) ?;
249- self . get_mut ( last_idx)
235+ if let [ .., last] = self { Some ( last) } else { None }
250236 }
251237
252238 /// Returns a reference to an element or subslice depending on the type of
0 commit comments