Skip to content

Commit

Permalink
Merge pull request #472 from epage/char
Browse files Browse the repository at this point in the history
feat(stream): Allow finding chars in byte slices
  • Loading branch information
epage committed Feb 12, 2024
2 parents c88418d + ed56b33 commit 057288f
Showing 1 changed file with 51 additions and 23 deletions.
74 changes: 51 additions & 23 deletions src/stream/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2489,6 +2489,48 @@ impl<'i, 's> FindSlice<(&'s [u8], &'s [u8], &'s [u8])> for &'i [u8] {
}
}

impl<'i> FindSlice<char> for &'i [u8] {
#[inline(always)]
fn find_slice(&self, substr: char) -> Option<usize> {
let mut b = [0; 4];
let substr = substr.encode_utf8(&mut b);
self.find_slice(&*substr)
}
}

impl<'i> FindSlice<(char,)> for &'i [u8] {
#[inline(always)]
fn find_slice(&self, substr: (char,)) -> Option<usize> {
let mut b = [0; 4];
let substr0 = substr.0.encode_utf8(&mut b);
self.find_slice((&*substr0,))
}
}

impl<'i> FindSlice<(char, char)> for &'i [u8] {
#[inline(always)]
fn find_slice(&self, substr: (char, char)) -> Option<usize> {
let mut b = [0; 4];
let substr0 = substr.0.encode_utf8(&mut b);
let mut b = [0; 4];
let substr1 = substr.1.encode_utf8(&mut b);
self.find_slice((&*substr0, &*substr1))
}
}

impl<'i> FindSlice<(char, char, char)> for &'i [u8] {
#[inline(always)]
fn find_slice(&self, substr: (char, char, char)) -> Option<usize> {
let mut b = [0; 4];
let substr0 = substr.0.encode_utf8(&mut b);
let mut b = [0; 4];
let substr1 = substr.1.encode_utf8(&mut b);
let mut b = [0; 4];
let substr2 = substr.2.encode_utf8(&mut b);
self.find_slice((&*substr0, &*substr1, &*substr2))
}
}

impl<'i> FindSlice<u8> for &'i [u8] {
#[inline(always)]
fn find_slice(&self, substr: u8) -> Option<usize> {
Expand Down Expand Up @@ -2555,7 +2597,7 @@ impl<'i, 's> FindSlice<(&'s str, &'s str, &'s str)> for &'i [u8] {
impl<'i, 's> FindSlice<&'s str> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: &'s str) -> Option<usize> {
self.as_bytes().find_slice(substr.as_bytes())
self.as_bytes().find_slice(substr)
}
}

Expand Down Expand Up @@ -2583,70 +2625,56 @@ impl<'i, 's> FindSlice<(&'s str, &'s str, &'s str)> for &'i str {
impl<'i> FindSlice<char> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: char) -> Option<usize> {
let mut b = [0; 4];
let substr = substr.encode_utf8(&mut b);
self.find_slice(&*substr)
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<(char,)> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: (char,)) -> Option<usize> {
let mut b = [0; 4];
let substr0 = substr.0.encode_utf8(&mut b);
self.find_slice((&*substr0,))
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<(char, char)> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: (char, char)) -> Option<usize> {
let mut b = [0; 4];
let substr0 = substr.0.encode_utf8(&mut b);
let mut b = [0; 4];
let substr1 = substr.1.encode_utf8(&mut b);
self.find_slice((&*substr0, &*substr1))
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<(char, char, char)> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: (char, char, char)) -> Option<usize> {
let mut b = [0; 4];
let substr0 = substr.0.encode_utf8(&mut b);
let mut b = [0; 4];
let substr1 = substr.1.encode_utf8(&mut b);
let mut b = [0; 4];
let substr2 = substr.2.encode_utf8(&mut b);
self.find_slice((&*substr0, &*substr1, &*substr2))
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<u8> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: u8) -> Option<usize> {
self.find_slice(substr.as_char())
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<(u8,)> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: (u8,)) -> Option<usize> {
self.find_slice((substr.0.as_char(),))
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<(u8, u8)> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: (u8, u8)) -> Option<usize> {
self.find_slice((substr.0.as_char(), substr.1.as_char()))
self.as_bytes().find_slice(substr)
}
}

impl<'i> FindSlice<(u8, u8, u8)> for &'i str {
#[inline(always)]
fn find_slice(&self, substr: (u8, u8, u8)) -> Option<usize> {
self.find_slice((substr.0.as_char(), substr.1.as_char(), substr.2.as_char()))
self.as_bytes().find_slice(substr)
}
}

Expand Down

0 comments on commit 057288f

Please sign in to comment.