package com.bergerkiller.bukkit.common.conversion.util; import java.util.Collection; import java.util.Iterator; import com.bergerkiller.bukkit.common.collections.CollectionBasics; import com.bergerkiller.bukkit.common.conversion.Converter; import com.bergerkiller.bukkit.common.conversion.ConverterPair; /** * Wraps around another collection of unknown contents and performs conversions automatically. * This can be used to interact with collections that require additional element conversion. * * @param <T> - exposed type */ public class ConvertingCollection<T> implements Collection<T> { private final Collection<Object> base; protected final ConverterPair<Object, T> converterPair; public ConvertingCollection(Collection<?> collection, Converter<?> converterSet, Converter<T> converterGet) { this(collection, converterSet.formPair(converterGet)); } @SuppressWarnings("unchecked") public ConvertingCollection(Collection<?> collection, ConverterPair<?, T> converterPair) { this.base = (Collection<Object>) collection; this.converterPair = (ConverterPair<Object, T>) converterPair; } /** * Gets the base collection that is used * * @return base collection */ public Collection<Object> getBase() { return base; } @Override public int size() { return base.size(); } @Override public boolean isEmpty() { return base.isEmpty(); } @Override public void clear() { base.clear(); } @Override public boolean add(T e) { return base.add(converterPair.convertA(e)); } @Override public boolean remove(Object o) { return base.remove(converterPair.convertA(o)); } @Override public boolean contains(Object o) { return base.contains(converterPair.convertA(o)); } @Override public Iterator<T> iterator() { return new ConvertingIterator<T>(base.iterator(), converterPair.getConverterB()); } @Override public boolean containsAll(Collection<?> c) { return base.containsAll(new ConvertingCollection<Object>(c, converterPair.reverse())); } @Override public boolean addAll(Collection<? extends T> c) { return base.addAll(new ConvertingCollection<Object>(c, converterPair.reverse())); } @Override public boolean removeAll(Collection<?> c) { return base.removeAll(new ConvertingCollection<Object>(c, converterPair.reverse())); } @Override public boolean retainAll(Collection<?> c) { return CollectionBasics.retainAll(this, c); } @Override public Object[] toArray() { return CollectionBasics.toArray(this); } @Override public <K> K[] toArray(K[] array) { return CollectionBasics.toArray(this, array); } }