#![deny(missing_docs)]
#![cfg_attr(not(feature = "runtime-dispatch-simd"), no_std)]
#[cfg(not(feature = "runtime-dispatch-simd"))]
use core::mem;
#[cfg(feature = "runtime-dispatch-simd")]
use std::mem;
mod naive;
pub use naive::*;
mod integer_simd;
#[cfg(any(
all(
feature = "runtime-dispatch-simd",
any(target_arch = "x86", target_arch = "x86_64")
),
target_arch = "aarch64",
target_arch = "wasm32",
feature = "generic-simd"
))]
mod simd;
pub fn count(haystack: &[u8], needle: u8) -> usize {
if haystack.len() >= 32 {
#[cfg(all(feature = "runtime-dispatch-simd", target_arch = "x86_64"))]
{
if is_x86_feature_detected!("avx2") {
unsafe {
return simd::x86_avx2::chunk_count(haystack, needle);
}
}
}
#[cfg(feature = "generic-simd")]
return simd::generic::chunk_count(haystack, needle);
}
if haystack.len() >= 16 {
#[cfg(all(
feature = "runtime-dispatch-simd",
any(target_arch = "x86", target_arch = "x86_64"),
not(feature = "generic-simd")
))]
{
if is_x86_feature_detected!("sse2") {
unsafe {
return simd::x86_sse2::chunk_count(haystack, needle);
}
}
}
#[cfg(all(target_arch = "aarch64", not(feature = "generic_simd")))]
{
unsafe {
return simd::aarch64::chunk_count(haystack, needle);
}
}
#[cfg(target_arch = "wasm32")]
{
unsafe {
return simd::wasm::chunk_count(haystack, needle);
}
}
}
if haystack.len() >= mem::size_of::<usize>() {
return integer_simd::chunk_count(haystack, needle);
}
naive_count(haystack, needle)
}
pub fn num_chars(utf8_chars: &[u8]) -> usize {
if utf8_chars.len() >= 32 {
#[cfg(all(feature = "runtime-dispatch-simd", target_arch = "x86_64"))]
{
if is_x86_feature_detected!("avx2") {
unsafe {
return simd::x86_avx2::chunk_num_chars(utf8_chars);
}
}
}
#[cfg(feature = "generic-simd")]
return simd::generic::chunk_num_chars(utf8_chars);
}
if utf8_chars.len() >= 16 {
#[cfg(all(
feature = "runtime-dispatch-simd",
any(target_arch = "x86", target_arch = "x86_64"),
not(feature = "generic-simd")
))]
{
if is_x86_feature_detected!("sse2") {
unsafe {
return simd::x86_sse2::chunk_num_chars(utf8_chars);
}
}
}
#[cfg(all(target_arch = "aarch64", not(feature = "generic_simd")))]
{
unsafe {
return simd::aarch64::chunk_num_chars(utf8_chars);
}
}
#[cfg(target_arch = "wasm32")]
{
unsafe {
return simd::wasm::chunk_num_chars(utf8_chars);
}
}
}
if utf8_chars.len() >= mem::size_of::<usize>() {
return integer_simd::chunk_num_chars(utf8_chars);
}
naive_num_chars(utf8_chars)
}