package com.planet_ink.coffee_mud.core.collections;
import java.util.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.MaskingLibrary;
public class QuadVector<T, K, L, M> extends Vector<Quad<T, K, L, M>> implements List<Quad<T, K, L, M>>
{
private static final long serialVersionUID = -9175373358892311411L;
public Quad.FirstConverter<T, K, L, M> getFirstConverter()
{
return new Quad.FirstConverter<T, K, L, M>();
}
public Quad.SecondConverter<T, K, L, M> getSecondConverter()
{
return new Quad.SecondConverter<T, K, L, M>();
}
public Quad.ThirdConverter<T, K, L, M> getThirdConverter()
{
return new Quad.ThirdConverter<T, K, L, M>();
}
public Quad.FourthConverter<T, K, L, M> getFourthConverter()
{
return new Quad.FourthConverter<T, K, L, M>();
}
public Enumeration<T> firstElements()
{
return new ConvertingEnumeration<Quad<T, K, L, M>, T>(elements(), getFirstConverter());
}
public Enumeration<K> secondElements()
{
return new ConvertingEnumeration<Quad<T, K, L, M>, K>(elements(), getSecondConverter());
}
public Enumeration<L> thirdElements()
{
return new ConvertingEnumeration<Quad<T, K, L, M>, L>(elements(), getThirdConverter());
}
public Enumeration<M> fourthElements()
{
return new ConvertingEnumeration<Quad<T, K, L, M>, M>(elements(), getFourthConverter());
}
public Iterator<T> firstIterator()
{
return new ConvertingIterator<Quad<T, K, L, M>, T>(iterator(), getFirstConverter());
}
public Iterator<K> secondIterator()
{
return new ConvertingIterator<Quad<T, K, L, M>, K>(iterator(), getSecondConverter());
}
public Iterator<L> thirdIterator()
{
return new ConvertingIterator<Quad<T, K, L, M>, L>(iterator(), getThirdConverter());
}
public Iterator<M> fourthIterator()
{
return new ConvertingIterator<Quad<T, K, L, M>, M>(iterator(), getFourthConverter());
}
@SuppressWarnings("unchecked")
@Override
public boolean contains(Object o)
{
if (o instanceof Quad)
return super.contains(o);
if (containsFirst((T) o))
return true;
return containsSecond((K) o);
}
@SuppressWarnings("unchecked")
@Override
public int indexOf(Object o)
{
if (o instanceof Quad)
return super.indexOf(o);
final int x = indexOfFirst((T) o);
if (x >= 0)
return x;
return indexOfSecond((K) o);
}
@SuppressWarnings("unchecked")
@Override
public synchronized int indexOf(Object o, int index)
{
if (o instanceof Quad)
return super.indexOf(o, index);
final int x = indexOfFirst((T) o, index);
if (x >= 0)
return x;
return indexOfSecond((K) o, index);
}
public synchronized int indexOfFirst(T t)
{
return indexOfFirst(t, 0);
}
public synchronized int indexOfSecond(K k)
{
return indexOfSecond(k, 0);
}
public synchronized int indexOfThird(L l)
{
return indexOfThird(l, 0);
}
public synchronized int indexOfFourth(M m)
{
return indexOfFourth(m, 0);
}
public T getFirst(int index)
{
return get(index).first;
}
public K getSecond(int index)
{
return get(index).second;
}
public L getThird(int index)
{
return get(index).third;
}
public M getFourth(int index)
{
return get(index).fourth;
}
public void add(T t, K k, L l, M m)
{
add(new Quad<T, K, L, M>(t, k, l, m));
}
public void addElement(T t, K k, L l, M m)
{
add(new Quad<T, K, L, M>(t, k, l, m));
}
public boolean containsFirst(T t)
{
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
if ((t == null) ? i.next() == null : t.equals(i.next().first))
return true;
}
return false;
}
public boolean containsSecond(K k)
{
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
if ((k == null) ? i.next() == null : k.equals(i.next().second))
return true;
}
return false;
}
public boolean containsThird(L l)
{
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
if ((l == null) ? i.next() == null : l.equals(i.next().third))
return true;
}
return false;
}
public boolean containsFourth(M m)
{
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
if ((m == null) ? i.next() == null : m.equals(i.next().fourth))
return true;
}
return false;
}
public T elementAtFirst(int index)
{
return get(index).first;
}
public K elementAtSecond(int index)
{
return get(index).second;
}
public L elementAtThird(int index)
{
return get(index).third;
}
public M elementAtFourth(int index)
{
return get(index).fourth;
}
public int indexOfFirst(T t, int index)
{
try
{
for (int i = index; i < size(); i++)
{
if ((t == null ? get(i).first == null : t.equals(get(i).first)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int indexOfSecond(K k, int index)
{
try
{
for (int i = index; i < size(); i++)
{
if ((k == null ? get(i).second == null : k.equals(get(i).second)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int indexOfThird(L l, int index)
{
try
{
for (int i = index; i < size(); i++)
{
if ((l == null ? get(i).third == null : l.equals(get(i).third)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int indexOfFourth(M m, int index)
{
try
{
for (int i = index; i < size(); i++)
{
if ((m == null ? get(i).fourth == null : m.equals(get(i).fourth)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int lastIndexOfFirst(T t, int index)
{
try
{
for (int i = index; i >= 0; i--)
{
if ((t == null ? get(i).first == null : t.equals(get(i).first)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int lastIndexOfSecond(K k, int index)
{
try
{
for (int i = index; i >= 0; i--)
{
if ((k == null ? get(i).second == null : k.equals(get(i).second)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int lastIndexOfThird(L l, int index)
{
try
{
for (int i = index; i >= 0; i--)
{
if ((l == null ? get(i).third == null : l.equals(get(i).third)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public int lastIndexOfFourth(M m, int index)
{
try
{
for (int i = index; i >= 0; i--)
{
if ((m == null ? get(i).fourth == null : m.equals(get(i).fourth)))
return i;
}
}
catch (final Exception e)
{
}
return -1;
}
public synchronized int lastIndexOfFirst(T t)
{
return lastIndexOfFirst(t, size() - 1);
}
public synchronized int lastIndexOfSecond(K k)
{
return lastIndexOfSecond(k, size() - 1);
}
public synchronized int lastIndexOfThird(L l)
{
return lastIndexOfThird(l, size() - 1);
}
public synchronized int lastIndexOfFourth(M m)
{
return lastIndexOfFourth(m, size() - 1);
}
public synchronized boolean removeFirst(T t)
{
Quad<T, K, L, M> pair;
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
pair = i.next();
if ((t == null ? pair.first == null : t.equals(pair.first)))
{
i.remove();
return true;
}
}
return false;
}
public synchronized boolean removeSecond(K k)
{
Quad<T, K, L, M> pair;
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
pair = i.next();
if ((k == null ? pair.second == null : k.equals(pair.second)))
{
i.remove();
return true;
}
}
return false;
}
public synchronized boolean removeThird(L l)
{
Quad<T, K, L, M> pair;
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
pair = i.next();
if ((l == null ? pair.third == null : l.equals(pair.third)))
{
i.remove();
return true;
}
}
return false;
}
public synchronized boolean removeFourth(M m)
{
Quad<T, K, L, M> pair;
for (final Iterator<Quad<T, K, L, M>> i = iterator(); i.hasNext();)
{
pair = i.next();
if ((m == null ? pair.fourth == null : m.equals(pair.fourth)))
{
i.remove();
return true;
}
}
return false;
}
public boolean removeElementFirst(T t)
{
return removeFirst(t);
}
public boolean removeElementSecond(K k)
{
return removeSecond(k);
}
public boolean removeElementThird(L l)
{
return removeThird(l);
}
public boolean removeElementFourth(M m)
{
return removeFourth(m);
}
public T firstFirstElement(int index)
{
return firstElement().first;
}
public K firstSecondElement(int index)
{
return firstElement().second;
}
public L firstThirdElement(int index)
{
return firstElement().third;
}
public M firstFourthElement(int index)
{
return firstElement().fourth;
}
public T lastFirstElement(int index)
{
return lastElement().first;
}
public K lastSecondElement(int index)
{
return lastElement().second;
}
public L lastThirdElement(int index)
{
return lastElement().third;
}
public M lastFourthElement(int index)
{
return lastElement().fourth;
}
public T[] toArrayFirst(T[] objs)
{
if(objs.length < size())
objs = Arrays.copyOf(objs, size());
for (int x = 0; x < size(); x++)
objs[x] = getFirst(x);
return objs;
}
public K[] toArraySecond(K[] objs)
{
if(objs.length < size())
objs = Arrays.copyOf(objs, size());
for (int x = 0; x < size(); x++)
objs[x] = getSecond(x);
return objs;
}
public L[] toArrayThird(L[] objs)
{
if(objs.length < size())
objs = Arrays.copyOf(objs, size());
for (int x = 0; x < size(); x++)
objs[x] = getThird(x);
return objs;
}
public M[] toArrayFourth(M[] objs)
{
if(objs.length < size())
objs = Arrays.copyOf(objs, size());
for (int x = 0; x < size(); x++)
objs[x] = getFourth(x);
return objs;
}
}