|
1 | 1 | //! impl char {}
|
2 | 2 |
|
3 | 3 | use super::*;
|
4 |
| -use crate::hint::unreachable_unchecked; |
5 | 4 | use crate::slice;
|
6 | 5 | use crate::str::from_utf8_unchecked_mut;
|
7 | 6 | use crate::unicode::printable::is_printable;
|
@@ -1767,32 +1766,29 @@ const fn len_utf8(code: u32) -> usize {
|
1767 | 1766 | #[inline]
|
1768 | 1767 | pub const fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> &mut [u8] {
|
1769 | 1768 | let len = len_utf8(code);
|
1770 |
| - // Note that the original message is not const-compatible due to formatting. |
1771 |
| - assert!( |
1772 |
| - len <= dst.len(), |
1773 |
| - "encode_utf8: buffer does not have enough bytes to encode code point", |
1774 |
| - ); |
1775 |
| - match len { |
1776 |
| - 1 => { |
1777 |
| - dst[0x0] = code as u8; |
| 1769 | + match (len, &mut *dst) { |
| 1770 | + (1, [a, ..]) => { |
| 1771 | + *a = code as u8; |
1778 | 1772 | }
|
1779 |
| - 2 => { |
1780 |
| - dst[0x0] = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; |
1781 |
| - dst[0x1] = (code & 0x3F) as u8 | TAG_CONT; |
| 1773 | + (2, [a, b, ..]) => { |
| 1774 | + *a = (code >> 6 & 0x1F) as u8 | TAG_TWO_B; |
| 1775 | + *b = (code & 0x3F) as u8 | TAG_CONT; |
1782 | 1776 | }
|
1783 |
| - 3 => { |
1784 |
| - dst[0x0] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; |
1785 |
| - dst[0x1] = (code >> 6 & 0x3F) as u8 | TAG_CONT; |
1786 |
| - dst[0x2] = (code & 0x3F) as u8 | TAG_CONT; |
| 1777 | + (3, [a, b, c, ..]) => { |
| 1778 | + *a = (code >> 12 & 0x0F) as u8 | TAG_THREE_B; |
| 1779 | + *b = (code >> 6 & 0x3F) as u8 | TAG_CONT; |
| 1780 | + *c = (code & 0x3F) as u8 | TAG_CONT; |
1787 | 1781 | }
|
1788 |
| - 4 => { |
1789 |
| - dst[0x0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; |
1790 |
| - dst[0x1] = (code >> 12 & 0x3F) as u8 | TAG_CONT; |
1791 |
| - dst[0x2] = (code >> 6 & 0x3F) as u8 | TAG_CONT; |
1792 |
| - dst[0x3] = (code & 0x3F) as u8 | TAG_CONT; |
| 1782 | + (4, [a, b, c, d, ..]) => { |
| 1783 | + *a = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; |
| 1784 | + *b = (code >> 12 & 0x3F) as u8 | TAG_CONT; |
| 1785 | + *c = (code >> 6 & 0x3F) as u8 | TAG_CONT; |
| 1786 | + *d = (code & 0x3F) as u8 | TAG_CONT; |
1793 | 1787 | }
|
1794 |
| - _ => unsafe { unreachable_unchecked() }, |
| 1788 | + // Note that the original message is not const-compatible due to formatting. |
| 1789 | + _ => panic!("encode_utf8: buffer does not have enough bytes to encode code point"), |
1795 | 1790 | };
|
| 1791 | + // SAFETY: `<&mut [u8]>::as_mut_ptr` returns a valid pointer and `len` has been tested to be valid. |
1796 | 1792 | unsafe { slice::from_raw_parts_mut(dst.as_mut_ptr(), len) }
|
1797 | 1793 | }
|
1798 | 1794 |
|
|
0 commit comments