summaryrefslogtreecommitdiffstats
path: root/library/core/src/char
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
commitc23a457e72abe608715ac76f076f47dc42af07a5 (patch)
tree2772049aaf84b5c9d0ed12ec8d86812f7a7904b6 /library/core/src/char
parentReleasing progress-linux version 1.73.0+dfsg1-1~progress7.99u1. (diff)
downloadrustc-c23a457e72abe608715ac76f076f47dc42af07a5.tar.xz
rustc-c23a457e72abe608715ac76f076f47dc42af07a5.zip
Merging upstream version 1.74.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/core/src/char')
-rw-r--r--library/core/src/char/convert.rs38
-rw-r--r--library/core/src/char/methods.rs52
2 files changed, 87 insertions, 3 deletions
diff --git a/library/core/src/char/convert.rs b/library/core/src/char/convert.rs
index b84e4b35b..453de9754 100644
--- a/library/core/src/char/convert.rs
+++ b/library/core/src/char/convert.rs
@@ -87,20 +87,54 @@ impl From<char> for u128 {
}
}
-/// Map `char` with code point in U+0000..=U+00FF to byte in 0x00..=0xFF with same value, failing
-/// if the code point is greater than U+00FF.
+/// Maps a `char` with code point in U+0000..=U+00FF to a byte in 0x00..=0xFF with same value,
+/// failing if the code point is greater than U+00FF.
///
/// See [`impl From<u8> for char`](char#impl-From<u8>-for-char) for details on the encoding.
#[stable(feature = "u8_from_char", since = "1.59.0")]
impl TryFrom<char> for u8 {
type Error = TryFromCharError;
+ /// Tries to convert a [`char`] into a [`u8`].
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// let a = 'ÿ'; // U+00FF
+ /// let b = 'Ā'; // U+0100
+ /// assert_eq!(u8::try_from(a), Ok(0xFF_u8));
+ /// assert!(u8::try_from(b).is_err());
+ /// ```
#[inline]
fn try_from(c: char) -> Result<u8, Self::Error> {
u8::try_from(u32::from(c)).map_err(|_| TryFromCharError(()))
}
}
+/// Maps a `char` with code point in U+0000..=U+FFFF to a `u16` in 0x0000..=0xFFFF with same value,
+/// failing if the code point is greater than U+FFFF.
+///
+/// This corresponds to the UCS-2 encoding, as specified in ISO/IEC 10646:2003.
+#[stable(feature = "u16_from_char", since = "1.74.0")]
+impl TryFrom<char> for u16 {
+ type Error = TryFromCharError;
+
+ /// Tries to convert a [`char`] into a [`u16`].
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// let trans_rights = '⚧'; // U+26A7
+ /// let ninjas = '🥷'; // U+1F977
+ /// assert_eq!(u16::try_from(trans_rights), Ok(0x26A7_u16));
+ /// assert!(u16::try_from(ninjas).is_err());
+ /// ```
+ #[inline]
+ fn try_from(c: char) -> Result<u16, Self::Error> {
+ u16::try_from(u32::from(c)).map_err(|_| TryFromCharError(()))
+ }
+}
+
/// Maps a byte in 0x00..=0xFF to a `char` whose code point has the same value, in U+0000..=U+00FF.
///
/// Unicode is designed such that this effectively decodes bytes
diff --git a/library/core/src/char/methods.rs b/library/core/src/char/methods.rs
index 515b8d20e..4ac956e7b 100644
--- a/library/core/src/char/methods.rs
+++ b/library/core/src/char/methods.rs
@@ -9,8 +9,58 @@ use crate::unicode::{self, conversions};
use super::*;
impl char {
+ /// The lowest valid code point a `char` can have, `'\0'`.
+ ///
+ /// Unlike integer types, `char` actually has a gap in the middle,
+ /// meaning that the range of possible `char`s is smaller than you
+ /// might expect. Ranges of `char` will automatically hop this gap
+ /// for you:
+ ///
+ /// ```
+ /// #![feature(char_min)]
+ /// let dist = u32::from(char::MAX) - u32::from(char::MIN);
+ /// let size = (char::MIN..=char::MAX).count() as u32;
+ /// assert!(size < dist);
+ /// ```
+ ///
+ /// Despite this gap, the `MIN` and [`MAX`] values can be used as bounds for
+ /// all `char` values.
+ ///
+ /// [`MAX`]: char::MAX
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// #![feature(char_min)]
+ /// # fn something_which_returns_char() -> char { 'a' }
+ /// let c: char = something_which_returns_char();
+ /// assert!(char::MIN <= c);
+ ///
+ /// let value_at_min = u32::from(char::MIN);
+ /// assert_eq!(char::from_u32(value_at_min), Some('\0'));
+ /// ```
+ #[unstable(feature = "char_min", issue = "114298")]
+ pub const MIN: char = '\0';
+
/// The highest valid code point a `char` can have, `'\u{10FFFF}'`.
///
+ /// Unlike integer types, `char` actually has a gap in the middle,
+ /// meaning that the range of possible `char`s is smaller than you
+ /// might expect. Ranges of `char` will automatically hop this gap
+ /// for you:
+ ///
+ /// ```
+ /// #![feature(char_min)]
+ /// let dist = u32::from(char::MAX) - u32::from(char::MIN);
+ /// let size = (char::MIN..=char::MAX).count() as u32;
+ /// assert!(size < dist);
+ /// ```
+ ///
+ /// Despite this gap, the [`MIN`] and `MAX` values can be used as bounds for
+ /// all `char` values.
+ ///
+ /// [`MIN`]: char::MIN
+ ///
/// # Examples
///
/// ```
@@ -18,7 +68,7 @@ impl char {
/// let c: char = something_which_returns_char();
/// assert!(c <= char::MAX);
///
- /// let value_at_max = char::MAX as u32;
+ /// let value_at_max = u32::from(char::MAX);
/// assert_eq!(char::from_u32(value_at_max), Some('\u{10FFFF}'));
/// assert_eq!(char::from_u32(value_at_max + 1), None);
/// ```