Beispiel #1
0
        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));
        }