Example #1
0
        internal Slice[] Grab(Slice[]?slices)
        {
            if (slices == null || slices.Length == 0)
            {
                return(Array.Empty <Slice>());
            }

            lock (m_lock)
            {
                int total = 0;
                for (int i = 0; i < slices.Length; i++)
                {
                    total += slices[i].Count;
                }

                if (total > m_buffer.Length - m_offset)
                {
                    return(FdbKey.Merge(Slice.Empty, slices));
                }

                var res = new Slice[slices.Length];
                for (int i = 0; i < slices.Length; i++)
                {
                    res[i] = Grab(slices[i]);
                }
                return(res);
            }
        }
Example #2
0
        public void Test_FdbKey_Merge()
        {
            // get a bunch of random slices
            var rnd    = new Random();
            var slices = Enumerable.Range(0, 16).Select(x => Slice.Random(rnd, 4 + rnd.Next(32))).ToArray();

            var merged = FdbKey.Merge(Slice.FromByte(42), slices);

            Assert.That(merged, Is.Not.Null);
            Assert.That(merged.Length, Is.EqualTo(slices.Length));

            for (int i = 0; i < slices.Length; i++)
            {
                var expected = Slice.FromByte(42) + slices[i];
                Assert.That(merged[i], Is.EqualTo(expected));

                Assert.That(merged[i].Array, Is.SameAs(merged[0].Array), "All slices should be stored in the same buffer");
                if (i > 0)
                {
                    Assert.That(merged[i].Offset, Is.EqualTo(merged[i - 1].Offset + merged[i - 1].Count), "All slices should be contiguous");
                }
            }

            // corner cases
            // ReSharper disable AssignNullToNotNullAttribute
            Assert.That(() => FdbKey.Merge(Slice.Empty, default(Slice[])), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("keys"));
            Assert.That(() => FdbKey.Merge(Slice.Empty, default(IEnumerable <Slice>)), Throws.ArgumentNullException.With.Property("ParamName").EqualTo("keys"));
            // ReSharper restore AssignNullToNotNullAttribute
        }