base45 3.2.0

Encoder/decoder for base45
Documentation
use criterion::{black_box, criterion_group, criterion_main, Criterion};

const QUICK_BROWN_FOX_ENC: &str =
    "8UADZCKFEOEDJOD2KC54EM-DX.CH8FSKDQ$D.OE44E5$CS44+8DK44OEC3EFGVCD2";
const QUICK_BROWN_FOX_DEC: &str = "The quick brown fox jumps over the lazy dog";
fn encode(c: &mut Criterion) {
    c.bench_function("encode long string", |b| {
        b.iter(|| base45::encode(black_box("The quick brown fox jumps over the lazy dog")))
    });
}

fn encode_from_buffer(c: &mut Criterion) {
    c.bench_function("encode long string from buffer", |b| {
        b.iter(|| {
            base45::encode(black_box(vec![
                84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111,
                120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32,
                108, 97, 122, 121, 32, 100, 111, 103,
            ]))
        })
    });
}

fn decode(c: &mut Criterion) {
    c.bench_function("decode long string", |b| {
        b.iter(|| {
            String::from_utf8(
                base45::decode(black_box(
                    "8UADZCKFEOEDJOD2KC54EM-DX.CH8FSKDQ$D.OE44E5$CS44+8DK44OEC3EFGVCD2",
                ))
                .unwrap(),
            )
            .unwrap()
        })
    });
}

fn bench_encode_quick_brown_fox(c: &mut Criterion) {
    c.bench_function("encode long str 100 times", |b| {
        b.iter(|| {
            for _ in 0..100 {
                let text = String::from(QUICK_BROWN_FOX_DEC);
                let encoded = base45::encode(&text);
                assert_eq!(encoded, QUICK_BROWN_FOX_ENC);
            }
        })
    });
}

fn rbe<const N: usize>(c: &mut Criterion) {
    use rand::*;
    let mut rng = thread_rng();
    let mut b = [0u8; N];
    rng.fill_bytes(&mut b);
    c.bench_function(&format!("encode {:#x} random bytes", N), |bench| {
        bench.iter(|| {
            let encoded = base45::encode(&b[..]);
            assert!(encoded.is_ascii());
        })
    });
}
fn bench_encode_random_0x10(b: &mut Criterion) {
    rbe::<0x10>(b);
}
fn bench_encode_random_0x100(b: &mut Criterion) {
    rbe::<0x100>(b);
}
fn bench_encode_random_0x1000(b: &mut Criterion) {
    rbe::<0x1000>(b);
}
fn bench_encode_random_0x10000(b: &mut Criterion) {
    rbe::<0x10000>(b);
}

fn bench_decode_quick_brown_fox(c: &mut Criterion) {
    c.bench_function("decode long str 100 times", |b| {
        b.iter(|| {
            for _ in 0..100 {
                let text = String::from(QUICK_BROWN_FOX_ENC);
                if let Ok(decoded) = base45::decode(&text) {
                    assert_eq!(decoded, QUICK_BROWN_FOX_DEC.as_bytes());
                }
            }
        })
    });
}

criterion_group!(
    benches,
    encode,
    encode_from_buffer,
    decode,
    bench_encode_quick_brown_fox,
    bench_decode_quick_brown_fox,
    bench_encode_random_0x10,
    bench_encode_random_0x100,
    bench_encode_random_0x1000,
    bench_encode_random_0x10000
);
criterion_main!(benches);