Rollup merge of #46077 - LukasKalbertodt:stabilize-ascii-ctype, r=alexcrichton
Stabilize some `ascii_ctype` methods As discussed in #39658, this PR stabilizes those methods for `u8` and `char`. All inherent `ascii_ctype` for `[u8]` and `str` are removed as we prefer the more explicit version `s.chars().all(|c| c.is_ascii_())`. This PR doesn't modify the `AsciiExt` trait. There, the `ascii_ctype` methods are still unstable. It is planned to remove those in the future (I think). I had to modify some code in `ascii.rs` to properly implement `AsciiExt` for all types. Fixes #39658.
This commit is contained in:
commit
963ab91dd4
@ -1626,120 +1626,6 @@ pub fn make_ascii_lowercase(&mut self) {
|
||||
byte.make_ascii_lowercase();
|
||||
}
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII alphabetic characters:
|
||||
///
|
||||
/// - U+0041 'A' ... U+005A 'Z', or
|
||||
/// - U+0061 'a' ... U+007A 'z'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_alphabetic())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII uppercase characters:
|
||||
/// U+0041 'A' ... U+005A 'Z'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_uppercase(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_uppercase())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII lowercase characters:
|
||||
/// U+0061 'a' ... U+007A 'z'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_lowercase(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_lowercase())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII alphanumeric characters:
|
||||
///
|
||||
/// - U+0041 'A' ... U+005A 'Z', or
|
||||
/// - U+0061 'a' ... U+007A 'z', or
|
||||
/// - U+0030 '0' ... U+0039 '9'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_alphanumeric())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII decimal digit:
|
||||
/// U+0030 '0' ... U+0039 '9'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_digit(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_digit())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII hexadecimal digits:
|
||||
///
|
||||
/// - U+0030 '0' ... U+0039 '9', or
|
||||
/// - U+0041 'A' ... U+0046 'F', or
|
||||
/// - U+0061 'a' ... U+0066 'f'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_hexdigit())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII punctuation characters:
|
||||
///
|
||||
/// - U+0021 ... U+002F `! " # $ % & ' ( ) * + , - . /`, or
|
||||
/// - U+003A ... U+0040 `: ; < = > ? @`, or
|
||||
/// - U+005B ... U+0060 `[ \\ ] ^ _ \``, or
|
||||
/// - U+007B ... U+007E `{ | } ~`
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_punctuation(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_punctuation())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII graphic characters:
|
||||
/// U+0021 '@' ... U+007E '~'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_graphic(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_graphic())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII whitespace characters:
|
||||
/// U+0020 SPACE, U+0009 HORIZONTAL TAB, U+000A LINE FEED,
|
||||
/// U+000C FORM FEED, or U+000D CARRIAGE RETURN.
|
||||
///
|
||||
/// Rust uses the WhatWG Infra Standard's [definition of ASCII
|
||||
/// whitespace][infra-aw]. There are several other definitions in
|
||||
/// wide use. For instance, [the POSIX locale][pct] includes
|
||||
/// U+000B VERTICAL TAB as well as all the above characters,
|
||||
/// but—from the very same specification—[the default rule for
|
||||
/// "field splitting" in the Bourne shell][bfs] considers *only*
|
||||
/// SPACE, HORIZONTAL TAB, and LINE FEED as whitespace.
|
||||
///
|
||||
/// If you are writing a program that will process an existing
|
||||
/// file format, check what that format's definition of whitespace is
|
||||
/// before using this function.
|
||||
///
|
||||
/// [infra-aw]: https://infra.spec.whatwg.org/#ascii-whitespace
|
||||
/// [pct]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01
|
||||
/// [bfs]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_whitespace(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_whitespace())
|
||||
}
|
||||
|
||||
/// Checks if all bytes of this slice are ASCII control characters:
|
||||
///
|
||||
/// - U+0000 NUL ... U+001F UNIT SEPARATOR, or
|
||||
/// - U+007F DELETE.
|
||||
///
|
||||
/// Note that most ASCII whitespace characters are control
|
||||
/// characters, but SPACE is not.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_control(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_control())
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2199,153 +2199,6 @@ pub fn make_ascii_lowercase(&mut self) {
|
||||
let me = unsafe { self.as_bytes_mut() };
|
||||
me.make_ascii_lowercase()
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII alphabetic
|
||||
/// characters:
|
||||
///
|
||||
/// - U+0041 'A' ... U+005A 'Z', or
|
||||
/// - U+0061 'a' ... U+007A 'z'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_alphabetic())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII uppercase characters:
|
||||
/// U+0041 'A' ... U+005A 'Z'.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(ascii_ctype)]
|
||||
///
|
||||
/// // Only ascii uppercase characters
|
||||
/// assert!("HELLO".is_ascii_uppercase());
|
||||
///
|
||||
/// // While all characters are ascii, 'y' and 'e' are not uppercase
|
||||
/// assert!(!"Bye".is_ascii_uppercase());
|
||||
///
|
||||
/// // While all characters are uppercase, 'Ü' is not ascii
|
||||
/// assert!(!"TSCHÜSS".is_ascii_uppercase());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_uppercase(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_uppercase())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII lowercase characters:
|
||||
/// U+0061 'a' ... U+007A 'z'.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(ascii_ctype)]
|
||||
///
|
||||
/// // Only ascii uppercase characters
|
||||
/// assert!("hello".is_ascii_lowercase());
|
||||
///
|
||||
/// // While all characters are ascii, 'B' is not lowercase
|
||||
/// assert!(!"Bye".is_ascii_lowercase());
|
||||
///
|
||||
/// // While all characters are lowercase, 'Ü' is not ascii
|
||||
/// assert!(!"tschüss".is_ascii_lowercase());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_lowercase(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_lowercase())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII alphanumeric
|
||||
/// characters:
|
||||
///
|
||||
/// - U+0041 'A' ... U+005A 'Z', or
|
||||
/// - U+0061 'a' ... U+007A 'z', or
|
||||
/// - U+0030 '0' ... U+0039 '9'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_alphanumeric())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII decimal digit:
|
||||
/// U+0030 '0' ... U+0039 '9'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_digit(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_digit())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII hexadecimal digits:
|
||||
///
|
||||
/// - U+0030 '0' ... U+0039 '9', or
|
||||
/// - U+0041 'A' ... U+0046 'F', or
|
||||
/// - U+0061 'a' ... U+0066 'f'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_hexdigit())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII punctuation
|
||||
/// characters:
|
||||
///
|
||||
/// - U+0021 ... U+002F `! " # $ % & ' ( ) * + , - . /`, or
|
||||
/// - U+003A ... U+0040 `: ; < = > ? @`, or
|
||||
/// - U+005B ... U+0060 ``[ \ ] ^ _ ` ``, or
|
||||
/// - U+007B ... U+007E `{ | } ~`
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_punctuation(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_punctuation())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII graphic characters:
|
||||
/// U+0021 '@' ... U+007E '~'.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_graphic(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_graphic())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII whitespace characters:
|
||||
/// U+0020 SPACE, U+0009 HORIZONTAL TAB, U+000A LINE FEED,
|
||||
/// U+000C FORM FEED, or U+000D CARRIAGE RETURN.
|
||||
///
|
||||
/// Rust uses the WhatWG Infra Standard's [definition of ASCII
|
||||
/// whitespace][infra-aw]. There are several other definitions in
|
||||
/// wide use. For instance, [the POSIX locale][pct] includes
|
||||
/// U+000B VERTICAL TAB as well as all the above characters,
|
||||
/// but—from the very same specification—[the default rule for
|
||||
/// "field splitting" in the Bourne shell][bfs] considers *only*
|
||||
/// SPACE, HORIZONTAL TAB, and LINE FEED as whitespace.
|
||||
///
|
||||
/// If you are writing a program that will process an existing
|
||||
/// file format, check what that format's definition of whitespace is
|
||||
/// before using this function.
|
||||
///
|
||||
/// [infra-aw]: https://infra.spec.whatwg.org/#ascii-whitespace
|
||||
/// [pct]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01
|
||||
/// [bfs]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_whitespace(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_whitespace())
|
||||
}
|
||||
|
||||
/// Checks if all characters of this string are ASCII control characters:
|
||||
///
|
||||
/// - U+0000 NUL ... U+001F UNIT SEPARATOR, or
|
||||
/// - U+007F DELETE.
|
||||
///
|
||||
/// Note that most ASCII whitespace characters are control
|
||||
/// characters, but SPACE is not.
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[inline]
|
||||
pub fn is_ascii_control(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_control())
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts a boxed slice of bytes to a boxed string slice without checking
|
||||
|
@ -2438,7 +2438,7 @@ pub fn make_ascii_lowercase(&mut self) {
|
||||
/// assert!(!lf.is_ascii_alphabetic());
|
||||
/// assert!(!esc.is_ascii_alphabetic());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
if *self >= 0x80 { return false; }
|
||||
@ -2476,7 +2476,7 @@ pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_uppercase());
|
||||
/// assert!(!esc.is_ascii_uppercase());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_uppercase(&self) -> bool {
|
||||
if *self >= 0x80 { return false }
|
||||
@ -2514,7 +2514,7 @@ pub fn is_ascii_uppercase(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_lowercase());
|
||||
/// assert!(!esc.is_ascii_lowercase());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_lowercase(&self) -> bool {
|
||||
if *self >= 0x80 { return false }
|
||||
@ -2555,7 +2555,7 @@ pub fn is_ascii_lowercase(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_alphanumeric());
|
||||
/// assert!(!esc.is_ascii_alphanumeric());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
if *self >= 0x80 { return false }
|
||||
@ -2593,7 +2593,7 @@ pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_digit());
|
||||
/// assert!(!esc.is_ascii_digit());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_digit(&self) -> bool {
|
||||
if *self >= 0x80 { return false }
|
||||
@ -2634,7 +2634,7 @@ pub fn is_ascii_digit(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_hexdigit());
|
||||
/// assert!(!esc.is_ascii_hexdigit());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
if *self >= 0x80 { return false }
|
||||
@ -2676,7 +2676,7 @@ pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_punctuation());
|
||||
/// assert!(!esc.is_ascii_punctuation());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_punctuation(&self) -> bool {
|
||||
if *self >= 0x80 { return false }
|
||||
@ -2714,7 +2714,7 @@ pub fn is_ascii_punctuation(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_graphic());
|
||||
/// assert!(!esc.is_ascii_graphic());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_graphic(&self) -> bool {
|
||||
if *self >= 0x80 { return false; }
|
||||
@ -2769,7 +2769,7 @@ pub fn is_ascii_graphic(&self) -> bool {
|
||||
/// assert!(lf.is_ascii_whitespace());
|
||||
/// assert!(!esc.is_ascii_whitespace());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_whitespace(&self) -> bool {
|
||||
if *self >= 0x80 { return false; }
|
||||
@ -2809,7 +2809,7 @@ pub fn is_ascii_whitespace(&self) -> bool {
|
||||
/// assert!(lf.is_ascii_control());
|
||||
/// assert!(esc.is_ascii_control());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_control(&self) -> bool {
|
||||
if *self >= 0x80 { return false; }
|
||||
|
@ -490,77 +490,199 @@ fn is_ascii_control(&self) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! impl_by_delegating {
|
||||
($ty:ty, $owned:ty) => {
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl AsciiExt for $ty {
|
||||
type Owned = $owned;
|
||||
macro_rules! delegating_ascii_methods {
|
||||
() => {
|
||||
#[inline]
|
||||
fn is_ascii(&self) -> bool { self.is_ascii() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii(&self) -> bool { self.is_ascii() }
|
||||
#[inline]
|
||||
fn to_ascii_uppercase(&self) -> Self::Owned { self.to_ascii_uppercase() }
|
||||
|
||||
#[inline]
|
||||
fn to_ascii_uppercase(&self) -> Self::Owned { self.to_ascii_uppercase() }
|
||||
#[inline]
|
||||
fn to_ascii_lowercase(&self) -> Self::Owned { self.to_ascii_lowercase() }
|
||||
|
||||
#[inline]
|
||||
fn to_ascii_lowercase(&self) -> Self::Owned { self.to_ascii_lowercase() }
|
||||
#[inline]
|
||||
fn eq_ignore_ascii_case(&self, o: &Self) -> bool { self.eq_ignore_ascii_case(o) }
|
||||
|
||||
#[inline]
|
||||
fn eq_ignore_ascii_case(&self, o: &Self) -> bool { self.eq_ignore_ascii_case(o) }
|
||||
#[inline]
|
||||
fn make_ascii_uppercase(&mut self) { self.make_ascii_uppercase(); }
|
||||
|
||||
#[inline]
|
||||
fn make_ascii_uppercase(&mut self) { self.make_ascii_uppercase(); }
|
||||
|
||||
#[inline]
|
||||
fn make_ascii_lowercase(&mut self) { self.make_ascii_lowercase(); }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphabetic(&self) -> bool { self.is_ascii_alphabetic() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_uppercase(&self) -> bool { self.is_ascii_uppercase() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_lowercase(&self) -> bool { self.is_ascii_lowercase() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphanumeric(&self) -> bool { self.is_ascii_alphanumeric() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_digit(&self) -> bool { self.is_ascii_digit() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_hexdigit(&self) -> bool { self.is_ascii_hexdigit() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_punctuation(&self) -> bool { self.is_ascii_punctuation() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_graphic(&self) -> bool { self.is_ascii_graphic() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_whitespace(&self) -> bool { self.is_ascii_whitespace() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_control(&self) -> bool { self.is_ascii_control() }
|
||||
}
|
||||
#[inline]
|
||||
fn make_ascii_lowercase(&mut self) { self.make_ascii_lowercase(); }
|
||||
}
|
||||
}
|
||||
|
||||
impl_by_delegating!(u8, u8);
|
||||
impl_by_delegating!(char, char);
|
||||
macro_rules! delegating_ascii_ctype_methods {
|
||||
() => {
|
||||
#[inline]
|
||||
fn is_ascii_alphabetic(&self) -> bool { self.is_ascii_alphabetic() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_uppercase(&self) -> bool { self.is_ascii_uppercase() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_lowercase(&self) -> bool { self.is_ascii_lowercase() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphanumeric(&self) -> bool { self.is_ascii_alphanumeric() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_digit(&self) -> bool { self.is_ascii_digit() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_hexdigit(&self) -> bool { self.is_ascii_hexdigit() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_punctuation(&self) -> bool { self.is_ascii_punctuation() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_graphic(&self) -> bool { self.is_ascii_graphic() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_whitespace(&self) -> bool { self.is_ascii_whitespace() }
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_control(&self) -> bool { self.is_ascii_control() }
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl AsciiExt for u8 {
|
||||
type Owned = u8;
|
||||
|
||||
delegating_ascii_methods!();
|
||||
delegating_ascii_ctype_methods!();
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl AsciiExt for char {
|
||||
type Owned = char;
|
||||
|
||||
delegating_ascii_methods!();
|
||||
delegating_ascii_ctype_methods!();
|
||||
}
|
||||
|
||||
// FIXME(LukasKalbertodt): the macro invocation should replace the impl block
|
||||
// for `[u8]` above. But this is not possible until the stage0 compiler is new
|
||||
// enough to contain the inherent ascii methods for `[u8]`.
|
||||
#[cfg(not(stage0))]
|
||||
impl_by_delegating!([u8], Vec<u8>);
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl AsciiExt for [u8] {
|
||||
type Owned = Vec<u8>;
|
||||
|
||||
delegating_ascii_methods!();
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphabetic(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_alphabetic())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_uppercase(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_uppercase())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_lowercase(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_lowercase())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphanumeric(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_alphanumeric())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_digit(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_digit())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_hexdigit(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_hexdigit())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_punctuation(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_punctuation())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_graphic(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_graphic())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_whitespace(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_whitespace())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_control(&self) -> bool {
|
||||
self.iter().all(|b| b.is_ascii_control())
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME(LukasKalbertodt): the macro invocation should replace the impl block
|
||||
// for `str` above. But this is not possible until the stage0 compiler is new
|
||||
// enough to contain the inherent ascii methods for `str`.
|
||||
#[cfg(not(stage0))]
|
||||
impl_by_delegating!(str, String);
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl AsciiExt for str {
|
||||
type Owned = String;
|
||||
|
||||
delegating_ascii_methods!();
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphabetic(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_alphabetic())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_uppercase(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_uppercase())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_lowercase(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_lowercase())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_alphanumeric(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_alphanumeric())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_digit(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_digit())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_hexdigit(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_hexdigit())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_punctuation(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_punctuation())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_graphic(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_graphic())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_whitespace(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_whitespace())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_ascii_control(&self) -> bool {
|
||||
self.bytes().all(|b| b.is_ascii_control())
|
||||
}
|
||||
}
|
||||
|
||||
/// An iterator over the escaped version of a byte.
|
||||
///
|
||||
@ -684,6 +806,7 @@ mod tests {
|
||||
//! Note that most of these tests are not testing `AsciiExt` methods, but
|
||||
//! test inherent ascii methods of char, u8, str and [u8]. `AsciiExt` is
|
||||
//! just using those methods, though.
|
||||
use super::AsciiExt;
|
||||
use char::from_u32;
|
||||
|
||||
#[test]
|
||||
|
@ -1109,7 +1109,7 @@ pub fn make_ascii_lowercase(&mut self) {
|
||||
/// assert!(!lf.is_ascii_alphabetic());
|
||||
/// assert!(!esc.is_ascii_alphabetic());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_alphabetic()
|
||||
@ -1143,7 +1143,7 @@ pub fn is_ascii_alphabetic(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_uppercase());
|
||||
/// assert!(!esc.is_ascii_uppercase());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_uppercase(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_uppercase()
|
||||
@ -1177,7 +1177,7 @@ pub fn is_ascii_uppercase(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_lowercase());
|
||||
/// assert!(!esc.is_ascii_lowercase());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_lowercase(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_lowercase()
|
||||
@ -1214,7 +1214,7 @@ pub fn is_ascii_lowercase(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_alphanumeric());
|
||||
/// assert!(!esc.is_ascii_alphanumeric());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_alphanumeric()
|
||||
@ -1248,7 +1248,7 @@ pub fn is_ascii_alphanumeric(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_digit());
|
||||
/// assert!(!esc.is_ascii_digit());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_digit(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_digit()
|
||||
@ -1285,7 +1285,7 @@ pub fn is_ascii_digit(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_hexdigit());
|
||||
/// assert!(!esc.is_ascii_hexdigit());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_hexdigit()
|
||||
@ -1323,7 +1323,7 @@ pub fn is_ascii_hexdigit(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_punctuation());
|
||||
/// assert!(!esc.is_ascii_punctuation());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_punctuation(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_punctuation()
|
||||
@ -1357,7 +1357,7 @@ pub fn is_ascii_punctuation(&self) -> bool {
|
||||
/// assert!(!lf.is_ascii_graphic());
|
||||
/// assert!(!esc.is_ascii_graphic());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_graphic(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_graphic()
|
||||
@ -1408,7 +1408,7 @@ pub fn is_ascii_graphic(&self) -> bool {
|
||||
/// assert!(lf.is_ascii_whitespace());
|
||||
/// assert!(!esc.is_ascii_whitespace());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_whitespace(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_whitespace()
|
||||
@ -1444,7 +1444,7 @@ pub fn is_ascii_whitespace(&self) -> bool {
|
||||
/// assert!(lf.is_ascii_control());
|
||||
/// assert!(esc.is_ascii_control());
|
||||
/// ```
|
||||
#[unstable(feature = "ascii_ctype", issue = "39658")]
|
||||
#[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
|
||||
#[inline]
|
||||
pub fn is_ascii_control(&self) -> bool {
|
||||
self.is_ascii() && (*self as u8).is_ascii_control()
|
||||
|
Loading…
Reference in New Issue
Block a user