public static int Compare(PrefixedSlice x, PrefixedSlice y, SliceComparer cmp, ushort size) { fixed(byte *p1 = x.NonPrefixedData.Array) fixed(byte *p2 = y.NonPrefixedData.Array) { var xPtr = p1 != null ? p1 : x.NonPrefixedData.Pointer; var yPtr = p2 != null ? p2 : y.NonPrefixedData.Pointer; byte *xPre = null; byte *yPre = null; fixed(byte *pre1 = x.Prefix != null?x.Prefix.Value : null) fixed(byte *pre2 = y.Prefix != null ? y.Prefix.Value : null) { if (x.Prefix != null) { xPre = pre1 != null ? pre1 : x.Prefix.ValuePtr; } if (y.Prefix != null) { yPre = pre2 != null ? pre2 : y.Prefix.ValuePtr; } return(Compare(xPre, x.Header.PrefixUsage, yPre, y.Header.PrefixUsage, xPtr, x.Header.NonPrefixedDataSize, yPtr, y.Header.NonPrefixedDataSize, cmp, size)); } } }
public static int Compare(Slice x, PrefixedSlice y, SliceComparer cmp, ushort size) { fixed (byte* p1 = x.Array) fixed (byte* p2 = y.NonPrefixedData.Array) { var xPtr = p1 != null ? p1 : x.Pointer; var yPtr = p2 != null ? p2 : y.NonPrefixedData.Pointer; if (y.Header.PrefixId == PrefixedSlice.NonPrefixedId) return Compare(null, 0, null, 0, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size); if (x.PrefixComparisonCache == null) { if(y.Prefix == null) return Compare(null, 0, null, 0, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size); else if (y.Prefix.Value == null) return Compare(null, 0, y.Prefix.ValuePtr, y.Header.PrefixUsage, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size); else { fixed (byte* prefixVal = y.Prefix.Value) return Compare(null, 0, prefixVal, y.Header.PrefixUsage, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size); } } var prefixBytesToCompare = Math.Min(y.Header.PrefixUsage, x.KeyLength); int r; if (x.PrefixComparisonCache.TryGetCachedResult(y.Header.PrefixId, y.Prefix.PageNumber, prefixBytesToCompare, out r) == false) { if (y.Prefix == null) r = Compare(null, 0, null, 0, xPtr, x.KeyLength, null, 0, cmp, prefixBytesToCompare); else if (y.Prefix.Value == null) r = Compare(null, 0, y.Prefix.ValuePtr, y.Header.PrefixUsage, xPtr, x.KeyLength, null, 0, cmp, prefixBytesToCompare); else { fixed (byte* prefixVal = y.Prefix.Value) r = Compare(null, 0, prefixVal, y.Header.PrefixUsage, xPtr, x.KeyLength, null, 0, cmp, prefixBytesToCompare); } x.PrefixComparisonCache.SetPrefixComparisonResult(y.Header.PrefixId, y.Prefix.PageNumber, prefixBytesToCompare, r); } if (r != 0) return r; size -= prefixBytesToCompare; return Compare(null, 0, null, 0, xPtr + prefixBytesToCompare, (ushort)(x.KeyLength - prefixBytesToCompare), yPtr, y.Header.NonPrefixedDataSize, cmp, size); } }
public static int Compare(PrefixedSlice x, PrefixedSlice y, SliceComparer cmp, ushort size) { fixed (byte* p1 = x.NonPrefixedData.Array) fixed (byte* p2 = y.NonPrefixedData.Array) { var xPtr = p1 != null ? p1 : x.NonPrefixedData.Pointer; var yPtr = p2 != null ? p2 : y.NonPrefixedData.Pointer; byte* xPre = null; byte* yPre = null; fixed (byte* pre1 = x.Prefix != null ? x.Prefix.Value : null) fixed (byte* pre2 = y.Prefix != null ? y.Prefix.Value : null) { if(x.Prefix != null) xPre = pre1 != null ? pre1 : x.Prefix.ValuePtr; if (y.Prefix != null) yPre = pre2 != null ? pre2 : y.Prefix.ValuePtr; return Compare(xPre, x.Header.PrefixUsage, yPre, y.Header.PrefixUsage, xPtr, x.Header.NonPrefixedDataSize, yPtr, y.Header.NonPrefixedDataSize, cmp, size); } } }
public static int Compare(Slice x, PrefixedSlice y, SliceComparer cmp, ushort size) { fixed(byte *p1 = x.Array) fixed(byte *p2 = y.NonPrefixedData.Array) { var xPtr = p1 != null ? p1 : x.Pointer; var yPtr = p2 != null ? p2 : y.NonPrefixedData.Pointer; if (y.Header.PrefixId == PrefixedSlice.NonPrefixedId) { return(Compare(null, 0, null, 0, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size)); } if (x.PrefixComparisonCache == null) { if (y.Prefix == null) { return(Compare(null, 0, null, 0, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size)); } else if (y.Prefix.Value == null) { return(Compare(null, 0, y.Prefix.ValuePtr, y.Header.PrefixUsage, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size)); } else { fixed(byte *prefixVal = y.Prefix.Value) return(Compare(null, 0, prefixVal, y.Header.PrefixUsage, xPtr, x.KeyLength, yPtr, y.Header.NonPrefixedDataSize, cmp, size)); } } var prefixBytesToCompare = Math.Min(y.Header.PrefixUsage, x.KeyLength); int r; if (x.PrefixComparisonCache.TryGetCachedResult(y.Header.PrefixId, y.Prefix.PageNumber, prefixBytesToCompare, out r) == false) { if (y.Prefix == null) { r = Compare(null, 0, null, 0, xPtr, x.KeyLength, null, 0, cmp, prefixBytesToCompare); } else if (y.Prefix.Value == null) { r = Compare(null, 0, y.Prefix.ValuePtr, y.Header.PrefixUsage, xPtr, x.KeyLength, null, 0, cmp, prefixBytesToCompare); } else { fixed(byte *prefixVal = y.Prefix.Value) r = Compare(null, 0, prefixVal, y.Header.PrefixUsage, xPtr, x.KeyLength, null, 0, cmp, prefixBytesToCompare); } x.PrefixComparisonCache.SetPrefixComparisonResult(y.Header.PrefixId, y.Prefix.PageNumber, prefixBytesToCompare, r); } if (r != 0) { return(r); } size -= prefixBytesToCompare; return(Compare(null, 0, null, 0, xPtr + prefixBytesToCompare, (ushort)(x.KeyLength - prefixBytesToCompare), yPtr, y.Header.NonPrefixedDataSize, cmp, size)); } }