public bool Remove(ReadOnlySpan <byte> key) { var len = 1 + sizeof(int) + key.Length; var buffer = ArrayPool <byte> .Shared.Rent(len); try { var span = buffer.AsSpan(0, len); span[0] = (byte)RecordType.Remove; BinaryPrimitives.WriteInt32LittleEndian(span.Slice(1), key.Length); key.CopyTo(span.Slice(1 + sizeof(int))); var transformed = transformer.TransformBlock(span); stream.WriteInt32((int)(Math.Ceiling(span.Length / 1024.0) * 1024.0)); stream.WriteInt32(transformed.Length); stream.Write(transformed); MaybeFlush(); } finally { ArrayPool <byte> .Shared.Return(buffer); } return(true); }
private void Test(IBlockTransformer transformer) { var buffer = Enumerable.Range(0, 128).Select(v => (byte)v).ToArray(); var cmp = Enumerable.Range(0, 128).Select(v => (byte)v).ToArray(); var trans = transformer.TransformBlock(buffer); if (!transformer.MayChangeSize) { Assert.AreEqual(trans.Length, cmp.Length); } Assert.IsTrue(buffer.AsSpan().SequenceEqual(cmp)); var back = new byte[buffer.Length * 2]; var backspan = back.AsSpan(0, transformer.UntransformBlock(trans, back)); Assert.IsTrue(backspan.SequenceEqual(cmp)); }