package org.osgl.util;
import java.io.Serializable;
import java.util.*;
class DelegatingSet<T> extends SetBase<T> implements C.Set<T>, Serializable {
protected Set<T> data;
DelegatingSet(Collection<? extends T> c) {
data = new HashSet<T>(c);
}
DelegatingSet() {
data = new HashSet<T>();
}
DelegatingSet(Collection<? extends T> c, boolean immutable) {
if (c instanceof C.Set) {
C.Set<T> set = (C.Set<T>) c;
boolean setIsImmutable = set.is(C.Feature.IMMUTABLE);
if (immutable && setIsImmutable) {
data = set;
} else {
if (immutable) {
data = Collections.unmodifiableSet(set);
} else {
data = new HashSet<T>(set);
}
}
} else if (c instanceof java.util.Set) {
Set<? extends T> set = (Set<? extends T>)c;
if (immutable) {
data = Collections.unmodifiableSet(set);
} else {
data = new HashSet<T>(set);
}
} else {
Set<T> set = new HashSet<T>(c);
if (immutable) {
data = Collections.unmodifiableSet(set);
} else {
data = set;
}
}
}
@Override
protected EnumSet<C.Feature> initFeatures() {
EnumSet<C.Feature> fs = (data instanceof C.Set) ?
((C.Set<T>)data).features()
: EnumSet.of(C.Feature.LIMITED);
return fs;
}
@Override
public Iterator<T> iterator() {
return data.iterator();
}
@Override
public int size() {
return data.size();
}
@Override
public boolean contains(Object o) {
return data.contains(o);
}
@Override
public boolean isEmpty() {
return data.isEmpty();
}
@Override
public Object[] toArray() {
return data.toArray();
}
@Override
public <T1> T1[] toArray(T1[] a) {
return data.toArray(a);
}
@Override
public boolean add(T t) {
return data.add(t);
}
@Override
public boolean remove(Object o) {
return data.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return data.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends T> c) {
return data.addAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
return data.retainAll(c);
}
@Override
public boolean removeAll(Collection<?> c) {
return data.removeAll(c);
}
@Override
public void clear() {
data.clear();
}
@Override
public String toString() {
return data.toString();
}
@Override
public int hashCode() {
return data.hashCode() + DelegatingSet.class.hashCode();
}
}