package it.yup.util;
import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.Vector;
public class MetaVector extends Vector {
private class MultiVectorEnumeration implements Enumeration {
private Object next = null;
private Object innerNext = null;
private Enumeration superEnumeration = MetaVector.this
.superEnumeration();
private Enumeration innerEnumeration = null;
public MultiVectorEnumeration() {
checkNext();
}
private void checkNext() {
if (superEnumeration.hasMoreElements()) {
next = superEnumeration.nextElement();
if (next != null && next instanceof Vector
&& (((Vector) next).size() == 0)) {
checkNext();
}
} else {
next = null;
}
}
public boolean hasMoreElements() {
return (next != null);
// return (next != null && (next instanceof Vector ? (((Vector) next)
// .size() > 0) : true));
}
public Object nextElement() {
if (next == null) throw new NoSuchElementException();
if (next instanceof Vector == false) {
Object retVal = next;
checkNext();
return retVal;
} else {
if (innerEnumeration == null) innerEnumeration = ((Vector) next)
.elements();
if (innerEnumeration.hasMoreElements()) {
innerNext = innerEnumeration.nextElement();
if (innerEnumeration.hasMoreElements() == false) {
innerEnumeration = null;
checkNext();
}
return innerNext;
} else
innerEnumeration = null;
checkNext();
return nextElement();
}
}
}
/*
* The inner vector that "mimics" a vector behaviour
*/
private Vector innerVector = new Vector();
private Enumeration superEnumeration() {
return innerVector.elements();
}
public MetaVector() {
innerVector = new Vector();
}
public MetaVector(int initialCapacity) {
innerVector = new Vector(initialCapacity);
}
public MetaVector(int initialCapacity, int capacityIncrement) {
innerVector = new Vector(initialCapacity, capacityIncrement);
}
public void addElement(Object obj) {
innerVector.addElement(obj);
}
public boolean contains(Object elem) {
Enumeration en = this.elements();
while (en.hasMoreElements()) {
if (en.nextElement().equals(elem)) return true;
}
return false;
}
public void copyInto(Object[] anArray) {
Enumeration en = this.elements();
int index = 0;
while (en.hasMoreElements()) {
anArray[index] = en.nextElement();
index++;
}
}
public Object elementAt(int index) {
// int i = 0;
// Enumeration en = this.elements();
// while (i < index) {
// en.nextElement();
// i++;
// }
// return en.nextElement();
int i = index;
Enumeration en = this.innerVector.elements();
while (en.hasMoreElements()) {
Object object = (Object) en.nextElement();
if (object instanceof Vector == false) {
if (i == 0) return object;
i--;
} else {
Vector oVector = ((Vector) object);
if (oVector.size() > i) return oVector.elementAt(i);
i -= oVector.size();
}
}
throw (new ArrayIndexOutOfBoundsException());
}
public Enumeration elements() {
return new MultiVectorEnumeration();
}
public Object firstElement() {
return elementAt(0);
}
public int indexOf(Object elem) {
return indexOf(elem, 0);
}
public int indexOf(Object elem, int index) {
int i = 0;
Enumeration en = this.elements();
while (i < index) {
en.nextElement();
i++;
}
while (en.hasMoreElements()) {
Object o = en.nextElement();
if (o.equals(elem)) return i;
i++;
}
return -1;
}
public void insertElementAt(Object obj, int index) {
int count = 0;
Enumeration en = superEnumeration();
while (en.hasMoreElements()) {
Object o = en.nextElement();
if (o instanceof Vector == false) {
if (count == index) {
innerVector.insertElementAt(obj, innerVector.indexOf(o));
return;
}
count++;
} else {
Vector vectorObject = (Vector) o;
int vectorObjectSize = vectorObject.size();
if (vectorObjectSize + count > index) {
vectorObject.insertElementAt(obj, index - count);
return;
}
count += vectorObjectSize;
}
}
if (index == this.size()) {
this.innerVector.addElement(obj);
return;
}
throw new ArrayIndexOutOfBoundsException();
}
public boolean isEmpty() {
return !(this.elements().hasMoreElements());
}
public Object lastElement() {
Object o = null;
Enumeration en = this.elements();
o = en.nextElement();
while (en.hasMoreElements()) {
o = en.nextElement();
}
return o;
}
public int lastIndexOf(Object elem) {
return lastIndexOf(elem, 0);
}
public int lastIndexOf(Object elem, int startIndex) {
Object o = null;
Enumeration en = this.elements();
int lastIndex = -1;
int index = 0;
try {
while (index < startIndex) {
en.nextElement();
index++;
}
} catch (NoSuchElementException e) {
throw new IndexOutOfBoundsException();
}
while (en.hasMoreElements()) {
o = en.nextElement();
if (o == elem) lastIndex = index;
index++;
}
return lastIndex;
}
public boolean removeElement(Object obj) {
boolean retVal = innerVector.removeElement(obj);
if (retVal) return true;
Enumeration en = superEnumeration();
while (en.hasMoreElements()) {
Object o = en.nextElement();
if (o instanceof Vector) {
retVal = ((Vector) o).removeElement(obj);
if (retVal) return true;
}
}
return false;
}
public void removeAllElements() {
innerVector.removeAllElements();
}
public void removeElementAt(int index) {
int count = 0;
Enumeration en = superEnumeration();
while (en.hasMoreElements()) {
Object o = en.nextElement();
if (o instanceof Vector == false) {
if (count == index) {
innerVector.removeElement(o);
return;
}
count++;
} else {
Vector vectorObject = (Vector) o;
int vectorObjectSize = vectorObject.size();
if (vectorObjectSize + count > index) {
vectorObject.removeElementAt(index - count);
return;
}
count += vectorObjectSize;
}
}
throw new ArrayIndexOutOfBoundsException();
}
public void setElementAt(Object obj, int index) {
int count = 0;
Enumeration en = superEnumeration();
while (en.hasMoreElements()) {
Object o = en.nextElement();
if (o instanceof Vector == false) {
if (count == index) {
innerVector.setElementAt(obj, innerVector.indexOf(o));
return;
}
count++;
} else {
Vector vectorObject = (Vector) o;
int vectorObjectSize = vectorObject.size();
if (vectorObjectSize + count > index) {
vectorObject.setElementAt(obj, index - count);
return;
}
count += vectorObjectSize;
}
}
throw new ArrayIndexOutOfBoundsException();
}
public int size() {
int count = innerVector.size();
Enumeration en = superEnumeration();
while (en.hasMoreElements()) {
Object o = en.nextElement();
if (o instanceof Vector) {
count--;
count += ((Vector) o).size();
}
}
return count;
}
public String toString() {
String retString = "Multivector: ";
Enumeration en = this.elements();
while (en.hasMoreElements()) {
retString += (" " + en.nextElement());
}
return retString;
}
}