| | |
| | | * CDDL HEADER END |
| | | * |
| | | * |
| | | * Copyright 2009 Sun Microsystems, Inc. |
| | | * Copyright 2009-2010 Sun Microsystems, Inc. |
| | | */ |
| | | |
| | | package com.sun.opends.sdk.util; |
| | | |
| | | |
| | | |
| | | import java.util.AbstractCollection; |
| | | import java.util.Collection; |
| | | import java.util.Iterator; |
| | | import java.util.*; |
| | | |
| | | |
| | | |
| | |
| | | */ |
| | | public final class Collections2 |
| | | { |
| | | private static final class TransformedCollection<M, N, P> extends |
| | | AbstractCollection<N> implements Collection<N> |
| | | private static class TransformedCollection<M, N, P, C extends Collection<M>> |
| | | extends AbstractCollection<N> implements Collection<N> |
| | | { |
| | | |
| | | private final Collection<M> collection; |
| | | protected final C collection; |
| | | |
| | | private final Function<? super M, ? extends N, P> funcMtoN; |
| | | protected final Function<? super M, ? extends N, P> funcMtoN; |
| | | |
| | | private final Function<? super N, ? extends M, P> funcNtoM; |
| | | protected final Function<? super N, ? extends M, P> funcNtoM; |
| | | |
| | | private final P p; |
| | | protected final P p; |
| | | |
| | | |
| | | |
| | | private TransformedCollection(final Collection<M> collection, |
| | | protected TransformedCollection(final C collection, |
| | | final Function<? super M, ? extends N, P> funcMtoN, |
| | | final Function<? super N, ? extends M, P> funcNtoM, final P p) |
| | | { |
| | |
| | | @Override |
| | | public Iterator<N> iterator() |
| | | { |
| | | return Iterators.transform(collection.iterator(), funcMtoN, p); |
| | | return Iterators.transformedIterator(collection.iterator(), funcMtoN, p); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | |
| | | |
| | | private static final class TransformedList<M, N, P> extends |
| | | TransformedCollection<M, N, P, List<M>> implements List<N> |
| | | { |
| | | |
| | | private TransformedList(final List<M> list, |
| | | final Function<? super M, ? extends N, P> funcMtoN, |
| | | final Function<? super N, ? extends M, P> funcNtoM, final P p) |
| | | { |
| | | super(list, funcMtoN, funcNtoM, p); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void add(final int index, final N element) |
| | | { |
| | | collection.add(index, funcNtoM.apply(element, p)); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public boolean addAll(final int index, final Collection<? extends N> c) |
| | | { |
| | | // We cannot transform c here due to type-safety. |
| | | boolean result = false; |
| | | for (final N e : c) |
| | | { |
| | | result |= add(e); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public N get(final int index) |
| | | { |
| | | return funcMtoN.apply(collection.get(index), p); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | @SuppressWarnings("unchecked") |
| | | public int indexOf(final Object o) |
| | | { |
| | | final N tmp = (N) o; |
| | | return collection.indexOf(funcNtoM.apply(tmp, p)); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | @SuppressWarnings("unchecked") |
| | | public int lastIndexOf(final Object o) |
| | | { |
| | | final N tmp = (N) o; |
| | | return collection.lastIndexOf(funcNtoM.apply(tmp, p)); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public ListIterator<N> listIterator() |
| | | { |
| | | return listIterator(0); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public ListIterator<N> listIterator(final int index) |
| | | { |
| | | final ListIterator<M> iterator = collection.listIterator(index); |
| | | return new ListIterator<N>() |
| | | { |
| | | |
| | | @Override |
| | | public void add(final N e) |
| | | { |
| | | iterator.add(funcNtoM.apply(e, p)); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public boolean hasNext() |
| | | { |
| | | return iterator.hasNext(); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public boolean hasPrevious() |
| | | { |
| | | return iterator.hasPrevious(); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public N next() |
| | | { |
| | | return funcMtoN.apply(iterator.next(), p); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public int nextIndex() |
| | | { |
| | | return iterator.nextIndex(); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public N previous() |
| | | { |
| | | return funcMtoN.apply(iterator.previous(), p); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public int previousIndex() |
| | | { |
| | | return iterator.previousIndex(); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public void remove() |
| | | { |
| | | iterator.remove(); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public void set(final N e) |
| | | { |
| | | iterator.set(funcNtoM.apply(e, p)); |
| | | } |
| | | |
| | | }; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public N remove(final int index) |
| | | { |
| | | return funcMtoN.apply(collection.remove(index), p); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public N set(final int index, final N element) |
| | | { |
| | | final M result = collection.set(index, funcNtoM.apply(element, p)); |
| | | return funcMtoN.apply(result, p); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public List<N> subList(final int fromIndex, final int toIndex) |
| | | { |
| | | final List<M> subList = collection.subList(fromIndex, toIndex); |
| | | return new TransformedList<M, N, P>(subList, funcMtoN, funcNtoM, p); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a view of {@code collection} whose values have been mapped to |
| | | * elements of type {@code N} using {@code funcMtoN}. The returned collection |
| | |
| | | * @param <N> |
| | | * The type of elements contained in the returned collection. |
| | | * @param <P> |
| | | * The type of the additional parameter to the function's {@code |
| | | * apply} method. Use {@link java.lang.Void} for functions that do |
| | | * not need an additional parameter. |
| | | * The type of the additional parameter to the function's |
| | | * {@code apply} method. Use {@link java.lang.Void} for functions |
| | | * that do not need an additional parameter. |
| | | * @param collection |
| | | * The collection to be transformed. |
| | | * @param funcMtoN |
| | |
| | | * @return A view of {@code collection} whose values have been mapped to |
| | | * elements of type {@code N} using {@code funcMtoN}. |
| | | */ |
| | | public static <M, N, P> Collection<N> transform( |
| | | public static <M, N, P> Collection<N> transformedCollection( |
| | | final Collection<M> collection, |
| | | final Function<? super M, ? extends N, P> funcMtoN, |
| | | final Function<? super N, ? extends M, P> funcNtoM, final P p) |
| | | { |
| | | return new TransformedCollection<M, N, P>(collection, funcMtoN, funcNtoM, p); |
| | | return new TransformedCollection<M, N, P, Collection<M>>(collection, |
| | | funcMtoN, funcNtoM, p); |
| | | } |
| | | |
| | | |
| | |
| | | * @return A view of {@code collection} whose values have been mapped to |
| | | * elements of type {@code N} using {@code funcMtoN}. |
| | | */ |
| | | public static <M, N> Collection<N> transform(final Collection<M> collection, |
| | | public static <M, N> Collection<N> transformedCollection( |
| | | final Collection<M> collection, |
| | | final Function<? super M, ? extends N, Void> funcMtoN, |
| | | final Function<? super N, ? extends M, Void> funcNtoM) |
| | | { |
| | | return new TransformedCollection<M, N, Void>(collection, funcMtoN, |
| | | funcNtoM, null); |
| | | return new TransformedCollection<M, N, Void, Collection<M>>(collection, |
| | | funcMtoN, funcNtoM, null); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a view of {@code list} whose values have been mapped to elements of |
| | | * type {@code N} using {@code funcMtoN}. The returned list supports all |
| | | * operations. |
| | | * |
| | | * @param <M> |
| | | * The type of elements contained in {@code list}. |
| | | * @param <N> |
| | | * The type of elements contained in the returned list. |
| | | * @param <P> |
| | | * The type of the additional parameter to the function's |
| | | * {@code apply} method. Use {@link java.lang.Void} for functions |
| | | * that do not need an additional parameter. |
| | | * @param list |
| | | * The list to be transformed. |
| | | * @param funcMtoN |
| | | * A function which maps values of type {@code M} to values of type |
| | | * {@code N}. This function will be used when retrieving values from |
| | | * {@code list}. |
| | | * @param funcNtoM |
| | | * A function which maps values of type {@code N} to values of type |
| | | * {@code M}. This function will be used when performing queries and |
| | | * adding values to {@code list} . |
| | | * @param p |
| | | * A predicate specified parameter. |
| | | * @return A view of {@code list} whose values have been mapped to elements of |
| | | * type {@code N} using {@code funcMtoN}. |
| | | */ |
| | | public static <M, N, P> List<N> transformedList(final List<M> list, |
| | | final Function<? super M, ? extends N, P> funcMtoN, |
| | | final Function<? super N, ? extends M, P> funcNtoM, final P p) |
| | | { |
| | | return new TransformedList<M, N, P>(list, funcMtoN, funcNtoM, p); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a view of {@code list} whose values have been mapped to elements of |
| | | * type {@code N} using {@code funcMtoN}. The returned list supports all |
| | | * operations. |
| | | * |
| | | * @param <M> |
| | | * The type of elements contained in {@code list}. |
| | | * @param <N> |
| | | * The type of elements contained in the returned list. |
| | | * @param list |
| | | * The list to be transformed. |
| | | * @param funcMtoN |
| | | * A function which maps values of type {@code M} to values of type |
| | | * {@code N}. This function will be used when retrieving values from |
| | | * {@code list}. |
| | | * @param funcNtoM |
| | | * A function which maps values of type {@code N} to values of type |
| | | * {@code M}. This function will be used when performing queries and |
| | | * adding values to {@code list} . |
| | | * @return A view of {@code list} whose values have been mapped to elements of |
| | | * type {@code N} using {@code funcMtoN}. |
| | | */ |
| | | public static <M, N> List<N> transformedList(final List<M> list, |
| | | final Function<? super M, ? extends N, Void> funcMtoN, |
| | | final Function<? super N, ? extends M, Void> funcNtoM) |
| | | { |
| | | return new TransformedList<M, N, Void>(list, funcMtoN, funcNtoM, null); |
| | | } |
| | | |
| | | |