abstract class SpmcArrayQueueConsumerField<E> extends SpmcArrayQueueL2Pad<E> {
  protected static final long C_INDEX_OFFSET =
      UnsafeAccess.addressOf(SpmcArrayQueueConsumerField.class, "consumerIndex");
  private volatile long consumerIndex;

  public SpmcArrayQueueConsumerField(int capacity) {
    super(capacity);
  }

  protected final long lvConsumerIndex() {
    return consumerIndex;
  }

  protected final boolean casHead(long expect, long newValue) {
    return UNSAFE.compareAndSwapLong(this, C_INDEX_OFFSET, expect, newValue);
  }
}
abstract class SpmcArrayQueueProducerField<E> extends SpmcArrayQueueL1Pad<E> {
  protected static final long P_INDEX_OFFSET =
      UnsafeAccess.addressOf(SpmcArrayQueueProducerField.class, "producerIndex");
  private volatile long producerIndex;

  protected final long lvProducerIndex() {
    return producerIndex;
  }

  protected final void soTail(long v) {
    UNSAFE.putOrderedLong(this, P_INDEX_OFFSET, v);
  }

  public SpmcArrayQueueProducerField(int capacity) {
    super(capacity);
  }
}