89 mutants tested: 59 caught, 30 unviable (type system rejects them), 0 missed. Added mutants dev-dep for #[mutants::skip] on legacy-msrv dead code. Upgraded cargo-mutants to v27. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.2 KiB
3.2 KiB
Changelog
0.3.2 — 2026-04-01
Testing
- Mutation testing: 100% kill rate — 89 mutants tested, 59 caught, 30
unviable (type system rejects them), 0 missed. Uses
cargo-mutantsv27 with nextest. Addedmutantscrate for#[mutants::skip]annotations. - 111 tests (was 106): added block-boundary interop verification against corncobs, exact-fit and too-small decode buffer sizing for the batch zero path.
0.3.1 — 2026-03-31
Performance
- Decode: rewritten with shrinking-slice pattern — decode zeros is 14% faster (25,018 vs 29,114 instructions at 4 KB), decode nonzero flipped from 5% behind corncobs to 2% ahead, decode mixed closed from 8% behind to tied. ucobs now wins or ties 16 of 18 benchmarks.
- Encode zeros: 6% faster — zero fast path moved before
split_atcalls, eliminating per-byte overhead. Now tied with cobs (previously 6% behind). - Code size reduced — 821 B total (was 869 B). Encode 429 B, decode 392 B.
Changed
- Replaced criterion with iai-callgrind — benchmarks now measure
deterministic instruction counts via Valgrind instead of wall-clock time.
Zero run-to-run variance. Requires
valgrindinstalled. - Expanded benchmark coverage — 9 payload sizes (0–4096 B) × 3 patterns × 3 crates × encode/decode = 162 benchmarks, all running in ~2 minutes.
- Code size measurement added to
just benchviajust bench-size. - Mutation testing added via
cargo-mutants(just test-mutants). - Added
mise.tomlfor dev tool management.
0.3.0 — 2026-03-31
Performance
- Encode nonzero/mixed: ~2x faster — uses const
copy_from_slice(memcpy at runtime) via Rust 1.93's stabilization of const slice methods. Sub-slice scan pattern helps LLVM eliminate bounds checks. - Encode zeros: ~50% faster — fast path skips scan loop overhead for leading zero bytes.
- Decode zeros: ~4x faster — batch consecutive
0x01codes and fill zeros viafill(0)(memset) instead of per-byte iteration. - Encode now wins or ties corncobs on nonzero/mixed workloads.
- Decode zeros now leads all competitors by 3x.
Added
legacy-msrvfeature flag — enables compilation on Rust 1.83+ (e.g. Xtensa toolchain) by replacing constcopy_from_slicewith a manual byte loop. All other optimizations (sub-slice scan, zero fast path, decode batch fill) work without this feature on any supported Rust version.
Changed
- MSRV bumped from 1.83 to 1.93 — required for const
copy_from_slice. Use thelegacy-msrvfeature for older toolchains. - Dev-dependencies updated:
cobs0.3 to 0.5,criterion0.5 to 0.8,rand0.8 to 0.10.
0.2.0 — 2026-03-30
Added
const fnencode — encode data at compile time with zero runtime cost.- Comprehensive documentation with 7 usage examples (basic, buffer sizing, framing, stream parsing, compile-time encoding, error handling).
- Initial encode/decode throughput optimizations.
Changed
- MSRV set to 1.83.
0.1.0 — 2026-03-29
- Initial release.
no_std, zero-alloc,unsafe-free COBS encoder and decoder.- 106 tests: canonical vectors, property-based (proptest), fuzz targets,
cross-crate interop with
corncobsandcobs.