Skip to content

Commit 30663e7

Browse files
committed
Add grep example binary
1 parent dbb1ded commit 30663e7

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ seq-macro = "0.2"
1616

1717
[dev-dependencies]
1818
cfg-if = "1"
19+
memmap2 = "0.5"
1920

2021
[profile.release]
2122
debug = true

examples/grep.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use memmap2::MmapOptions;
2+
#[cfg(target_arch = "aarch64")]
3+
use sliceslice::aarch64::NeonSearcher;
4+
#[cfg(feature = "stdsimd")]
5+
use sliceslice::stdsimd::StdSimdSearcher;
6+
#[cfg(target_arch = "wasm32")]
7+
use sliceslice::wasm32::Wasm32Searcher;
8+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
9+
use sliceslice::x86::{Avx2Searcher, DynamicAvx2Searcher};
10+
use std::fs::File;
11+
12+
#[inline(never)]
13+
pub fn search_in_slice(backend: &str, needle: &[u8], haystack: &[u8]) -> bool {
14+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
15+
if "avx2".eq_ignore_ascii_case(backend) {
16+
let searcher = unsafe { Avx2Searcher::new(needle) };
17+
return unsafe { searcher.search_in(haystack) };
18+
}
19+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
20+
if "dynamicavx2".eq_ignore_ascii_case(backend) {
21+
let searcher = unsafe { DynamicAvx2Searcher::new(needle) };
22+
return unsafe { searcher.search_in(haystack) };
23+
}
24+
#[cfg(any(target_arch = "aarch64"))]
25+
if "neon".eq_ignore_ascii_case(backend) {
26+
let searcher = unsafe { NeonSearcher::new(needle) };
27+
return unsafe { searcher.search_in(haystack) };
28+
}
29+
#[cfg(feature = "stdsimd")]
30+
if "stdsimd".eq_ignore_ascii_case(backend) {
31+
let searcher = StdSimdSearcher::new(needle);
32+
return searcher.search_in(haystack);
33+
}
34+
#[cfg(any(target_arch = "wasm32"))]
35+
if "wasm32".eq_ignore_ascii_case(backend) {
36+
let searcher = unsafe { Wasm32Searcher::new(needle) };
37+
return unsafe { searcher.search_in(haystack) };
38+
}
39+
panic!("Invalid backend {:?}", backend);
40+
}
41+
42+
fn main() {
43+
let usage = "./grep <backend> <needle> <file>";
44+
let mut args = std::env::args();
45+
args.next().expect(usage);
46+
let backend = args.next().expect(usage);
47+
let needle = args.next().expect(usage);
48+
let filename = args.next().expect(usage);
49+
let file = File::open(&filename).unwrap();
50+
let data = unsafe { MmapOptions::new().map(&file).unwrap() };
51+
println!(
52+
"Searching for {} in {:?}: {}",
53+
needle,
54+
filename,
55+
search_in_slice(&backend, needle.as_bytes(), &data)
56+
);
57+
}

0 commit comments

Comments
 (0)