Add Apache licence
git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@130921 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b5f981ff98
commit
a11c82f3bc
|
@ -1,3 +1,56 @@
|
||||||
|
/* ====================================================================
|
||||||
|
* The Apache Software License, Version 1.1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003 The Apache Software Foundation. All rights
|
||||||
|
* reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* 3. The end-user documentation included with the redistribution, if
|
||||||
|
* any, must include the following acknowlegement:
|
||||||
|
* "This product includes software developed by the
|
||||||
|
* Apache Software Foundation (http://www.apache.org/)."
|
||||||
|
* Alternately, this acknowlegement may appear in the software itself,
|
||||||
|
* if and wherever such third-party acknowlegements normally appear.
|
||||||
|
*
|
||||||
|
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
|
||||||
|
* Foundation" must not be used to endorse or promote products derived
|
||||||
|
* from this software without prior written permission. For written
|
||||||
|
* permission, please contact apache@apache.org.
|
||||||
|
*
|
||||||
|
* 5. Products derived from this software may not be called "Apache"
|
||||||
|
* nor may "Apache" appear in their names without prior written
|
||||||
|
* permission of the Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||||
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||||
|
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
* ====================================================================
|
||||||
|
*
|
||||||
|
* This software consists of voluntary contributions made by many
|
||||||
|
* individuals on behalf of the Apache Software Foundation. For more
|
||||||
|
* information on the Apache Software Foundation, please see
|
||||||
|
* <http://www.apache.org/>.
|
||||||
|
*/
|
||||||
package org.apache.commons.collections;
|
package org.apache.commons.collections;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -19,10 +72,12 @@ import java.util.NoSuchElementException;
|
||||||
* of {@link java.util.LinkedList}, but which provides a more open interface for
|
* of {@link java.util.LinkedList}, but which provides a more open interface for
|
||||||
* subclasses to extend.
|
* subclasses to extend.
|
||||||
*
|
*
|
||||||
|
* @since 2.2
|
||||||
* @author <a href="mailto:rich@rd.gen.nz">Rich Dougherty</a>
|
* @author <a href="mailto:rich@rd.gen.nz">Rich Dougherty</a>
|
||||||
|
* @version $Revision: 1.2 $ $Date: 2003/01/07 23:40:55 $
|
||||||
*/
|
*/
|
||||||
class CommonsLinkedList extends LinkedList
|
class CommonsLinkedList extends LinkedList
|
||||||
implements List, Serializable {
|
implements List, Serializable {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Implementation notes:
|
* Implementation notes:
|
||||||
|
@ -232,7 +287,7 @@ class CommonsLinkedList extends LinkedList
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link Node} which ndicates the start and end of the list and does not
|
* A {@link Node} which indicates the start and end of the list and does not
|
||||||
* hold a value. The value of <code>next</code> is the first item in the
|
* hold a value. The value of <code>next</code> is the first item in the
|
||||||
* list. The value of of <code>previous</code> is the last item in the list.
|
* list. The value of of <code>previous</code> is the last item in the list.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,175 +1,243 @@
|
||||||
package org.apache.commons.collections;
|
/* ====================================================================
|
||||||
|
* The Apache Software License, Version 1.1
|
||||||
import java.util.Collection;
|
*
|
||||||
|
* Copyright (c) 2002-2003 The Apache Software Foundation. All rights
|
||||||
/**
|
* reserved.
|
||||||
* A linked list implementation that caches the nodes used internally to prevent
|
*
|
||||||
* unnecessary object creates and deletion. This should result in a performance
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* improvement.
|
* modification, are permitted provided that the following conditions
|
||||||
*
|
* are met:
|
||||||
* @author Jeff Varszegi
|
*
|
||||||
* @author <a href="mailto:rich@rd.gen.nz">Rich Dougherty</a>
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
*/
|
* notice, this list of conditions and the following disclaimer.
|
||||||
public class NodeCachingLinkedList extends CommonsLinkedList {
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
private static final long serialVersionUID = 1;
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
/**
|
* distribution.
|
||||||
* The default value for {@link #maximumCacheSize}.
|
*
|
||||||
*/
|
* 3. The end-user documentation included with the redistribution, if
|
||||||
private static final int DEFAULT_MAXIMUM_CACHE_SIZE = 20;
|
* any, must include the following acknowlegement:
|
||||||
|
* "This product includes software developed by the
|
||||||
/**
|
* Apache Software Foundation (http://www.apache.org/)."
|
||||||
* The first cached node, or <code>null</code> if no nodes are cached.
|
* Alternately, this acknowlegement may appear in the software itself,
|
||||||
* Cached nodes are stored in a singly-linked list with {@link Node#next}
|
* if and wherever such third-party acknowlegements normally appear.
|
||||||
* pointing to the next element.
|
*
|
||||||
*/
|
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
|
||||||
private transient Node firstCachedNode;
|
* Foundation" must not be used to endorse or promote products derived
|
||||||
|
* from this software without prior written permission. For written
|
||||||
/**
|
* permission, please contact apache@apache.org.
|
||||||
* The size of the cache.
|
*
|
||||||
*/
|
* 5. Products derived from this software may not be called "Apache"
|
||||||
private transient int cacheSize = 0;
|
* nor may "Apache" appear in their names without prior written
|
||||||
|
* permission of the Apache Software Foundation.
|
||||||
/**
|
*
|
||||||
* The maximum size of the cache.
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||||
*/
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
private int maximumCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE;
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||||
public NodeCachingLinkedList() {
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
super();
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
}
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||||
|
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
public NodeCachingLinkedList(Collection c) {
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
super(c);
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
}
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
public NodeCachingLinkedList(int maximumCacheSize) {
|
* ====================================================================
|
||||||
super();
|
*
|
||||||
this.maximumCacheSize = maximumCacheSize;
|
* This software consists of voluntary contributions made by many
|
||||||
}
|
* individuals on behalf of the Apache Software Foundation. For more
|
||||||
|
* information on the Apache Software Foundation, please see
|
||||||
// Cache operations
|
* <http://www.apache.org/>.
|
||||||
|
*/
|
||||||
/**
|
package org.apache.commons.collections;
|
||||||
* Gets the maximum size of the cache.
|
|
||||||
*/
|
import java.util.Collection;
|
||||||
public int getMaximumCacheSize() {
|
|
||||||
return maximumCacheSize;
|
/**
|
||||||
}
|
* A linked list implementation that caches the nodes used internally to prevent
|
||||||
|
* unnecessary object creates and deletion. This should result in a performance
|
||||||
/**
|
* improvement.
|
||||||
* Sets the maximum size of the cache.
|
*
|
||||||
*/
|
* @since 2.2
|
||||||
public void setMaximumCacheSize(int maximumCacheSize) {
|
* @author Jeff Varszegi
|
||||||
this.maximumCacheSize = maximumCacheSize;
|
* @author <a href="mailto:rich@rd.gen.nz">Rich Dougherty</a>
|
||||||
shrinkCacheToMaximumSize();
|
* @version $Revision: 1.3 $ $Date: 2003/01/07 23:40:57 $
|
||||||
}
|
*/
|
||||||
|
public class NodeCachingLinkedList extends CommonsLinkedList {
|
||||||
/**
|
|
||||||
* Reduce the size of the cache to the maximum, if necessary.
|
private static final long serialVersionUID = 1;
|
||||||
*/
|
|
||||||
private void shrinkCacheToMaximumSize() {
|
/**
|
||||||
// Rich Dougherty: This could be more efficient.
|
* The default value for {@link #maximumCacheSize}.
|
||||||
while (cacheSize > maximumCacheSize) {
|
*/
|
||||||
getNodeFromCache();
|
private static final int DEFAULT_MAXIMUM_CACHE_SIZE = 20;
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* The first cached node, or <code>null</code> if no nodes are cached.
|
||||||
/**
|
* Cached nodes are stored in a singly-linked list with {@link Node#next}
|
||||||
* Gets a node from the cache. If a node is returned, then the value of
|
* pointing to the next element.
|
||||||
* {@link #cacheSize} is decreased accordingly. The node that is returned
|
*/
|
||||||
* will have <code>null</code> values for next, previous and element.
|
private transient Node firstCachedNode;
|
||||||
*
|
|
||||||
* @return A node, or <code>null</code> if there are no nodes in the cache.
|
/**
|
||||||
*/
|
* The size of the cache.
|
||||||
private Node getNodeFromCache() {
|
*/
|
||||||
if (cacheSize == 0) {
|
private transient int cacheSize = 0;
|
||||||
return null;
|
|
||||||
}
|
/**
|
||||||
Node cachedNode = firstCachedNode;
|
* The maximum size of the cache.
|
||||||
firstCachedNode = cachedNode.next;
|
*/
|
||||||
cachedNode.next = null; // This should be changed anyway, but defensively
|
private int maximumCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE;
|
||||||
// set it to null.
|
|
||||||
cacheSize--;
|
/**
|
||||||
return cachedNode;
|
* Constructor.
|
||||||
}
|
*/
|
||||||
|
public NodeCachingLinkedList() {
|
||||||
private boolean cacheFull() {
|
super();
|
||||||
return cacheSize >= maximumCacheSize;
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
/**
|
* Constructor that copies the specified collection
|
||||||
* Adds a node to the cache, if the cache isn't full. The node's contents
|
*
|
||||||
* are cleared to so they can be garbage collected.
|
* @param coll the collection to copy
|
||||||
*/
|
*/
|
||||||
private void addNodeToCache(Node node) {
|
public NodeCachingLinkedList(Collection coll) {
|
||||||
if (cacheFull()) {
|
super(coll);
|
||||||
// Don't cache the node.
|
}
|
||||||
return;
|
|
||||||
}
|
/**
|
||||||
// Clear the node's contents and add it to the cache.
|
* Constructor that species the maximum cache size.
|
||||||
Node nextCachedNode = firstCachedNode;
|
*
|
||||||
node.previous = null;
|
* @param maximumCacheSize the maximum cache size
|
||||||
node.next = nextCachedNode;
|
*/
|
||||||
node.element = null;
|
public NodeCachingLinkedList(int maximumCacheSize) {
|
||||||
firstCachedNode = node;
|
super();
|
||||||
cacheSize++;
|
this.maximumCacheSize = maximumCacheSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Node operations
|
// Cache operations
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a node, getting it from the cache if possible.
|
* Gets the maximum size of the cache.
|
||||||
*/
|
*/
|
||||||
protected Node createNode() {
|
public int getMaximumCacheSize() {
|
||||||
Node cachedNode = getNodeFromCache();
|
return maximumCacheSize;
|
||||||
if (cachedNode == null) {
|
}
|
||||||
return super.createNode();
|
|
||||||
} else {
|
/**
|
||||||
return cachedNode;
|
* Sets the maximum size of the cache.
|
||||||
}
|
*/
|
||||||
}
|
public void setMaximumCacheSize(int maximumCacheSize) {
|
||||||
|
this.maximumCacheSize = maximumCacheSize;
|
||||||
/**
|
shrinkCacheToMaximumSize();
|
||||||
* Create a node, getting it from the cache if possible.
|
}
|
||||||
*/
|
|
||||||
protected Node createNode(Node next, Node previous, Object element) {
|
/**
|
||||||
Node cachedNode = getNodeFromCache();
|
* Reduce the size of the cache to the maximum, if necessary.
|
||||||
if (cachedNode == null) {
|
*/
|
||||||
return super.createNode(next, previous, element);
|
private void shrinkCacheToMaximumSize() {
|
||||||
} else {
|
// Rich Dougherty: This could be more efficient.
|
||||||
cachedNode.next = next;
|
while (cacheSize > maximumCacheSize) {
|
||||||
cachedNode.previous = previous;
|
getNodeFromCache();
|
||||||
cachedNode.element = element;
|
}
|
||||||
return cachedNode;
|
}
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* Gets a node from the cache. If a node is returned, then the value of
|
||||||
/**
|
* {@link #cacheSize} is decreased accordingly. The node that is returned
|
||||||
* Calls the superclass' implementation then calls
|
* will have <code>null</code> values for next, previous and element.
|
||||||
* {@link #addNodeToCache(Node)} on the node which has been removed.
|
*
|
||||||
*
|
* @return A node, or <code>null</code> if there are no nodes in the cache.
|
||||||
* @see org.apache.commons.collections.CommonsLinkedList#removeNode(Node)
|
*/
|
||||||
*/
|
private Node getNodeFromCache() {
|
||||||
protected void removeNode(Node node) {
|
if (cacheSize == 0) {
|
||||||
super.removeNode(node);
|
return null;
|
||||||
addNodeToCache(node);
|
}
|
||||||
}
|
Node cachedNode = firstCachedNode;
|
||||||
|
firstCachedNode = cachedNode.next;
|
||||||
protected void removeAllNodes() {
|
cachedNode.next = null; // This should be changed anyway, but defensively
|
||||||
// Add the removed nodes to the cache, then remove the rest.
|
// set it to null.
|
||||||
// We can add them to the cache before removing them, since
|
cacheSize--;
|
||||||
// {@link CommonsLinkedList.removeAllNodes()} removes the
|
return cachedNode;
|
||||||
// nodes by removing references directly from {@link #marker}.
|
}
|
||||||
int numberOfNodesToCache = Math.min(size, maximumCacheSize - cacheSize);
|
|
||||||
Node node = marker.next;
|
private boolean cacheFull() {
|
||||||
for (int currentIndex = 0; currentIndex < numberOfNodesToCache; currentIndex++) {
|
return cacheSize >= maximumCacheSize;
|
||||||
Node oldNode = node;
|
}
|
||||||
node = node.next;
|
|
||||||
addNodeToCache(oldNode);
|
/**
|
||||||
}
|
* Adds a node to the cache, if the cache isn't full. The node's contents
|
||||||
super.removeAllNodes();
|
* are cleared to so they can be garbage collected.
|
||||||
}
|
*/
|
||||||
|
private void addNodeToCache(Node node) {
|
||||||
}
|
if (cacheFull()) {
|
||||||
|
// Don't cache the node.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Clear the node's contents and add it to the cache.
|
||||||
|
Node nextCachedNode = firstCachedNode;
|
||||||
|
node.previous = null;
|
||||||
|
node.next = nextCachedNode;
|
||||||
|
node.element = null;
|
||||||
|
firstCachedNode = node;
|
||||||
|
cacheSize++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Node operations
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a node, getting it from the cache if possible.
|
||||||
|
*/
|
||||||
|
protected Node createNode() {
|
||||||
|
Node cachedNode = getNodeFromCache();
|
||||||
|
if (cachedNode == null) {
|
||||||
|
return super.createNode();
|
||||||
|
} else {
|
||||||
|
return cachedNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a node, getting it from the cache if possible.
|
||||||
|
*/
|
||||||
|
protected Node createNode(Node next, Node previous, Object element) {
|
||||||
|
Node cachedNode = getNodeFromCache();
|
||||||
|
if (cachedNode == null) {
|
||||||
|
return super.createNode(next, previous, element);
|
||||||
|
} else {
|
||||||
|
cachedNode.next = next;
|
||||||
|
cachedNode.previous = previous;
|
||||||
|
cachedNode.element = element;
|
||||||
|
return cachedNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the superclass' implementation then calls
|
||||||
|
* {@link #addNodeToCache(Node)} on the node which has been removed.
|
||||||
|
*
|
||||||
|
* @see org.apache.commons.collections.CommonsLinkedList#removeNode(Node)
|
||||||
|
*/
|
||||||
|
protected void removeNode(Node node) {
|
||||||
|
super.removeNode(node);
|
||||||
|
addNodeToCache(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeAllNodes() {
|
||||||
|
// Add the removed nodes to the cache, then remove the rest.
|
||||||
|
// We can add them to the cache before removing them, since
|
||||||
|
// {@link CommonsLinkedList.removeAllNodes()} removes the
|
||||||
|
// nodes by removing references directly from {@link #marker}.
|
||||||
|
int numberOfNodesToCache = Math.min(size, maximumCacheSize - cacheSize);
|
||||||
|
Node node = marker.next;
|
||||||
|
for (int currentIndex = 0; currentIndex < numberOfNodesToCache; currentIndex++) {
|
||||||
|
Node oldNode = node;
|
||||||
|
node = node.next;
|
||||||
|
addNodeToCache(oldNode);
|
||||||
|
}
|
||||||
|
super.removeAllNodes();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue