1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use crate::sealed::Sealed;

pub trait StrExt {
    fn from_ascii_simd(bytes: &[u8]) -> Option<&str>;

    fn from_utf8_simd(bytes: &[u8]) -> Option<&str>;
}

impl Sealed for str {}

impl StrExt for str {
    fn from_ascii_simd(bytes: &[u8]) -> Option<&str> {
        // TODO(blocking): use `unicode_simd::from_ascii`
        bytes.is_ascii().then(|| unsafe { core::str::from_utf8_unchecked(bytes) })
    }

    fn from_utf8_simd(bytes: &[u8]) -> Option<&str> {
        simdutf8::basic::from_utf8(bytes).ok()
    }
}