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); } }
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 }