The #[mutants::skip] proc macro from the mutants dev-dep was not available
to downstream users, causing compilation failure. Gate it with cfg_attr(test).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
Added cargo-mutants with 88 mutants tested, 59 caught, 0 missed. Added
targeted tests for 254-byte block boundary encoding (interop-verified)
and exact-fit/too-small decode buffer sizing for the batch zero path.
111 tests total (was 106).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Decode rewritten with shrinking-slice pattern (split_first/split_at)
instead of index arithmetic. Decode zeros 14% faster, decode nonzero
flips from 5% behind corncobs to 2% ahead, decode mixed closes to tied.
Encode zeros fast path moved before split_at — now tied with cobs
(was 6% behind). Code size reduced to 821B (was 869B).
Replaced criterion with iai-callgrind for deterministic instruction-count
benchmarks via Valgrind. Zero run-to-run variance. Expanded to 162
benchmarks across 9 sizes.
ucobs now wins or ties 16 of 18 benchmarks vs corncobs and cobs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace all N100 benchmark data with accurate 7840U results. Add emoji
legend (winner/loser/tie) to every comparison row. Update crate property
table, machine description, and recommendation prose to reflect current
competitive picture.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a `legacy-msrv` feature flag that replaces the const
copy_from_slice (Rust 1.93+) with a manual byte loop, allowing
the crate to compile on older toolchains like Xtensa.
All other optimizations (sub-slice scan, zero fast path, decode
batch fill) work on 1.83 without the feature.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Encode: rewrite to two-pass (scan + copy_from_slice) leveraging Rust 1.93's
const fn copy_from_slice for memcpy at runtime while keeping const fn encode.
Sub-slice scan pattern helps LLVM eliminate bounds checks. Added zero byte
fast path for all-zeros workloads. Now leads corncobs on nonzero/mixed encode.
Decode: batch consecutive 0x01 codes (all-zeros data) and fill zeros via
memset instead of per-byte loop. Decode zeros throughput jumps from ~1.2 GB/s
to ~4.6 GB/s, now 3x faster than corncobs on that workload.
Bump MSRV 1.83 → 1.93 for const copy_from_slice.
Update dev-deps: cobs 0.3→0.5, criterion 0.5→0.8, rand 0.8→0.10.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Make `encode` const fn for compile-time COBS encoding (MSRV bumped to 1.83)
- Optimize decode by removing unnecessary branch in inner loop
- Add comprehensive rustdoc with examples for every function
- Add crate-level doc sections: quick start, buffer sizing, framing,
stream parsing, compile-time encoding, error handling
- Expand README with decision matrix, examples section, testing depth
- Bump version to 0.2.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>