mirror of https://github.com/apache/activemq.git
made IndexLinkedList an interface
git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@424037 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4806b2b4cb
commit
1ac701c48a
|
@ -1,276 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Copyright 2005-2006 The Apache Software Foundation
|
|
||||||
*
|
|
||||||
* 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 org.apache.activemq.kaha.impl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A linked list used by IndexItems
|
|
||||||
*
|
|
||||||
* @version $Revision: 1.2 $
|
|
||||||
*/
|
|
||||||
final class IndexLinkedList implements Cloneable{
|
|
||||||
private transient IndexItem root;
|
|
||||||
private transient int size=0;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs an empty list.
|
|
||||||
*/
|
|
||||||
IndexLinkedList(IndexItem header){
|
|
||||||
this.root = header;
|
|
||||||
this.root.next=root.prev=root;
|
|
||||||
}
|
|
||||||
|
|
||||||
IndexItem getRoot(){
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the first element in this list.
|
|
||||||
*
|
|
||||||
* @return the first element in this list.
|
|
||||||
*/
|
|
||||||
IndexItem getFirst(){
|
|
||||||
if(size==0)
|
|
||||||
return null;
|
|
||||||
return root.next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the last element in this list.
|
|
||||||
*
|
|
||||||
* @return the last element in this list.
|
|
||||||
*/
|
|
||||||
IndexItem getLast(){
|
|
||||||
if(size==0)
|
|
||||||
return null;
|
|
||||||
return root.prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes and returns the first element from this list.
|
|
||||||
*
|
|
||||||
* @return the first element from this list.
|
|
||||||
*/
|
|
||||||
IndexItem removeFirst(){
|
|
||||||
if(size==0){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
IndexItem result=root.next;
|
|
||||||
remove(root.next);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes and returns the last element from this list.
|
|
||||||
*
|
|
||||||
* @return the last element from this list.
|
|
||||||
*/
|
|
||||||
Object removeLast(){
|
|
||||||
if(size==0)
|
|
||||||
return null;
|
|
||||||
IndexItem result=root.prev;
|
|
||||||
remove(root.prev);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts the given element at the beginning of this list.
|
|
||||||
*
|
|
||||||
* @param o the element to be inserted at the beginning of this list.
|
|
||||||
*/
|
|
||||||
void addFirst(IndexItem item){
|
|
||||||
addBefore(item,root.next);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends the given element to the end of this list. (Identical in function to the <tt>add</tt> method; included
|
|
||||||
* only for consistency.)
|
|
||||||
*
|
|
||||||
* @param o the element to be inserted at the end of this list.
|
|
||||||
*/
|
|
||||||
void addLast(IndexItem item){
|
|
||||||
addBefore(item,root);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the number of elements in this list.
|
|
||||||
*
|
|
||||||
* @return the number of elements in this list.
|
|
||||||
*/
|
|
||||||
int size(){
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* is the list empty?
|
|
||||||
*
|
|
||||||
* @return true if there are no elements in the list
|
|
||||||
*/
|
|
||||||
boolean isEmpty(){
|
|
||||||
return size==0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends the specified element to the end of this list.
|
|
||||||
*
|
|
||||||
* @param o element to be appended to this list.
|
|
||||||
* @return <tt>true</tt> (as per the general contract of <tt>Collection.add</tt>).
|
|
||||||
*/
|
|
||||||
boolean add(IndexItem item){
|
|
||||||
addBefore(item,root);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes all of the elements from this list.
|
|
||||||
*/
|
|
||||||
void clear(){
|
|
||||||
root.next=root.prev=root;
|
|
||||||
size=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Positional Access Operations
|
|
||||||
/**
|
|
||||||
* Returns the element at the specified position in this list.
|
|
||||||
*
|
|
||||||
* @param index index of element to return.
|
|
||||||
* @return the element at the specified position in this list.
|
|
||||||
*
|
|
||||||
* @throws IndexOutOfBoundsException if the specified index is is out of range (<tt>index < 0 || index >= size()</tt>).
|
|
||||||
*/
|
|
||||||
IndexItem get(int index){
|
|
||||||
return entry(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts the specified element at the specified position in this list. Shifts the element currently at that
|
|
||||||
* position (if any) and any subsequent elements to the right (adds one to their indices).
|
|
||||||
*
|
|
||||||
* @param index index at which the specified element is to be inserted.
|
|
||||||
* @param element element to be inserted.
|
|
||||||
*
|
|
||||||
* @throws IndexOutOfBoundsException if the specified index is out of range (<tt>index < 0 || index > size()</tt>).
|
|
||||||
*/
|
|
||||||
void add(int index,IndexItem element){
|
|
||||||
addBefore(element,(index==size?root:entry(index)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts
|
|
||||||
* one from their indices). Returns the element that was removed from the list.
|
|
||||||
*
|
|
||||||
* @param index the index of the element to removed.
|
|
||||||
* @return the element previously at the specified position.
|
|
||||||
*
|
|
||||||
* @throws IndexOutOfBoundsException if the specified index is out of range (<tt>index < 0 || index >= size()</tt>).
|
|
||||||
*/
|
|
||||||
Object remove(int index){
|
|
||||||
IndexItem e=entry(index);
|
|
||||||
remove(e);
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the indexed entry.
|
|
||||||
*/
|
|
||||||
private IndexItem entry(int index){
|
|
||||||
if(index<0||index>=size)
|
|
||||||
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
|
|
||||||
IndexItem e=root;
|
|
||||||
if(index<size/2){
|
|
||||||
for(int i=0;i<=index;i++)
|
|
||||||
e=e.next;
|
|
||||||
}else{
|
|
||||||
for(int i=size;i>index;i--)
|
|
||||||
e=e.prev;
|
|
||||||
}
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search Operations
|
|
||||||
/**
|
|
||||||
* Returns the index in this list of the first occurrence of the specified element, or -1 if the List does not
|
|
||||||
* contain this element. More formally, returns the lowest index i such that
|
|
||||||
* <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if there is no such index.
|
|
||||||
*
|
|
||||||
* @param o element to search for.
|
|
||||||
* @return the index in this list of the first occurrence of the specified element, or -1 if the list does not
|
|
||||||
* contain this element.
|
|
||||||
*/
|
|
||||||
int indexOf(IndexItem o){
|
|
||||||
int index=0;
|
|
||||||
for(IndexItem e=root.next;e!=root;e=e.next){
|
|
||||||
if(o==e){
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the next entry after this entry
|
|
||||||
*
|
|
||||||
* @param entry
|
|
||||||
* @return next entry
|
|
||||||
*/
|
|
||||||
IndexItem getNextEntry(IndexItem entry){
|
|
||||||
return entry.next != root ? entry.next : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrive the prev entry after this entry
|
|
||||||
*
|
|
||||||
* @param entry
|
|
||||||
* @return prev entry
|
|
||||||
*/
|
|
||||||
IndexItem getPrevEntry(IndexItem entry){
|
|
||||||
return entry.prev != root ? entry.prev : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert an Entry before this entry
|
|
||||||
*
|
|
||||||
* @param o the elment to insert
|
|
||||||
* @param e the Entry to insert the object before
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void addBefore(IndexItem insert,IndexItem e){
|
|
||||||
insert.next=e;
|
|
||||||
insert.prev=e.prev;
|
|
||||||
insert.prev.next=insert;
|
|
||||||
insert.next.prev=insert;
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void remove(IndexItem e){
|
|
||||||
if(e==root)
|
|
||||||
return;
|
|
||||||
e.prev.next=e.next;
|
|
||||||
e.next.prev=e.prev;
|
|
||||||
size--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*@return clone
|
|
||||||
*/
|
|
||||||
public Object clone(){
|
|
||||||
IndexLinkedList clone=new IndexLinkedList(this.root);
|
|
||||||
for(IndexItem e=root.next;e!=root;e=e.next)
|
|
||||||
clone.add(e);
|
|
||||||
return clone;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue