private boolean delete(int i) {
 	checkInvariants();
	final E[] elements = this.elements;
	final int mask = elements.length - 1;
	final int h = head;
	final int t = tail;
	final int front = (i - h) & mask;
	final int back  = (t - i) & mask;

	// Invariant: head <= i < tail mod circularity
	if (front >= ((t - h) & mask))
	    throw new ConcurrentModificationException();

	// Optimize for least element motion
	if (front < back) {
	    if (h <= i) {
		System.arraycopy(elements, h, elements, h + 1, front);
	    } else { // Wrap around
		System.arraycopy(elements, 0, elements, 1, i);
		elements[0] = elements[mask];
		System.arraycopy(elements, h, elements, h + 1, mask - h);
	    }
	    elements[h] = null;
	    head = (h + 1) & mask;
	    return false;
	} else {
	    if (i < t) { // Copy the null tail as well
		System.arraycopy(elements, i + 1, elements, i, back);
		tail = t - 1;
	    } else { // Wrap around
		System.arraycopy(elements, i + 1, elements, i, mask - i);
		elements[mask] = elements[0];
		System.arraycopy(elements, 1, elements, 0, t);
		tail = (t - 1) & mask;
	    }
	    return true;
	}
    }