Author: j16sdiz
Date: 2008-08-18 13:50:32 +0000 (Mon, 18 Aug 2008)
New Revision: 22007
Modified:
trunk/freenet/src/freenet/support/DoublyLinkedList.java
trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java
trunk/freenet/src/freenet/support/LRUHashtable.java
Log:
Revert r21989 "fix generic"
Modified: trunk/freenet/src/freenet/support/DoublyLinkedList.java
===================================================================
--- trunk/freenet/src/freenet/support/DoublyLinkedList.java 2008-08-18
13:45:25 UTC (rev 22006)
+++ trunk/freenet/src/freenet/support/DoublyLinkedList.java 2008-08-18
13:50:32 UTC (rev 22007)
@@ -6,31 +6,31 @@
* Framework for managing a doubly linked list.
* @author tavin
*/
-public interface DoublyLinkedList<T extends DoublyLinkedList.Item<T>> {
+public interface DoublyLinkedList<T> {
public abstract DoublyLinkedList<T> clone();
/**
* List element
*/
- public interface Item<T extends Item<T>> {
+ public interface Item<T> {
/**
* Get next {@link Item}. May or may not return
* <code>null</code> if this is the last <code>Item</code>.
*
* @see DoublyLinkedList#hasNext()
*/
- T getNext();
+ DoublyLinkedList.Item<T> getNext();
/** Set next {@link Item} */
- T setNext(T i);
+ DoublyLinkedList.Item<T> setNext(DoublyLinkedList.Item<T> i);
/**
* Get previous {@link Item}. May or may not return <code>null</code>
* if this is the first <code>Item</code>.
*
* @see DoublyLinkedList#hasNext()
*/
- T getPrev();
+ Item<T> getPrev();
/** Get previous {@link Item} */
- T setPrev(T i);
+ Item<T> setPrev(DoublyLinkedList.Item<T> i);
/** Return the contained list. <strong>For sanity checking
only.</strong> */
DoublyLinkedList<T> getParent();
@@ -45,23 +45,23 @@
/** Check if this list is empty. @return <code>true</code> if this list is
empty, <code>false</code> otherwise. */
boolean isEmpty();
/** Get a {@link Enumeration} of {@link DoublyLinkedList.Item}. */
- Enumeration<T> elements(); // for consistency w/ typical Java API
+ Enumeration elements(); // for consistency w/ typical Java API
/**
* Returns the first item.
* @return the item at the head of the list, or <code>null</code> if empty
*/
- T head();
+ Item head();
/**
* Returns the last item.
* @return the item at the tail of the list, or <code>null</code> if empty
*/
- T tail();
+ Item tail();
/**
* Puts the item before the first item.
*/
- void unshift(T i);
+ void unshift(DoublyLinkedList.Item<T> i);
/**
* Put all items in the specified list before the first item.
*/
@@ -69,7 +69,7 @@
/**
* Removes and returns the first item.
*/
- T shift();
+ Item shift();
/**
* Remove <tt>n</tt> elements from head and return them as a
<code>DoublyLinkedList</code>.
*/
@@ -78,7 +78,7 @@
/**
* Puts the item after the last item.
*/
- void push(T i);
+ void push(DoublyLinkedList.Item<T> i);
/**
* Puts all items in the specified list after the last item.
*/
@@ -86,41 +86,41 @@
/**
* Removes and returns the last item.
*/
- T pop();
+ Item pop();
/**
* Remove <tt>n</tt> elements from tail and return them as a
<code>DoublyLinkedList</code>.
*/
DoublyLinkedList pop(int n);
- /** @return <code>true</code> if <code>i</code> has next item. (ie. not
the last item); <code>false</code> otherwise */
- boolean hasNext(T i);
+ /** @return <code>true</code> if <code>i</code> has next item. (ie. not
the last item); <code>false</code> otherwise */
+ boolean hasNext(DoublyLinkedList.Item<T> i);
/** @return <code>true</code> if <code>i</code> has previous item. (ie.
not the first item); <code>false</code> otherwise */
- boolean hasPrev(T i);
+ boolean hasPrev(DoublyLinkedList.Item<T> i);
/** @return next item of <code>i</code>. If this is the last element,
return <code>null</code> */
- T next(T i);
+ Item next(DoublyLinkedList.Item<T> i);
/** @return previous item of <code>i</code>. If this is the first element,
return <code>null</code> */
- T prev(T i);
- /** Remove and return a element
+ Item prev(DoublyLinkedList.Item<T> i);
+ /** Remove and return a element
* @return this item, or <code>null</code> if the item was not in the list
*/
- T remove(T i);
+ Item remove(DoublyLinkedList.Item<T> i);
/**
* Inserts item <code>j</code> before item <code>i</code>.
*/
- void insertPrev(T i, T j);
+ void insertPrev(DoublyLinkedList.Item<T> i, DoublyLinkedList.Item<T> j);
/**
* Inserts the entire {@link DoublyLinkedList} <code>l</code> before item
<code>i</code>.
*/
- void insertPrev(T i, DoublyLinkedList<T> l);
+ void insertPrev(DoublyLinkedList.Item<T> i, DoublyLinkedList<T> l);
/**
* Inserts item <code>j</code> after item <code>i</code.
*/
- void insertNext(T i, T j);
+ void insertNext(DoublyLinkedList.Item<T> i, DoublyLinkedList.Item<T> j);
/**
* Inserts the entire {@link DoublyLinkedList} <code>l</code> after item
<code>i</code>.
*/
- void insertNext(T i, DoublyLinkedList<T> l);
+ void insertNext(DoublyLinkedList.Item<T> i, DoublyLinkedList<T> l);
}
Modified: trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java
===================================================================
--- trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java 2008-08-18
13:45:25 UTC (rev 22006)
+++ trunk/freenet/src/freenet/support/DoublyLinkedListImpl.java 2008-08-18
13:50:32 UTC (rev 22007)
@@ -10,10 +10,10 @@
* TODO: there are still some unimplemented methods
* -- it remains to be seen if they are needed at all
*/
-public class DoublyLinkedListImpl<T extends DoublyLinkedListImpl.Item<T>>
implements DoublyLinkedList<T> {
+public class DoublyLinkedListImpl<T> implements DoublyLinkedList<T>{
protected int size;
- protected T _headptr, _tailptr;
+ protected DoublyLinkedListImpl.Item<T> _headptr, _tailptr;
@Override
public final DoublyLinkedListImpl<T> clone() {
@@ -24,14 +24,14 @@
* A new list with no items.
*/
public DoublyLinkedListImpl() {
- _headptr = (T) new Item();
- _tailptr = (T) new Item();
+ _headptr = new Item<T>();
+ _tailptr = new Item<T>();
_headptr.setParent(this);
_tailptr.setParent(this);
clear();
}
- protected DoublyLinkedListImpl(T _h, T _t, int size) {
+ protected DoublyLinkedListImpl(DoublyLinkedListImpl.Item<T> _h,
DoublyLinkedListImpl.Item<T> _t, int size) {
_headptr = _h;
_tailptr = _t;
_headptr.setParent(this);
@@ -43,13 +43,13 @@
/**
* @param impl
*/
- protected DoublyLinkedListImpl(DoublyLinkedListImpl<T> impl) {
+ protected DoublyLinkedListImpl(DoublyLinkedListImpl impl) {
this();
- Enumeration<T> e = impl.forwardElements();
+ Enumeration<DoublyLinkedListImpl.Item<T>> e = impl.forwardElements();
boolean checked = false;
for(;e.hasMoreElements();) {
- T oi = e.nextElement();
- T i = oi.clone();
+ DoublyLinkedListImpl.Item<T> oi = e.nextElement();
+ DoublyLinkedList.Item<T> i = oi.clone();
if(!checked) {
checked = true;
if(!i.getClass().getName().equals(oi.getClass().getName())) {
@@ -70,8 +70,8 @@
// Help to detect removal after clear().
// The check in remove() is enough, strictly,
// as long as people don't add elements afterwards.
- DoublyLinkedList.Item pos = _headptr.next;
- DoublyLinkedList.Item opos = _headptr;
+ DoublyLinkedList.Item<T> pos = _headptr.next;
+ DoublyLinkedList.Item<T> opos = _headptr;
while(true) {
if(pos == _tailptr) break;
if(pos == null) break;
@@ -104,22 +104,22 @@
* {@inheritDoc}
* @see #forwardElements()
*/
- public final Enumeration elements() {
+ public final Enumeration<T> elements() {
return forwardElements();
}
/**
* {@inheritDoc}
*/
- public final T head() {
- return size == 0 ? null : (T) _headptr.next;
+ public final DoublyLinkedList.Item<T> head() {
+ return size == 0 ? null : _headptr.next;
}
/**
* {@inheritDoc}
*/
- public final T tail() {
- return size == 0 ? null : (T) _tailptr.prev;
+ public final DoublyLinkedList.Item<T> tail() {
+ return size == 0 ? null : _tailptr.prev;
}
@@ -127,8 +127,8 @@
/**
* {@inheritDoc}
*/
- public final void unshift(T i) {
- insertNext((T) _headptr, i);
+ public final void unshift(DoublyLinkedList.Item<T> i) {
+ insertNext(_headptr, i);
}
/**
@@ -141,8 +141,8 @@
/**
* {@inheritDoc}
*/
- public final T shift() {
- return size == 0 ? null : (T) remove((T) _headptr.next);
+ public final DoublyLinkedList.Item<T> shift() {
+ return size == 0 ? null : remove(_headptr.next);
}
/**
* {@inheritDoc}
@@ -152,13 +152,13 @@
if (n > size) n = size;
if (n < 1) return new DoublyLinkedListImpl<T>();
- T i = _headptr;
+ DoublyLinkedList.Item<T> i = _headptr;
for (int m=0; m<n; ++m)
i = i.getNext();
- T j = i.getNext();
- T newheadptr = (T) new Item<T>();
- T newtailptr = (T) new Item<T>();
+ DoublyLinkedList.Item<T> j = i.getNext();
+ Item<T> newheadptr = new Item<T>();
+ Item<T> newtailptr = new Item<T>();
j.setPrev(newheadptr);
newheadptr.setNext(j);
@@ -179,8 +179,8 @@
/**
* {@inheritDoc}
*/
- public final void push(T i) {
- insertPrev((T) _tailptr, i);
+ public final void push(DoublyLinkedList.Item<T> i) {
+ insertPrev(_tailptr, i);
}
/**
* {@inheritDoc}
@@ -192,8 +192,8 @@
/**
* {@inheritDoc}
*/
- public final T pop() {
- return size == 0 ? null : (T) remove((T) _tailptr.prev);
+ public final DoublyLinkedList.Item<T> pop() {
+ return size == 0 ? null : remove(_tailptr.prev);
}
/**
* {@inheritDoc}
@@ -203,13 +203,13 @@
if (n > size) n = size;
if (n < 1) return new DoublyLinkedListImpl<T>();
- T i = _tailptr;
+ DoublyLinkedList.Item<T> i = _tailptr;
for (int m=0; m<n; ++m)
i = i.getPrev();
- T j = i.getPrev();
- T newtailptr = (T) new Item<T>();
- T newheadptr = (T) new Item<T>();
+ DoublyLinkedList.Item<T> j = i.getPrev();
+ DoublyLinkedListImpl.Item<T> newtailptr = new Item<T>();
+ DoublyLinkedListImpl.Item<T> newheadptr = new Item<T>();
j.setNext(newtailptr);
newtailptr.setPrev(j);
@@ -230,29 +230,29 @@
/**
* {@inheritDoc}
*/
- public final boolean hasNext(T i) {
- DoublyLinkedList.Item next = i.getNext();
+ public final boolean hasNext(DoublyLinkedList.Item<T> i) {
+ DoublyLinkedList.Item<T> next = i.getNext();
return (next != null) && (next != _tailptr);
}
/**
* {@inheritDoc}
*/
- public final boolean hasPrev(T i) {
- DoublyLinkedList.Item prev = i.getPrev();
+ public final boolean hasPrev(DoublyLinkedList.Item<T> i) {
+ DoublyLinkedList.Item<T> prev = i.getPrev();
return (prev != null) && (prev != _headptr);
}
/**
* {@inheritDoc}
*/
- public final T next(T i) {
- T next = i.getNext();
- return next == _tailptr ? null : (T) next;
+ public final DoublyLinkedList.Item<T> next(DoublyLinkedList.Item<T> i) {
+ DoublyLinkedList.Item<T> next = i.getNext();
+ return next == _tailptr ? null : next;
}
/**
* {@inheritDoc}
*/
- public final T prev(T i) {
- T prev = i.getPrev();
+ public final DoublyLinkedList.Item<T> prev(DoublyLinkedList.Item<T> i) {
+ DoublyLinkedList.Item<T> prev = i.getPrev();
return prev == _headptr ? null : prev;
}
@@ -262,7 +262,7 @@
/**
* {@inheritDoc}
*/
- public T remove(T i) {
+ public DoublyLinkedList.Item<T> remove(DoublyLinkedList.Item<T> i) {
if (i.getParent() == null) return null; // not in list
if(isEmpty()) {
Logger.error(this, "Illegal ERROR: Removing from an empty
list!!");
@@ -270,7 +270,7 @@
}
if (i.getParent() != this)
throw new PromiscuousItemException(i, i.getParent());
- T next = i.getNext(), prev = i.getPrev();
+ DoublyLinkedList.Item<T> next = i.getNext(), prev = i.getPrev();
if ((next == null) && (prev == null)) return null; // not in the list
if ((next == null) || (prev == null))
throw new NullPointerException("next="+next+", prev="+prev); //
partially in the list?!
@@ -291,7 +291,7 @@
/**
* {@inheritDoc}
*/
- public void insertPrev(T i, T j) {
+ public void insertPrev(DoublyLinkedList.Item<T> i,
DoublyLinkedList.Item<T> j) {
if (i.getParent() == null)
throw new PromiscuousItemException(i, i.getParent()); //
different trace to make easier debugging
if (i.getParent() != this)
@@ -300,7 +300,7 @@
throw new PromiscuousItemException(j, j.getParent());
if ((j.getNext() != null) || (j.getPrev() != null))
throw new PromiscuousItemException(j);
- T prev = i.getPrev();
+ DoublyLinkedList.Item<T> prev = i.getPrev();
if (prev == null)
throw new VirginItemException(i);
prev.setNext(j);
@@ -315,21 +315,21 @@
* {@inheritDoc}
* FIXME: unimplemented
*/
- public void insertPrev(T i, DoublyLinkedList<T> l) {
+ public void insertPrev(DoublyLinkedList.Item<T> i, DoublyLinkedList<T> l) {
throw new RuntimeException("function currently unimplemented because i
am a lazy sod");
}
/**
* {@inheritDoc}
*/
- public void insertNext(T i, T j) {
+ public void insertNext(DoublyLinkedList.Item<T> i,
DoublyLinkedList.Item<T> j) {
if (i.getParent() != this)
throw new PromiscuousItemException(i, i.getParent());
if (j.getParent() != null)
throw new PromiscuousItemException(j, i.getParent());
if ((j.getNext() != null) || (j.getPrev() != null))
throw new PromiscuousItemException(j);
- T next = i.getNext();
+ DoublyLinkedList.Item next = i.getNext();
if (next == null)
throw new VirginItemException(i);
next.setPrev(j);
@@ -344,7 +344,7 @@
* {@inheritDoc}
* FIXME: unimplemented
*/
- public void insertNext(T i, DoublyLinkedList<T> l) {
+ public void insertNext(DoublyLinkedList.Item<T> i, DoublyLinkedList<T> l) {
throw new RuntimeException("function currently unimplemented because i
am a lazy sod");
}
@@ -362,46 +362,46 @@
* @return an Enumeration of list elements from tail to head
*/
protected Enumeration<T> reverseElements() {
- return new ReverseWalker();
+ return new ReverseWalker();
}
- private class ForwardWalker implements Enumeration<T> {
- protected DoublyLinkedList.Item next;
+ private class ForwardWalker<T extends DoublyLinkedListImpl.Item<T>>
implements Enumeration<DoublyLinkedList.Item<T>> {
+ protected DoublyLinkedList.Item<T> next;
protected ForwardWalker() {
next = _headptr.getNext();
}
- protected ForwardWalker(DoublyLinkedList.Item startAt,
+ protected ForwardWalker(DoublyLinkedList.Item<T> startAt,
boolean inclusive) {
next = (inclusive ? startAt : startAt.getNext());
}
public final boolean hasMoreElements() {
return next != _tailptr;
}
- public T nextElement() {
+ public DoublyLinkedList.Item<T> nextElement() {
if (next == _tailptr)
throw new NoSuchElementException();
- T result = (T) next;
+ DoublyLinkedList.Item<T> result = next;
next = next.getNext();
return result;
}
}
- private class ReverseWalker implements Enumeration<T> {
- protected DoublyLinkedList.Item next;
+ private class ReverseWalker<T extends DoublyLinkedList.Item<T>> implements
Enumeration<DoublyLinkedList.Item<T>> {
+ protected DoublyLinkedList.Item<T> next;
protected ReverseWalker() {
next = _tailptr.getPrev();
}
- protected ReverseWalker(DoublyLinkedList.Item startAt,
+ protected ReverseWalker(DoublyLinkedList.Item<T> startAt,
boolean inclusive) {
next = (inclusive ? startAt : startAt.getPrev());
}
public final boolean hasMoreElements() {
return next != _headptr;
}
- public T nextElement() {
+ public DoublyLinkedList.Item<T> nextElement() {
if (next == _headptr)
throw new NoSuchElementException();
- T result = (T) next;
+ DoublyLinkedList.Item<T> result = next;
if(next == null) throw new IllegalStateException("next==null");
next = next.getPrev();
return result;
@@ -411,36 +411,36 @@
//=== list element ====================================================
- public static class Item<T extends Item<T>> implements
DoublyLinkedList.Item<T> {
- private T prev;
- private T next;
+ public static class Item<T> implements DoublyLinkedList.Item<T> {
+ private DoublyLinkedList.Item<T> prev;
+ private DoublyLinkedList.Item<T> next;
private DoublyLinkedList list;
@Override
- public T clone() {
+ public DoublyLinkedList.Item<T> clone() {
if(getClass() != Item.class)
throw new RuntimeException("Must implement clone() for
"+getClass());
- return (T) new Item();
+ return new Item<T>();
}
- public final T getNext() {
+ public final DoublyLinkedList.Item getNext() {
return next;
}
- public final T setNext(T i) {
- T old = next;
+ public final DoublyLinkedList.Item setNext(DoublyLinkedList.Item<T> i)
{
+ DoublyLinkedList.Item<T> old = next;
next = i;
return old;
}
- public final T getPrev() {
+ public final DoublyLinkedList.Item getPrev() {
return prev;
}
- public final T setPrev(T i) {
- T old = prev;
+ public final DoublyLinkedList.Item setPrev(DoublyLinkedList.Item<T> i)
{
+ DoublyLinkedList.Item<T> old = prev;
prev = i;
return old;
}
- public DoublyLinkedList<T> getParent() {
+ public DoublyLinkedList getParent() {
return list;
}
- public DoublyLinkedList<T> setParent(DoublyLinkedList<T> l) {
+ public DoublyLinkedList setParent(DoublyLinkedList<T> l) {
DoublyLinkedList old = list;
list = l;
return old;
Modified: trunk/freenet/src/freenet/support/LRUHashtable.java
===================================================================
--- trunk/freenet/src/freenet/support/LRUHashtable.java 2008-08-18 13:45:25 UTC
(rev 22006)
+++ trunk/freenet/src/freenet/support/LRUHashtable.java 2008-08-18 13:50:32 UTC
(rev 22007)
@@ -12,7 +12,7 @@
* push is by far the most done operation, this should be an
* overall improvement.
*/
- private final DoublyLinkedListImpl<QItem<K, V>> list = new
DoublyLinkedListImpl<QItem<K, V>>();
+ private final DoublyLinkedListImpl<V> list = new DoublyLinkedListImpl<V>();
private final Hashtable<K, QItem<K, V>> hash = new Hashtable<K, QItem<K,
V>>();
/**
@@ -34,12 +34,12 @@
Logger.minor(this, "Pushed "+insert+" ( "+key+ ' ' +value+" )");
list.unshift(insert);
- }
+ }
/**
* @return Least recently pushed key.
*/
- public final synchronized K popKey() {
+ public final synchronized Object popKey() {
if ( list.size() > 0 ) {
return ( hash.remove(((QItem) list.pop()).obj)).obj;
} else {
@@ -50,7 +50,7 @@
/**
* @return Least recently pushed value.
*/
- public final synchronized V popValue() {
+ public final synchronized Object popValue() {
if ( list.size() > 0 ) {
return ( hash.remove(((QItem) list.pop()).obj)).value;
} else {
@@ -58,7 +58,7 @@
}
}
- public final synchronized V peekValue() {
+ public final synchronized Object peekValue() {
if ( list.size() > 0 ) {
return ( hash.get(((QItem) list.tail()).obj)).value;
} else {
@@ -99,39 +99,39 @@
return q.value;
}
- public Enumeration<K> keys() {
+ public Enumeration keys() {
return new ItemEnumeration();
}
- public Enumeration<V> values() {
+ public Enumeration values() {
return new ValuesEnumeration();
}
- private class ItemEnumeration implements Enumeration<K> {
- private Enumeration<QItem<K, V>> source =
list.reverseElements();
+ private class ItemEnumeration implements Enumeration {
+ private Enumeration source = list.reverseElements();
public boolean hasMoreElements() {
return source.hasMoreElements();
}
- public K nextElement() {
- return source.nextElement().obj;
+ public Object nextElement() {
+ return ((QItem) source.nextElement()).obj;
}
}
- private class ValuesEnumeration implements Enumeration<V> {
- private Enumeration<QItem<K, V>> source =
list.reverseElements();
+ private class ValuesEnumeration implements Enumeration {
+ private Enumeration source = list.reverseElements();
public boolean hasMoreElements() {
return source.hasMoreElements();
}
- public V nextElement() {
- return (source.nextElement()).value;
+ public Object nextElement() {
+ return ((QItem) source.nextElement()).value;
}
}
- protected static class QItem<K, V> extends
DoublyLinkedListImpl.Item<QItem<K, V>> {
+ public static class QItem<K, V> extends DoublyLinkedListImpl.Item<V> {
public K obj;
public V value;
@@ -151,7 +151,7 @@
}
/**
- * Note that unlike the java.util versions, this will not reallocate
(hence it doesn't return),
+ * Note that unlike the java.util versions, this will not reallocate
(hence it doesn't return),
* so pass in an appropriately big array, and make sure you hold the
lock!
* @param entries
* @return