package org.jctools_voltpatches.queues; import org.jctools_voltpatches.util.UnsafeRefArrayAccess; public final class SparsePaddedCircularArrayOffsetCalculator { static final int SPARSE_SHIFT = Integer.getInteger("org.jctools.sparse.shift", 0); private static final long REF_ARRAY_BASE; private static final int REF_ELEMENT_SHIFT; static { REF_ELEMENT_SHIFT = UnsafeRefArrayAccess.REF_ELEMENT_SHIFT + SPARSE_SHIFT; REF_ARRAY_BASE = PaddedCircularArrayOffsetCalculator.REF_ARRAY_BASE; } private SparsePaddedCircularArrayOffsetCalculator() { } @SuppressWarnings("unchecked") public static <E> E[] allocate(int capacity) { return (E[]) new Object[(capacity << SPARSE_SHIFT) + PaddedCircularArrayOffsetCalculator.REF_BUFFER_PAD * 2]; } /** * @param index desirable element index * @param mask * @return the offset in bytes within the array for a given index. */ public static long calcElementOffset(long index, long mask) { return REF_ARRAY_BASE + ((index & mask) << REF_ELEMENT_SHIFT); } }