public DirectBuffer this[int index] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { if ((uint)index >= BufferCount) { BuffersThrowHelper.ThrowIndexOutOfRange(); } // ReSharper disable once ImpureMethodCallOnReadonlyValueField return(DirectBuffer.Slice(index * BufferSize, BufferSize)); } }
public static int IndexToOffset(int index, int head, int len) { if (AdditionalCorrectnessChecks.Enabled && (head < 0 || len < 0)) { BuffersThrowHelper.ThrowIndexOutOfRange(); } // return (head + index) % len; // len is not guaranteed to be power of 2, cannot use bit mask // but we could avoid branch: we do not need modulo // instead we only need to subtract len if we wrap over it var offset = head + index; var isWrapped = (len - (offset + 1)) >> 31; // 0 or -1 var result = offset + isWrapped * len; if (AdditionalCorrectnessChecks.Enabled) { ThrowHelper.Assert(result >= 0); ThrowHelper.Assert(result < len); } return(result); }