blob: 677c0ea069a579a68c0ea3431305ce0519a03831 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#ifndef _DECAF_UTIL_DEQUE_H_
#define _DECAF_UTIL_DEQUE_H_
#include <decaf/util/NoSuchElementException.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/lang/exceptions/IllegalArgumentException.h>
#include <decaf/lang/exceptions/IllegalStateException.h>
#include <decaf/util/Config.h>
#include <decaf/util/Queue.h>
namespace decaf {
namespace util {
/**
* Defines a 'Double ended Queue' interface that allows for insertion and removal
* of elements from both ends. Generally there is no limit on the number of
* elements that can be placed into a Deque.
*
* Unlike a List the Deque doesn't provide index element based access, however
* methods are provided to grant access to interior elements.
*
* @since 1.0
*/
template<typename E>
class Deque : public Queue<E> {
public:
virtual ~Deque() {}
/**
* Inserts an element onto the front of the Deque if possible without violating
* the implementations capacity restrictions. For a capacity restricted Deque it
* is preferable to call offerFirst instead.
*
* @param element
* The element to be placed at the front of the Deque.
*
* @throws IllegalStateException if the element cannot be added at this time due to
* capacity restrictions
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
* @throws IllegalArgumentException if some property of the specified element prevents it
* from being added to this deque.
*/
virtual void addFirst(const E& element) = 0;
/**
* Inserts an element onto the end of the Deque if possible without violating
* the implementations capacity restrictions. For a capacity restricted Deque it
* is preferable to call offerLast instead.
*
* @param element
* The element to be placed at the end of the Deque.
*
* @throws IllegalStateException if the element cannot be added at this time due to
* capacity restrictions
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
* @throws IllegalArgumentException if some property of the specified element prevents it
* from being added to this deque.
*/
virtual void addLast(const E& element) = 0;
/**
* This method attempts to insert the given element into the Deque at the front end.
* Unlike the addFirst method that throws an exception if it cannot insert the element due
* to capacity restrictions etc this method returns false if it cannot insert the element.
*
* @param element
* The element to add to this Deque.
*
* @return true if the element was added, false otherwise.
*
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
* @throws IllegalArgumentException if some property of the specified element prevents it
* from being added to this deque.
*/
virtual bool offerFirst(const E& element) = 0;
/**
* This method attempts to insert the given element into the Deque at the end. Unlike
* the addLast method that throws an exception if it cannot insert the element due
* to capacity restrictions etc this method returns false if it cannot insert the element.
*
* @param element
* The element to add to this Deque.
*
* @return true if the element was added, false otherwise.
*
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
* @throws IllegalArgumentException if some property of the specified element prevents it
* from being added to this deque.
*/
virtual bool offerLast(const E& element) = 0;
/**
* Removes the topmost element from the Deque and returns it. Unlike the pollFirst
* method this method throws a NuSuchElementException if the Deque is empty.
*
* @return the element at the Head of the Deque.
*
* @throws NoSuchElementException if the Deque is empty.
*/
virtual E removeFirst() = 0;
/**
* Removes the last element from the Deque and returns it. Unlike the pollLast
* method this method throws a NuSuchElementException if the Deque is empty.
*
* @return the element at the Tail of the Deque.
*
* @throws NoSuchElementException if the Deque is empty.
*/
virtual E removeLast() = 0;
/**
* Removes the first element from the Deque assigns it to the element reference passed.
*
* @param element
* Reference to an variable that can be assigned the value of the head of this Deque.
*
* @return true if an element was available to remove, false otherwise.
*/
virtual bool pollFirst(E& element) = 0;
/**
* Removes the last element from the Deque assigns it to the element reference passed.
*
* @param element
* Reference to an variable that can be assigned the value of the tail of this Deque.
*
* @return true if an element was available to remove, false otherwise.
*/
virtual bool pollLast(E& element) = 0;
/**
* Attempts to fetch a reference to the first element in the Deque. This method does
* not remove the element from the Deque but simply returns a reference to it.
*
* @return reference to the first element in the Deque.
*
* @throws NoSuchElementException if the Deque is empty.
*/
virtual E& getFirst() = 0;
virtual const E& getFirst() const = 0;
/**
* Attempts to fetch a reference to the last element in the Deque. This method does
* not remove the element from the Deque but simply returns a reference to it.
*
* @return reference to the last element in the Deque.
*
* @throws NoSuchElementException if the Deque is empty.
*/
virtual E& getLast() = 0;
virtual const E& getLast() const = 0;
/**
* Retrieves the first element contained in this Deque and assigns its value to the
* reference value passed the value however is not removed from the Deque. If this
* call is successful it returns true. Unlike getFirst this method does not throw an
* exception if the Deque is empty.
*
* @return true if an element was assigned to the reference passed, false otherwise.
*/
virtual bool peekFirst(E& value) const = 0;
/**
* Retrieves the last element contained in this Deque and assigns its value to the
* reference value passed the value however is not removed from the Deque. If this
* call is successful it returns true. Unlike getLast this method does not throw an
* exception if the Deque is empty.
*
* @return true if an element was assigned to the reference passed, false otherwise.
*/
virtual bool peekLast(E& value) const = 0;
/**
* Removes the first occurrence of the specified element from this Deque. If there is no
* matching element then the Deque is left unchanged.
*
* @param value
* The value to be removed from this Deque.
*
* @return true if the Deque was modified as a result of this operation.
*
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
*/
virtual bool removeFirstOccurrence(const E& value) = 0;
/**
* Removes the last occurrence of the specified element from this Deque. If there is no
* matching element then the Deque is left unchanged.
*
* @param value
* The value to be removed from this Deque.
*
* @return true if the Deque was modified as a result of this operation.
*
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
*/
virtual bool removeLastOccurrence(const E& value) = 0;
/**
* Pushes an element onto the stack represented by this deque (in other words, at the head
* of this deque) if it is possible to do so immediately without violating capacity restrictions,
* otherwise it throwing an IllegalStateException if no space is currently available.
*
* This method performs the same basic operation as the addFirst method.
*
* @param element
* The element to be pushed onto the Deque.
*
* @throws IllegalStateException if the element cannot be added at this time due to
* capacity restrictions
* @throws NullPointerException if the specified element is NULL and this deque is a Collection
* of pointers and does not permit null elements.
* @throws IllegalArgumentException if some property of the specified element prevents it
* from being added to this deque.
*/
virtual void push(const E& element) = 0;
/**
* Treats this Deque as a stack and attempts to pop an element off the top. If there's no
* element to pop then a NuSuchElementException is thrown, otherwise the top element is removed
* and assigned to the reference passed.
*
* This operation performs the same basic function as the removeFirst method.
*
* @return the element at the front of this deque which would be the top of a stack.
*
* @throws NoSuchElementException if there is nothing on the top of the stack.
*/
virtual E pop() = 0;
/**
* Provides an Iterator over this Collection that traverses the element in reverse order.
*
* @return a new Iterator instance that moves from last to first.
*/
virtual Iterator<E>* descendingIterator() = 0;
virtual Iterator<E>* descendingIterator() const = 0;
};
}}
#endif /* _DECAF_UTIL_DEQUE_H_ */