slice_find/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
pub mod kmp;
pub mod raita;
pub mod simple;

#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Algorithm {
    KMP,
    Raita,
    Simple,
}

impl Algorithm {
    pub fn slice_find<T: PartialEq + Ord>(&self, haystack: &[T], needle: &[T]) -> Option<usize> {
        match self {
            Self::KMP => kmp::slice_find(haystack, needle),
            Self::Raita => raita::slice_find(haystack, needle),
            Self::Simple => simple::slice_find(haystack, needle),
        }
    }
    pub fn slice_contains<T: PartialEq + Ord>(&self, haystack: &[T], needle: &[T]) -> bool {
        self.slice_find(haystack, needle).is_some()
    }
}

pub fn slice_find<T: PartialEq + Ord>(algo: Algorithm, haystack: &[T], needle: &[T]) -> Option<usize> {
    algo.slice_find(haystack, needle)
}
pub fn slice_contains<T: PartialEq + Ord>(algo: Algorithm, haystack: &[T], needle: &[T]) -> bool {
    algo.slice_contains(haystack, needle)
}

pub trait SliceFind<T: PartialEq>: AsRef<[T]> {
    fn find(&self, needle: impl AsRef<[T]>) -> Option<usize> {
        kmp::slice_find(self.as_ref(), needle.as_ref())
    }
    fn contains(&self, needle: impl AsRef<[T]>) -> bool {
        self.find(needle).is_some()
    }
}

impl<T: PartialEq> SliceFind<T> for Vec<T> {}
impl<T: PartialEq> SliceFind<T> for [T] {}
impl<T: PartialEq, const N: usize> SliceFind<T> for [T; N] {}