void pack_roundtrip_check <T>(BitSize bitcount) where T : unmanaged { var src = Random.BitString(bitcount); Claim.eq(bitcount, src.Length); var x = src.ToBits(); Claim.eq(bitcount, x.Length); var y = Bits.pack(x); var sizeT = size <T>(); var q = Math.DivRem(bitcount, 8, out int r); var bytes = q + (r == 0 ? 0 : 1); Claim.eq(bytes, y.Length); var bulk = ByteSpan.ReadValues <T>(y, out Span <byte> rem); var merged = rem.Length != 0 ? bulk.Extend(bulk.Length + 1) : bulk; if (merged.Length != bulk.Length) { merged[merged.Length - 1] = rem.TakeScalar <T>(); } var bsOutput = merged.ToBitString().Truncate(bitcount); Claim.eq(src, bsOutput); Claim.eq((src & ~bsOutput).PopCount(), 0); }
void VerifySpanBytesToValues <T>(Span <byte> src, Span <T> expect) where T : struct { Claim.eq(expect, ByteSpan.ReadValues <T>(src)); }