Auto merge of #130511 - bjoernager:const-char-encode-utf8, r=dtolnay · qinheping/verify-rust-std@6210ecb (original) (raw)
`@@ -672,8 +672,9 @@ impl char {
`
672
672
`/// 'ß'.encode_utf8(&mut b);
`
673
673
```` /// ```
````
674
674
`#[stable(feature = "unicode_encode_char", since = "1.15.0")]
`
``
675
`+
#[rustc_const_unstable(feature = "const_char_encode_utf8", issue = "130512")]
`
675
676
`#[inline]
`
676
``
`-
pub fn encode_utf8(self, dst: &mut [u8]) -> &mut str {
`
``
677
`+
pub const fn encode_utf8(self, dst: &mut [u8]) -> &mut str {
`
677
678
`` // SAFETY: char
is not a surrogate, so this is valid UTF-8.
``
678
679
`unsafe { from_utf8_unchecked_mut(encode_utf8_raw(self as u32, dst)) }
`
679
680
`}
`
`@@ -1735,14 +1736,11 @@ impl EscapeDebugExtArgs {
`
1735
1736
``
1736
1737
`#[inline]
`
1737
1738
`const fn len_utf8(code: u32) -> usize {
`
1738
``
`-
if code < MAX_ONE_B {
`
1739
``
`-
1
`
1740
``
`-
} else if code < MAX_TWO_B {
`
1741
``
`-
2
`
1742
``
`-
} else if code < MAX_THREE_B {
`
1743
``
`-
3
`
1744
``
`-
} else {
`
1745
``
`-
4
`
``
1739
`+
match code {
`
``
1740
`+
..MAX_ONE_B => 1,
`
``
1741
`+
..MAX_TWO_B => 2,
`
``
1742
`+
..MAX_THREE_B => 3,
`
``
1743
`+
_ => 4,
`
1746
1744
`}
`
1747
1745
`}
`
1748
1746
``
`@@ -1760,11 +1758,12 @@ const fn len_utf8(code: u32) -> usize {
`
1760
1758
`/// Panics if the buffer is not large enough.
`
1761
1759
`` /// A buffer of length four is large enough to encode any char
.
``
1762
1760
`#[unstable(feature = "char_internals", reason = "exposed only for libstd", issue = "none")]
`
``
1761
`+
#[rustc_const_unstable(feature = "const_char_encode_utf8", issue = "130512")]
`
1763
1762
`#[doc(hidden)]
`
1764
1763
`#[inline]
`
1765
``
`-
pub fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> &mut [u8] {
`
``
1764
`+
pub const fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> &mut [u8] {
`
1766
1765
`let len = len_utf8(code);
`
1767
``
`-
match (len, &mut dst[..]) {
`
``
1766
`+
match (len, &mut *dst) {
`
1768
1767
`(1, [a, ..]) => {
`
1769
1768
`*a = code as u8;
`
1770
1769
`}
`
`@@ -1783,14 +1782,11 @@ pub fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> &mut [u8] {
`
1783
1782
`*c = (code >> 6 & 0x3F) as u8 | TAG_CONT;
`
1784
1783
`*d = (code & 0x3F) as u8 | TAG_CONT;
`
1785
1784
`}
`
1786
``
`-
_ => panic!(
`
1787
``
`-
"encode_utf8: need {} bytes to encode U+{:X}, but the buffer has {}",
`
1788
``
`-
len,
`
1789
``
`-
code,
`
1790
``
`-
dst.len(),
`
1791
``
`-
),
`
``
1785
`+
// Note that we cannot format in constant expressions.
`
``
1786
`+
_ => panic!("encode_utf8: buffer does not have enough bytes to encode code point"),
`
1792
1787
`};
`
1793
``
`-
&mut dst[..len]
`
``
1788
`` +
// SAFETY: <&mut [u8]>::as_mut_ptr
is guaranteed to return a valid pointer and len
has been tested to be within bounds.
``
``
1789
`+
unsafe { slice::from_raw_parts_mut(dst.as_mut_ptr(), len) }
`
1794
1790
`}
`
1795
1791
``
1796
1792
`` /// Encodes a raw u32 value as UTF-16 into the provided u16
buffer,
``