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));
     }
 }
Esempio n. 2
0
        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);
        }