in modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CircularArray.java [160:290]
public void remove(T obj) {
if (count == 0) {
return;
}
int i = indexOf(obj);
while (i >= 0) {
// convert from logical to physical location
int pos = convert(i);
if (pos == head) {
// move the head up one
head = (head + 1) % capacity;
array[pos] = null;
count--;
} else if (pos == tail) {
// move the tail back one
tail = (tail - 1 + capacity) % capacity;
array[pos] = null;
count--;
} else {
// create a brand new array and start it back out at zero
Object[] a = new Object[capacity];
int destPos = 0;
int len = 0;
if (head == tail) {
// most likeley scenario when it is full
if (head < pos) {
// copy from head to position
len = pos - head;
System.arraycopy(array, head, a, destPos, len);
destPos += len;
// copy from pos +1 to end
len = (capacity - 1) - pos;
if (len > 0) {
System.arraycopy(array, pos + 1, a, destPos, len);
destPos += len;
}
// copy from zero to head
len = head;
if (len > 0) {
System.arraycopy(array, 0, a, destPos, len);
}
} else if (head > pos) {
// copy from head to end of array
len = capacity - head;
if (len > 0) {
System.arraycopy(array, head, a, destPos, len);
destPos += len;
}
// copy from zero to pos -1
len = pos;
if (len > 0) {
System.arraycopy(array, 0, a, destPos, len);
destPos += len;
}
// copy from pos + 1 to tail
len = tail - pos - 1;
if (len > 0) {
System.arraycopy(array, pos + 1, a, destPos, len);
}
}
} else if (head < tail) {
// copy from head to position -1
len = pos - head;
if (len > 0) {
System.arraycopy(array, head, a, destPos, len);
destPos += len;
}
// copy from position + 1 to tail
len = tail - pos;
if (len > 0) {
System.arraycopy(array, pos + 1, a, destPos, len);
destPos += len;
}
} else if (head > tail) {
if (head < pos) {
// copy from head to position
len = pos - head;
System.arraycopy(array, head, a, destPos, len);
destPos += len;
// copy from pos +1 to end
len = capacity - 1 - pos;
if (len > 0) {
System.arraycopy(array, pos + 1, a, destPos, len);
destPos += len;
}
// copy from beginning to tail
len = tail;
if (len > 0) {
System.arraycopy(array, 0, a, destPos, len);
}
} else if (head > pos) {
// copy from head to end of array
len = capacity - head;
if (len > 0) {
System.arraycopy(array, head, a, destPos, len);
destPos += len;
}
// copy from zero to pos -1
len = pos - 1;
if (len > 0) {
System.arraycopy(array, 0, a, destPos, len);
destPos += len;
}
// copy from pos+1 to tail
len = tail - pos;
if (len > 0) {
System.arraycopy(array, pos + 1, a, destPos, len);
}
}
}
count--;
array = a;
head = 0;
tail = count;
}
i = indexOf(obj);
}
}