/// <summary> /// Forms a slice out of the given <see cref="ReadableBuffer"/>, beginning at 'start', and is at most length bytes /// </summary> /// <param name="start">The index at which to begin this slice.</param> /// <param name="length">The length of the slice</param> public ReadableBuffer Slice(int start, int length) { var begin = BufferStart.Seek(start, BufferEnd, false); var end = begin.Seek(length, BufferEnd, false); return(Slice(begin, end)); }
/// <summary> /// Forms a slice out of the given <see cref="ReadableBuffer"/>, beginning at 'start', and is at most length bytes /// </summary> /// <param name="start">The index at which to begin this slice.</param> /// <param name="length">The length of the slice</param> public ReadableBuffer Slice(long start, long length) { var begin = BufferStart.Seek(start, BufferEnd, false); var end = begin.Seek(length, BufferEnd, false); return(new ReadableBuffer(begin, end)); }
public ReadCursor Move(ReadCursor cursor, int count) { if (count < 0) { throw new ArgumentOutOfRangeException(nameof(count)); } return(cursor.Seek(count, BufferEnd, false)); }
/// <summary> /// Forms a slice out of the given <see cref="ReadableBuffer"/>, beginning at 'start', and is at most length bytes /// </summary> /// <param name="start">The starting (inclusive) <see cref="ReadCursor"/> at which to begin this slice.</param> /// <param name="length">The length of the slice</param> public ReadableBuffer Slice(ReadCursor start, int length) { BufferEnd.BoundsCheck(start); var end = start.Seek(length, BufferEnd, false); return(Slice(start, end)); }
public ReadCursor Move(ReadCursor cursor, int count) { if (count < 0) { throw new ArgumentOutOfRangeException(nameof(count)); } var newCursor = cursor.Seek(count, _end); return(newCursor); }
/// <summary> /// Forms a slice out of the given <see cref="ReadableBuffer"/>, beginning at 'start', and is at most length bytes /// </summary> /// <param name="start">The starting (inclusive) <see cref="ReadCursor"/> at which to begin this slice.</param> /// <param name="length">The length of the slice</param> public ReadableBuffer Slice(ReadCursor start, int length) { return(Slice(start, start.Seek(length))); }
/// <summary> /// Searches for a byte in the <see cref="ReadableBuffer"/> and returns a sliced <see cref="ReadableBuffer"/> that /// contains all data up to and excluding the byte, and a <see cref="ReadCursor"/> that points to the byte. /// </summary> /// <param name="b1">The first byte to search for</param> /// <param name="slice">A <see cref="ReadableBuffer"/> slice that contains all data up to and excluding the first byte.</param> /// <param name="cursor">A <see cref="ReadCursor"/> that points to the second byte</param> /// <returns>True if the byte sequence was found, false if not found</returns> public bool TrySliceTo(byte b1, out ReadableBuffer slice, out ReadCursor cursor) { if (IsEmpty) { slice = default(ReadableBuffer); cursor = default(ReadCursor); return(false); } var byte0Vector = CommonVectors.GetVector(b1); var seek = 0; foreach (var memory in this) { var currentSpan = memory.Span; var found = false; if (Vector.IsHardwareAccelerated) { while (currentSpan.Length >= VectorWidth) { var data = currentSpan.Read <Vector <byte> >(); var byte0Equals = Vector.Equals(data, byte0Vector); if (byte0Equals.Equals(Vector <byte> .Zero)) { currentSpan = currentSpan.Slice(VectorWidth); seek += VectorWidth; } else { var index = FindFirstEqualByte(ref byte0Equals); seek += index; found = true; break; } } } if (!found) { // Slow search for (int i = 0; i < currentSpan.Length; i++) { if (currentSpan[i] == b1) { found = true; break; } seek++; } } if (found) { cursor = _start.Seek(seek); slice = Slice(_start, cursor); return(true); } } slice = default(ReadableBuffer); cursor = default(ReadCursor); return(false); }