naive_opt

crate Docs Rust Version Apache2/MIT licensed

The optimized naive string-search algorithm.

Features

Compatibility

This crate is implemented to replace the rust std library. However, the method names are different, so please rewrite your code. It shouldn't be too difficult.

compatibility:

| rust std::str | this crate | |:-----------------------------|:---------------------------------------| | std::str::find() | naive_opt::Search::search() | | std::str::rfind() | naive_opt::Search::rsearch() | | std::str::contains() | naive_opt::Search::includes() | | std::str::match_indices() | naive_opt::Search::search_indices() | | std::str::rmatch_indices() | naive_opt::Search::rsearch_indices() |

Ignore ascii case match

This crate supports an ASCII case-insensitive match with each function.

| this crate | |:---------------------------------------------------------| | naive_opt::Search::search_ignore_ascii_case() | | naive_opt::Search::rsearch_ignore_ascii_case() | | naive_opt::Search::includes_ignore_ascii_case() | | naive_opt::Search::search_indices_ignore_ascii_case() | | naive_opt::Search::rsearch_indices_ignore_ascii_case() |

Examples

Example function:

```rust use naiveopt::{stringsearch, stringrsearch}; use naiveopt::{stringsearchindices, stringrsearchindices};

let haystack = "111 a 111b"; let needle = "a"; let r = stringsearch(haystack, needle); asserteq!(r, Some(4));

asserteq!(stringsearch(haystack, "1"), Some(0)); asserteq!(stringrsearch(haystack, "1"), Some(8));

let v: Vec<_> = stringsearchindices("abc345abc901abc", "abc").collect(); asserteq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]); let v: Vec<_> = stringrsearchindices("abc345abc901abc", "abc").collect(); asserteq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]); ```

Example trait: Search

```rust use naive_opt::Search;

let haystack = "111 a 111b"; let needle = "a"; let r = haystack.search(needle); assert_eq!(r, Some(4));

asserteq!(haystack.search("1"), Some(0)); asserteq!(haystack.rsearch("1"), Some(8));

let v: Vec<_> = "abc345abc901abc".searchindices("abc").collect(); asserteq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]); let v: Vec<_> = "abc345abc901abc".rsearchindices("abc").collect(); asserteq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]); ```

Example trait: SearchIn

```rust use naive_opt::SearchIn;

let haystack = "111 a 111b"; let needle = "a"; let r = needle.searchin(haystack); asserteq!(r, Some(4));

asserteq!("1".searchin(haystack), Some(0)); asserteq!("1".rsearchin(haystack), Some(8)); ```

Example Ignore ascii case match

```rust use naive_opt::Search;

let haystack = "111 a 111b"; let needle = "A"; let r = haystack.searchignoreasciicase(needle); asserteq!(r, Some(4)); asserteq!(haystack.rsearchignoreasciicase("A"), Some(4));

let v: Vec<_> = "abc345aBc901abc".searchindicesignoreasciicase("abc").collect(); asserteq!(v, [(0, "abc"), (6, "aBc"), (12, "abc")]); let v: Vec<_> = "abc345aBc901abc".rsearchindicesignoreasciicase("abc").collect(); asserteq!(v, [(12, "abc"), (6, "aBc"), (0, "abc")]);

asserteq!("ignoreasciicase("href"), true); ```

Benchmark results

| name | bench:en | bench:ja | musl:en | musl:ja | |:------------------------|------------:|------------:|------------:|------------:| | stdstrstr | 757.800 μc | 521.920 μc | 728.020 μc | 520.580 μc | | stdstringstring | 760.410 μc | 525.830 μc | 733.070 μc | 536.770 μc | | funcstrstr | 102.100 μc | 121.790 μc | 122.460 μc | 122.300 μc | | funcstringstring | 101.720 μc | 123.290 μc | 102.760 μc | 121.960 μc | | traitstrstr | 98.238 μc | 120.290 μc | 116.560 μc | 117.960 μc | | traitstringstring | 98.459 μc | 120.490 μc | 98.106 μc | 118.940 μc | | stdindices | 470.700 μc | 370.070 μc | 468.480 μc | 392.680 μc | | funcindices | 100.840 μc | 118.750 μc | 101.620 μc | 146.220 μc | | trait_indices | 100.920 μc | 118.810 μc | 101.070 μc | 145.120 μc |

Changelogs

This crate's changelog here.

References

License

This project is licensed under either of

at your option.