/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.value.properties;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
/**
* An immutable set of strings, backed by an array.
*/
/* package */final class StringArraySet implements Set<String> {
private final String[] _values;
/**
* Creates a new instance.
*
* @param values the values backing the set. This class will use this object but not modify it.
*/
public StringArraySet(final String[] values) {
_values = values;
}
// Set
@Override
public int size() {
return _values.length;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(final Object o) {
if (o == null) {
return false;
}
for (String value : _values) {
if (o.equals(value)) {
return true;
}
}
return false;
}
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int _index;
@Override
public boolean hasNext() {
return _index < _values.length;
}
@Override
public String next() {
return _values[_index++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public Object[] toArray() {
final Object[] result = new Object[_values.length];
System.arraycopy(_values, 0, result, 0, _values.length);
return result;
}
@SuppressWarnings("unchecked")
@Override
public <T> T[] toArray(T[] a) {
if (a.length < _values.length) {
a = (T[]) Array.newInstance(a.getClass().getComponentType(), _values.length);
}
System.arraycopy(_values, 0, a, 0, _values.length);
return a;
}
@Override
public boolean add(final String e) {
throw new UnsupportedOperationException();
}
@Override
public boolean remove(final Object o) {
throw new UnsupportedOperationException();
}
@Override
public boolean containsAll(final Collection<?> c) {
for (Object o : c) {
if (!contains(o)) {
return false;
}
}
return true;
}
@Override
public boolean addAll(final Collection<? extends String> c) {
throw new UnsupportedOperationException();
}
@Override
public boolean retainAll(final Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public boolean removeAll(final Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
throw new UnsupportedOperationException();
}
// Object
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append('{');
for (int i = 0; i < _values.length; i++) {
if (i > 0) {
sb.append(", ");
}
sb.append(_values[i]);
}
sb.append('}');
return sb.toString();
}
@Override
public int hashCode() {
int hc = 0;
for (String value : _values) {
hc += value.hashCode();
}
return hc;
}
@SuppressWarnings({"rawtypes", "unchecked" })
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof Set)) {
return false;
}
return containsAll((Set) o) && ((Set) o).containsAll(this);
}
}