@@ -160,108 +160,6 @@ pub trait AsciiExt {
160
160
/// ```
161
161
#[ unstable( feature = "ascii" , issue = "27809" ) ]
162
162
fn make_ascii_lowercase ( & mut self ) ;
163
-
164
- /// Converts this type to its ASCII upper case,
165
- /// consuming the value to avoid allocating memory where `to_ascii_uppercase` would.
166
- ///
167
- /// See `to_ascii_uppercase` for more information.
168
- ///
169
- /// # Examples
170
- ///
171
- /// ```
172
- /// use std::ascii::AsciiExt;
173
- ///
174
- /// let ascii: String = "a".to_owned();
175
- ///
176
- /// let upper = ascii.into_ascii_uppercase();
177
- ///
178
- /// assert_eq!(upper, "A");
179
- /// ```
180
- #[ stable( feature = "into_ascii" , since = "1.8.0" ) ]
181
- fn into_ascii_uppercase ( self ) -> Self :: Owned where Self : Sized {
182
- self . to_ascii_uppercase ( )
183
- }
184
-
185
- /// Converts this type to its ASCII lower case,
186
- /// consuming the value to avoid allocating memory where `to_ascii_lowercase` would.
187
- ///
188
- /// See `to_ascii_lowercase` for more information.
189
- ///
190
- /// # Examples
191
- ///
192
- /// ```
193
- /// use std::ascii::AsciiExt;
194
- ///
195
- /// let ascii: String = "A".to_owned();
196
- ///
197
- /// let lower = ascii.into_ascii_lowercase();
198
- ///
199
- /// assert_eq!(lower, "a");
200
- /// ```
201
- #[ stable( feature = "into_ascii" , since = "1.8.0" ) ]
202
- fn into_ascii_lowercase ( self ) -> Self :: Owned where Self : Sized {
203
- self . to_ascii_lowercase ( )
204
- }
205
- }
206
-
207
- /// Implement `into_ascii_lowercase` and `into_ascii_uppercase` without memory allocation,
208
- /// defer other methods to `str`.
209
- #[ stable( feature = "into_ascii" , since = "1.8.0" ) ]
210
- impl AsciiExt for String {
211
- type Owned = Self ;
212
-
213
- #[ inline] fn is_ascii ( & self ) -> bool { ( * * self ) . is_ascii ( ) }
214
- #[ inline] fn to_ascii_uppercase ( & self ) -> Self { ( * * self ) . to_ascii_uppercase ( ) }
215
- #[ inline] fn to_ascii_lowercase ( & self ) -> Self { ( * * self ) . to_ascii_lowercase ( ) }
216
- #[ inline] fn eq_ignore_ascii_case ( & self , o : & Self ) -> bool { ( * * self ) . eq_ignore_ascii_case ( o) }
217
- #[ inline] fn make_ascii_uppercase ( & mut self ) { ( * * self ) . make_ascii_uppercase ( ) }
218
- #[ inline] fn make_ascii_lowercase ( & mut self ) { ( * * self ) . make_ascii_lowercase ( ) }
219
-
220
- fn into_ascii_lowercase ( mut self ) -> Self {
221
- unsafe {
222
- for byte in self . as_mut_vec ( ) {
223
- * byte = byte. to_ascii_lowercase ( )
224
- }
225
- }
226
- self
227
- }
228
-
229
- fn into_ascii_uppercase ( mut self ) -> Self {
230
- unsafe {
231
- for byte in self . as_mut_vec ( ) {
232
- * byte = byte. to_ascii_uppercase ( )
233
- }
234
- }
235
- self
236
- }
237
- }
238
-
239
- /// Implement `into_ascii_lowercase` and `into_ascii_uppercase` without memory allocation,
240
- /// defer other methods to `[u8]`.
241
- #[ stable( feature = "into_ascii" , since = "1.8.0" ) ]
242
- impl AsciiExt for Vec < u8 > {
243
- type Owned = Self ;
244
-
245
- #[ inline] fn is_ascii ( & self ) -> bool { ( * * self ) . is_ascii ( ) }
246
- #[ inline] fn to_ascii_uppercase ( & self ) -> Self { ( * * self ) . to_ascii_uppercase ( ) }
247
- #[ inline] fn to_ascii_lowercase ( & self ) -> Self { ( * * self ) . to_ascii_lowercase ( ) }
248
- #[ inline] fn eq_ignore_ascii_case ( & self , o : & Self ) -> bool { ( * * self ) . eq_ignore_ascii_case ( o) }
249
- #[ inline] fn make_ascii_uppercase ( & mut self ) { ( * * self ) . make_ascii_uppercase ( ) }
250
- #[ inline] fn make_ascii_lowercase ( & mut self ) { ( * * self ) . make_ascii_lowercase ( ) }
251
-
252
- fn into_ascii_lowercase ( mut self ) -> Self {
253
- for byte in & mut self {
254
- * byte = byte. to_ascii_lowercase ( )
255
- }
256
- self
257
- }
258
-
259
- fn into_ascii_uppercase ( mut self ) -> Self {
260
- for byte in & mut self {
261
- * byte = byte. to_ascii_uppercase ( )
262
- }
263
- self
264
- }
265
163
}
266
164
267
165
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -404,6 +302,52 @@ impl AsciiExt for char {
404
302
fn make_ascii_lowercase ( & mut self ) { * self = self . to_ascii_lowercase ( ) ; }
405
303
}
406
304
305
+ /// Extension methods for ASCII-subset only operations on owned strings
306
+ #[ unstable( feature = "owned_ascii_ext" , reason = "recently (re) added" , issue = "27809" ) ]
307
+ pub trait OwnedAsciiExt {
308
+ /// Converts the string to ASCII upper case:
309
+ /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
310
+ /// but non-ASCII letters are unchanged.
311
+ #[ unstable( feature = "owned_ascii_ext" , reason = "recently (re) added" , issue = "27809" ) ]
312
+ fn into_ascii_uppercase ( self ) -> Self ;
313
+
314
+ /// Converts the string to ASCII lower case:
315
+ /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
316
+ /// but non-ASCII letters are unchanged.
317
+ #[ unstable( feature = "owned_ascii_ext" , reason = "recently (re) added" , issue = "27809" ) ]
318
+ fn into_ascii_lowercase ( self ) -> Self ;
319
+ }
320
+
321
+ #[ unstable( feature = "owned_ascii_ext" , reason = "recently (re) added" , issue = "27809" ) ]
322
+ impl OwnedAsciiExt for String {
323
+ #[ inline]
324
+ fn into_ascii_uppercase ( self ) -> String {
325
+ // Vec<u8>::into_ascii_uppercase() preserves the UTF-8 invariant.
326
+ unsafe { String :: from_utf8_unchecked ( self . into_bytes ( ) . into_ascii_uppercase ( ) ) }
327
+ }
328
+
329
+ #[ inline]
330
+ fn into_ascii_lowercase ( self ) -> String {
331
+ // Vec<u8>::into_ascii_lowercase() preserves the UTF-8 invariant.
332
+ unsafe { String :: from_utf8_unchecked ( self . into_bytes ( ) . into_ascii_lowercase ( ) ) }
333
+ }
334
+ }
335
+
336
+ #[ unstable( feature = "owned_ascii_ext" , reason = "recently (re) added" , issue = "27809" ) ]
337
+ impl OwnedAsciiExt for Vec < u8 > {
338
+ #[ inline]
339
+ fn into_ascii_uppercase ( mut self ) -> Vec < u8 > {
340
+ self . make_ascii_uppercase ( ) ;
341
+ self
342
+ }
343
+
344
+ #[ inline]
345
+ fn into_ascii_lowercase ( mut self ) -> Vec < u8 > {
346
+ self . make_ascii_lowercase ( ) ;
347
+ self
348
+ }
349
+ }
350
+
407
351
/// An iterator over the escaped version of a byte, constructed via
408
352
/// `std::ascii::escape_default`.
409
353
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -669,4 +613,11 @@ mod tests {
669
613
& from_u32( lower) . unwrap( ) . to_string( ) ) ) ;
670
614
}
671
615
}
616
+
617
+ #[ test]
618
+ /// https://github.com/rust-lang/rust/issues/32074
619
+ fn test_issue_32074_regression ( ) {
620
+ let x = "a" . to_string ( ) ;
621
+ assert ! ( x. eq_ignore_ascii_case( "A" ) ) ;
622
+ }
672
623
}
0 commit comments