private void Compare <T>(ISpanComparer comparer, int size) where T : struct, IComparable <T> { Random rng = new Random(); for (int i = 0; i < 100; ++i) { byte[] leftData = new byte[32]; byte[] rightData = new byte[32]; rng.NextBytes(leftData); rng.NextBytes(rightData); T a = MemoryMarshal.Cast <byte, T>(leftData.AsSpan())[0]; T b = MemoryMarshal.Cast <byte, T>(rightData.AsSpan())[0]; var leftSpan = leftData.AsSpan().Slice(0, size); var rightSpan = rightData.AsSpan().Slice(0, size); Assert.AreEqual( a.CompareTo(b), comparer.Compare(leftSpan, rightSpan)); Assert.AreEqual( b.CompareTo(a), comparer.Compare(rightSpan, leftSpan)); Assert.AreEqual(0, comparer.Compare(leftSpan, leftSpan)); Assert.AreEqual(0, comparer.Compare(rightSpan, rightSpan)); } }
public static void SortVector( Span <byte> buffer, int vectorUOffset, int vtableIndex, int?keyInlineSize, ISpanComparer comparer) { checked { int vectorStartOffset = vectorUOffset + (int)ScalarSpanReader.ReadUInt(buffer.Slice(vectorUOffset)); int vectorLength = (int)ScalarSpanReader.ReadUInt(buffer.Slice(vectorStartOffset)); int index0Position = vectorStartOffset + sizeof(int); // Traverse the vector and figure out the offsets of all the keys. // Store that in some local data, hopefully on the stack. 512 is somewhat arbitrary, but we want to avoid stack overflows. Span <(int offset, int length, int tableOffset)> keyOffsets = vectorLength < 512 ? stackalloc (int, int, int)[vectorLength]