package com.kreative.paint.material;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
public class MaterialList<T> {
private final List<String> names;
private final List<T> values;
public MaterialList() {
this.names = new ArrayList<String>();
this.values = new ArrayList<T>();
}
public void add(String name, T value) {
names.add(name);
values.add(value);
}
public void add(int index, String name, T value) {
names.add(index, name);
values.add(index, value);
}
public void addAll(Map<String, ? extends T> m) {
for (Map.Entry<String, ? extends T> e : m.entrySet()) {
names.add(e.getKey());
values.add(e.getValue());
}
}
public void addAll(int index, Map<String, ? extends T> m) {
for (Map.Entry<String, ? extends T> e : m.entrySet()) {
names.add(index, e.getKey());
values.add(index, e.getValue());
index++;
}
}
public void addAll(MaterialList<? extends T> m) {
names.addAll(m.names);
values.addAll(m.values);
}
public void addAll(int index, MaterialList<? extends T> m) {
names.addAll(index, m.names);
values.addAll(index, m.values);
}
public void clear() {
names.clear();
values.clear();
}
public boolean containsName(String name) {
return names.contains(name);
}
public boolean containsValue(T value) {
return values.contains(value);
}
public boolean containsAllNames(Collection<String> names) {
return this.names.containsAll(names);
}
public boolean containsAllValues(Collection<? extends T> values) {
return this.values.containsAll(values);
}
public String getName(int index) {
return names.get(index);
}
public String getName(T value) {
int o = values.indexOf(value);
return (o < 0) ? null : names.get(o);
}
public T getValue(int index) {
return values.get(index);
}
public T getValue(String name) {
int o = names.indexOf(name);
return (o < 0) ? null : values.get(o);
}
public int indexOfName(String name) {
return names.indexOf(name);
}
public int indexOfValue(T value) {
return values.indexOf(value);
}
public boolean isEmpty() {
return names.isEmpty() || values.isEmpty();
}
public Iterator<String> nameIterator() {
return Collections.unmodifiableList(names).iterator();
}
public Iterator<T> valueIterator() {
return Collections.unmodifiableList(values).iterator();
}
public int lastIndexOfName(String name) {
return names.lastIndexOf(name);
}
public int lastIndexOfValue(T value) {
return values.lastIndexOf(value);
}
public ListIterator<String> nameListIterator() {
return Collections.unmodifiableList(names).listIterator();
}
public ListIterator<String> nameListIterator(int index) {
return Collections.unmodifiableList(names).listIterator(index);
}
public ListIterator<T> valueListIterator() {
return Collections.unmodifiableList(values).listIterator();
}
public ListIterator<T> valueListIterator(int index) {
return Collections.unmodifiableList(values).listIterator(index);
}
public String removeName(int index) {
values.remove(index);
return names.remove(index);
}
public boolean removeName(String name) {
int o = names.indexOf(name);
if (o < 0) return false;
names.remove(o);
values.remove(o);
return true;
}
public T removeValue(int index) {
names.remove(index);
return values.remove(index);
}
public boolean removeValue(T value) {
int o = values.indexOf(value);
if (o < 0) return false;
names.remove(o);
values.remove(o);
return true;
}
public boolean removeAllNames(Collection<String> names) {
boolean changed = false;
for (String name : names) {
changed |= removeName(name);
}
return changed;
}
public boolean removeAllValues(Collection<? extends T> values) {
boolean changed = false;
for (T value : values) {
changed |= removeValue(value);
}
return changed;
}
public boolean retainAllNames(Collection<String> names) {
boolean changed = false;
for (int i = this.names.size() - 1; i >= 0; i--) {
if (!names.contains(this.names.get(i))) {
this.names.remove(i);
this.values.remove(i);
changed = true;
}
}
return changed;
}
public boolean retainAllValues(Collection<? extends T> values) {
boolean changed = false;
for (int i = this.names.size() - 1; i >= 0; i--) {
if (!values.contains(this.values.get(i))) {
this.names.remove(i);
this.values.remove(i);
changed = true;
}
}
return changed;
}
public String setName(int index, String name) {
return names.set(index, name);
}
public String setName(T value, String name) {
int o = values.indexOf(value);
return (o < 0) ? null : names.set(o, name);
}
public T setValue(int index, T value) {
return values.set(index, value);
}
public T setValue(String name, T value) {
int o = names.indexOf(name);
return (o < 0) ? null : values.set(o, value);
}
public int size() {
return Math.min(names.size(), values.size());
}
public MaterialList<T> subList(int from, int to) {
return new MaterialList<T>(this, from, to);
}
private MaterialList(MaterialList<T> parent, int from, int to) {
this.names = parent.names.subList(from, to);
this.values = parent.values.subList(from, to);
}
public String[] toNameArray() {
return names.toArray(new String[0]);
}
public T[] toValueArray() {
@SuppressWarnings("unchecked")
T[] a = (T[])new Object[0];
return values.toArray(a);
}
public List<String> nameList() {
return Collections.unmodifiableList(names);
}
public List<T> valueList() {
return Collections.unmodifiableList(values);
}
@Override
public boolean equals(Object that) {
if (that instanceof MaterialList) {
return this.names.equals(((MaterialList<?>)that).names)
&& this.values.equals(((MaterialList<?>)that).values);
} else {
return false;
}
}
@Override
public int hashCode() {
return names.hashCode() ^ values.hashCode();
}
}