package com.xxiivv.mute;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class ValueCollection implements Iterable<Value> {
Value[] values;
public ValueCollection() {
values = new Value[] {};
}
ValueCollection(Value[] values) {
this.values = values;
}
public boolean isArray() {
boolean retValue = true;
for (Value v : values)
retValue &= v.name instanceof Integer;
return retValue;
}
public boolean isContiguousArray() {
boolean contiguous = true;
int i = 1;
for (Value v : values)
contiguous &= v.name instanceof Integer && i++ == (int) v.name;
return contiguous;
}
public Object[] asArray() {
List<Object> list = new ArrayList<Object>();
for (int i=0; i<values.length; i++)
list.add((int) values[i].name - 1, values[i].value);
Object[] retValue = new Object[list.size()];
return list.toArray(retValue);
}
@Override
public boolean equals(Object obj) {
return obj instanceof ValueCollection && Arrays.equals(values, ((ValueCollection)obj).values);
}
@Override
public String toString() {
String text = "[";
boolean contiguous = isContiguousArray();
for (Value v : values)
{
String valueString = (v.value instanceof Object[] ? Arrays.toString((Object[]) v.value) : v.value.toString());
if (contiguous) text += valueString;
else text += v.name.toString() + ": " + valueString;
text += ", ";
}
text = text.substring(0, text.length() - 2) + "]";
return text;
}
@Override
public Iterator<Value> iterator() {
return Arrays.asList(values).iterator();
}
public boolean has(Object name) {
if (name == null || !(name instanceof String || name instanceof Integer))
throw new InvalidParameterException("name");
for (int i=0; i<values.length; i++)
if (values[i].name.equals(name))
return true;
return false;
}
public Object get(Object name) {
if (name == null || !(name instanceof String || name instanceof Integer))
throw new InvalidParameterException("name");
for (int i=0; i<values.length; i++)
if (values[i].name.equals(name))
return values[i].value;
return null;
}
}