xutf 1.4.0

Permissive UTF-8/16/32 transcoding, comparison and BOM detection with SIMD ASCII fast paths
Documentation
use divan::Bencher;
use xutf::{AsciiCase, Utf8, Utf16, transcode_into};

const TARGET: usize = 256 * 1024;
const INPUTS: &[&str] = &["cyrillic", "cjk"];

fn input(name: &str) -> String {
	let seed = match name {
		"cyrillic" => "Съешь же ещё этих мягких французских булок да выпей чаю. ",
		"cjk" => "日本語のテキストです。中文文本測試。한국어 텍盛입니다。",
		_ => unreachable!(),
	};
	let mut out = String::with_capacity(TARGET + seed.len());
	while out.len() < TARGET {
		out.push_str(seed);
	}
	out
}

#[divan::bench(args = INPUTS)]
fn bench_utf8_to_utf16(bencher: Bencher, name: &str) {
	let src = input(name);
	let mut dst = vec![0u16; src.len() + 16];
	bencher
		.counter(divan::counter::BytesCount::of_slice(src.as_bytes()))
		.bench_local(|| transcode_into::<Utf8, Utf16>(src.as_bytes(), &mut dst, AsciiCase::Preserve));
}

fn main() {
	divan::main();
}