class ColdFields<E> {
    protected final int capacity;
    protected final int mask;
    protected final E[] buffer;
    @SuppressWarnings("unchecked")
    public ColdFields(int capacity) {
        if(Pow2.isPowerOf2(capacity)){
            this.capacity = capacity;
        }
        else{
            this.capacity = Pow2.findNextPositivePowerOfTwo(capacity);
        }
        mask = this.capacity - 1;
        buffer = (E[]) new Object[this.capacity];
    }
}
class L1Pad<E> extends ColdFields<E> {
    public long p10, p11, p12, p13, p14, p15, p16;
    public L1Pad(int capacity) { super(capacity);}
}
class TailField<E> extends L1Pad<E> {
    protected volatile long tail;
    public TailField(int capacity) { super(capacity);}
}
class L2Pad<E> extends TailField<E> {
    public long p20, p21, p22, p23, p24, p25, p26;
    public L2Pad(int capacity) { super(capacity);}
}
class HeadCache<E> extends L2Pad<E> {
    protected long headCache;
    public HeadCache(int capacity) { super(capacity);}
}
class L3Pad<E> extends HeadCache<E> {
    public long p30, p31, p32, p33, p34, p35, p36;
    public L3Pad(int capacity) { super(capacity);}
}
class HeadField<E> extends L3Pad<E> {
    protected volatile long head;
    public HeadField(int capacity) { super(capacity);}
}
class L4Pad<E> extends HeadField<E> {
    public long p40, p41, p42, p43, p44, p45, p46;
    public L4Pad(int capacity) { super(capacity);}
}
class TailCache<E> extends L4Pad<E> {
    protected long tailCache;
    public TailCache(int capacity) { super(capacity);}

}
class L5Pad<E> extends TailCache<E> {
    public long p50, p51, p52, p53, p54, p55, p56;
    public L5Pad(int capacity) { super(capacity);}
}

public final class SPSCQueue1<E> extends L5Pad<E> implements Queue<E> {
    private final static long TAIL_OFFSET;
    private final static long HEAD_OFFSET;
    static {
        try {
            TAIL_OFFSET = UnsafeAccess.UNSAFE.objectFieldOffset(TailField.class.getDeclaredField("tail"));
            HEAD_OFFSET = UnsafeAccess.UNSAFE.objectFieldOffset(HeadField.class.getDeclaredField("head"));
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }
    public SPSCQueue1(final int capacity) {
        super(capacity);
    }
    private void headLazySet(long v) {
        UnsafeAccess.UNSAFE.putOrderedLong(this, HEAD_OFFSET, v);
    }
    private long getHead() {
        return head;
    }
    private void tailLazySet(long v) {
        UnsafeAccess.UNSAFE.putOrderedLong(this, TAIL_OFFSET, v);
    }
    private long getTail() {
        return tail;
    }
    //.....
}