/*
* Copyright 2003-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.mps.nodeEditor.cells.collections;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Iterator;
/**
* User: shatalin
* Date: 10/02/16
*/
public interface Container<T> extends Iterable<T> {
/**
* Returns the number of elements in this container.
* <p>
*
* @return the number of elements in this container
*/
int size();
/**
* @return true if this container contains no elements
*/
boolean isEmpty();
/**
* Appends the specified element to the end of this container (optional operation)
* <p>
* Returns the element that was added to the container.
*
* @param item element to be appended to this container
* @return added element
* @throws IllegalArgumentException if the specified element already present in this container
* @throws UnsupportedOperationException if the {@code add} operation is not supported by this container
*/
T add(@NotNull T item);
/**
* Appends the specified element before the specified anchor element (optional operation)
* <p>
* Appends the specified element to the end of this container if specified anchor parameter is null.
* <p>
* Returns the element that was added to the container.
*
* @param item element to be added to this container
* @param anchor new element will be added before this element
* @return added element
* @throws java.util.NoSuchElementException is specified anchor element was not found in this container
* @throws IllegalArgumentException if the specified element already present in this container
* @throws UnsupportedOperationException if the {@code add} operation is not supported by this container
*/
T addBefore(@NotNull T item, T anchor);
/**
* Removes the specified element from this container (optional operation)
* <p>
* Returns the element that was removed from the container.
*
* @param item the element to be removed
* @return removed element
* @throws java.util.NoSuchElementException is specified element was not found in this container
* @throws UnsupportedOperationException if the {@code remove} operation is not supported by this container
*/
T remove(@NotNull T item);
/**
* Returns true if this container contains the specified element.
*
* @param item element whose presence in this container is to be tested
* @return true if this container contains specified element.
*/
boolean contains(@NotNull T item);
/**
* @return an iterator over the elements in this container in proper sequence
*/
@NotNull
Iterator<T> iterator();
/**
* Returns an iterator over the elements in this container (in proper sequence), starting with the element
* right after (before) the specified one.
* <p>
* If the specified anchor is null then returned iterator will iterate over all contained elements starting
* from the first (last) one.
* <p>
* Direction of the iteration can be specified by forward parameter.
*
* @param anchor first element, returned by the iterator, wil be the one right after (before) the specified
* anchor
* @param forward if true, iterator will go from start to end, if false - from end to start
* @return an iterator over the elements in this container in proper sequence
* @throws java.util.NoSuchElementException is specified anchor element was not found in this container
*/
@NotNull
Iterator<T> iterator(T anchor, boolean forward);
/**
* @return the first element in this container
* @throws java.util.NoSuchElementException if this container is empty
*/
@Nullable
T getFirst();
/**
* @return the last element in this container
* @throws java.util.NoSuchElementException if this container is empty
*/
@Nullable
T getLast();
}