package nl.tudelft.simulation.immutablecollections; import java.util.Collection; import java.util.List; import java.util.RandomAccess; import java.util.Spliterator; import java.util.function.Consumer; import java.util.stream.Stream; import nl.tudelft.simulation.language.Throw; /** * An abstract base class for an immutable wrapper for a List. *

* Copyright (c) 2016-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights * reserved. See for project information * https://simulation.tudelft.nl. The DSOL project is distributed under a three-clause BSD-style license, which can * be found at * https://simulation.tudelft.nl/dsol/3.0/license.html. *

* @author Alexander Verbraeck * @author Peter Knoppers * @author Wouter Schakel * @param the type of content of this List */ public abstract class ImmutableAbstractList extends ImmutableAbstractCollection implements ImmutableList, RandomAccess { /** */ private static final long serialVersionUID = 20160507L; /** the list that is wrapped, without giving access to methods that can change it. */ private final List list; /** * Construct an abstract immutable list. Make sure that the argument is a safe copy of the list or pointer to the * list of the right type! Copying does not take place in the Abstract class! * @param list a safe copy of the list, or pointer to the list to use for the immutable list * @param copyOrWrap indicate whether the immutable is a copy or a wrap */ protected ImmutableAbstractList(final List list, final Immutable copyOrWrap) { super(copyOrWrap); Throw.whenNull(list, "the list argument cannot be null"); this.list = list; } /** {@inheritDoc} */ @Override public final Collection toCollection() { return toList(); } /** {@inheritDoc} */ @Override protected List getCollection() { return this.list; } /** {@inheritDoc} */ @Override public final int size() { return this.list.size(); } /** {@inheritDoc} */ @Override public final boolean isEmpty() { return this.list.isEmpty(); } /** {@inheritDoc} */ @Override public final boolean contains(final Object o) { return this.list.contains(o); } /** {@inheritDoc} */ @Override public final int indexOf(final Object o) { return this.list.indexOf(o); } /** {@inheritDoc} */ @Override public final int lastIndexOf(final Object o) { return this.list.lastIndexOf(o); } /** {@inheritDoc} */ @Override public final Object[] toArray() { return this.list.toArray(); } /** {@inheritDoc} */ @Override public final T[] toArray(final T[] a) { return this.list.toArray(a); } /** {@inheritDoc} */ @Override public final E get(final int index) { return this.list.get(index); } /** {@inheritDoc} */ @Override public final ImmutableIterator iterator() { return new ImmutableIterator(this.list.iterator()); } /** {@inheritDoc} */ @Override public final void forEach(final Consumer action) { this.list.forEach(action); } /** {@inheritDoc} */ @Override public final Spliterator spliterator() { return this.list.spliterator(); } /** {@inheritDoc} */ @Override public final boolean containsAll(final Collection c) { return this.list.containsAll(c); } /** {@inheritDoc} */ @Override public final boolean containsAll(final ImmutableCollection c) { return this.list.containsAll(c.toCollection()); } /** {@inheritDoc} */ @Override public final Stream stream() { return this.list.stream(); } /** {@inheritDoc} */ @Override public final Stream parallelStream() { return this.list.parallelStream(); } /** {@inheritDoc} */ @Override public final boolean isWrap() { return this.copyOrWrap.isWrap(); } /** {@inheritDoc} */ @Override @SuppressWarnings("checkstyle:designforextension") public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((this.list == null) ? 0 : this.list.hashCode()); return result; } /** {@inheritDoc} */ @Override @SuppressWarnings({"checkstyle:designforextension", "checkstyle:needbraces"}) public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ImmutableAbstractList other = (ImmutableAbstractList) obj; if (this.list == null) { if (other.list != null) return false; } else if (!this.list.equals(other.list)) return false; return true; } /** {@inheritDoc} */ @Override @SuppressWarnings("checkstyle:designforextension") public String toString() { return "Immutable[" + this.list.toString() + "]"; } }