git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@946 379699f6-c40d-0410-875b-85095c16579estable
parent
1b3a2fb9cc
commit
edca6f13fa
@ -0,0 +1,134 @@ |
|||||||
|
// This class is taken from the Classpath project.
|
||||||
|
// Please note the different copyright holder!
|
||||||
|
// The changes I did is this comment, the package line, some
|
||||||
|
// imports from java.util and some minor jdk12 -> jdk11 fixes.
|
||||||
|
// -- Jochen Hoenicke <jochen@gnu.org>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// BasicMapEntry.java -- a class providing a plain-vanilla implementation of
|
||||||
|
// the Map.Entry interface; could be used anywhere in
|
||||||
|
// java.util
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998 by Jon A. Zeppieri (jon@eease.com)
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Library General Public License as published
|
||||||
|
// by the Free Software Foundation, version 2. (see COPYING.LIB)
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public License
|
||||||
|
// along with this program; if not, write to the Free Software Foundation
|
||||||
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
package jode.util; |
||||||
|
|
||||||
|
/** |
||||||
|
* a class which implements Map.Entry |
||||||
|
* |
||||||
|
* @author Jon Zeppieri |
||||||
|
* @version $Revision$ |
||||||
|
* @modified $Id$ |
||||||
|
*/ |
||||||
|
class BasicMapEntry implements Map.Entry |
||||||
|
{ |
||||||
|
/** the key */ |
||||||
|
Object key; |
||||||
|
/** the value */ |
||||||
|
Object value; |
||||||
|
|
||||||
|
/** |
||||||
|
* construct a new BasicMapEntry with the given key and value |
||||||
|
* |
||||||
|
* @param newKey the key of this Entry |
||||||
|
* @param newValue the value of this Entry |
||||||
|
*/ |
||||||
|
BasicMapEntry(Object newKey, Object newValue) |
||||||
|
{ |
||||||
|
key = newKey; |
||||||
|
value = newValue; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* returns true if <pre>o</pre> is a Map.Entry and |
||||||
|
* <pre> |
||||||
|
* (((o.getKey == null) ? (key == null) : |
||||||
|
* o.getKey().equals(key)) && |
||||||
|
* ((o.getValue() == null) ? (value == null) : |
||||||
|
* o.getValue().equals(value))) |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* NOTE: the calls to getKey() and getValue() in this implementation |
||||||
|
* are <i>NOT</i> superfluous and should not be removed. They insure |
||||||
|
* that subclasses such as HashMapEntry work correctly |
||||||
|
* |
||||||
|
* @param o the Object being tested for equality |
||||||
|
*/ |
||||||
|
public boolean equals(Object o) |
||||||
|
{ |
||||||
|
Map.Entry tester; |
||||||
|
Object oTestingKey, oTestingValue; |
||||||
|
Object oKey, oValue; |
||||||
|
if (o instanceof Map.Entry) |
||||||
|
{ |
||||||
|
tester = (Map.Entry) o; |
||||||
|
oKey = getKey(); |
||||||
|
oValue = getValue(); |
||||||
|
oTestingKey = tester.getKey(); |
||||||
|
oTestingValue = tester.getValue(); |
||||||
|
return (((oTestingKey == null) ? (oKey == null) : |
||||||
|
oTestingKey.equals(oKey)) && |
||||||
|
((oTestingValue == null) ? (oValue == null) : |
||||||
|
oTestingValue.equals(oValue))); |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** returns the key */ |
||||||
|
public Object getKey() |
||||||
|
{ |
||||||
|
return key; |
||||||
|
} |
||||||
|
|
||||||
|
/** returns the value */ |
||||||
|
public Object getValue() |
||||||
|
{ |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
/** the hashCode() for a Map.Entry is |
||||||
|
* <pre> |
||||||
|
* ((getKey() == null) ? 0 : getKey().hashCode()) ^ |
||||||
|
* ((getValue() == null) ? 0 : getValue().hashCode()); |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* NOTE: the calls to getKey() and getValue() in this implementation |
||||||
|
* are <i>NOT</i> superfluous and should not be removed. They insure |
||||||
|
* that subclasses such as HashMapEntry work correctly |
||||||
|
*/ |
||||||
|
public int hashCode() |
||||||
|
{ |
||||||
|
Object oKey = getKey(); |
||||||
|
Object oValue = getValue(); |
||||||
|
return ((oKey == null) ? 0 : oKey.hashCode()) ^ |
||||||
|
((oValue == null) ? 0 : oValue.hashCode()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* sets the value of this Map.Entry |
||||||
|
* |
||||||
|
* @param newValue the new value of this Map.Entry |
||||||
|
*/ |
||||||
|
public Object setValue(Object newValue) |
||||||
|
throws UnsupportedOperationException, ClassCastException, |
||||||
|
IllegalArgumentException, NullPointerException |
||||||
|
{ |
||||||
|
Object oVal = value; |
||||||
|
value = newValue; |
||||||
|
return oVal; |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,331 @@ |
|||||||
|
// This class is taken from the Classpath project.
|
||||||
|
// Please note the different copyright holder!
|
||||||
|
// The changes I did is this comment, the package line, some
|
||||||
|
// imports from java.util and some minor jdk12 -> jdk11 fixes.
|
||||||
|
// -- Jochen Hoenicke <jochen@gnu.org>
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TreeSet.java -- a class providing a TreeMap-backet SortedSet
|
||||||
|
//
|
||||||
|
// Copyright (c) 1999 by Jon A. Zeppieri (jon@eease.com)
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Library General Public License as published
|
||||||
|
// by the Free Software Foundation, version 2. (see COPYING.LIB)
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public License
|
||||||
|
// along with this program; if not, write to the Free Software Foundation
|
||||||
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
package jode.util; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.io.ObjectInputStream; |
||||||
|
import java.io.ObjectOutputStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class provides a TreeMap-backed implementation of the |
||||||
|
* SortedSet interface. |
||||||
|
* |
||||||
|
* Each element in the Set is a key in the backing TreeMap; each key |
||||||
|
* maps to a static token, denoting that the key does, in fact, exist. |
||||||
|
* |
||||||
|
* Most operations are O(log n). |
||||||
|
* |
||||||
|
* TreeSet is a part of the JDK1.2 Collections API. |
||||||
|
* |
||||||
|
* @author Jon Zeppieri |
||||||
|
* @version $Revision$ |
||||||
|
* @modified $Id$ |
||||||
|
*/ |
||||||
|
|
||||||
|
public class TreeSet extends AbstractSet |
||||||
|
implements SortedSet, Cloneable, Serializable |
||||||
|
{ |
||||||
|
// INSTANCE VARIABLES -------------------------------------------------
|
||||||
|
|
||||||
|
/** The TreeMap which backs this Set */ |
||||||
|
transient SortedMap _oMap; |
||||||
|
static final long serialVersionUID = -2479143000061671589L; |
||||||
|
|
||||||
|
|
||||||
|
// CONSTRUCTORS -------------------------------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new TreeSet whose backing TreeMap using the "natural" ordering |
||||||
|
* of keys. |
||||||
|
*/ |
||||||
|
public TreeSet() |
||||||
|
{ |
||||||
|
this((Comparator) null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new TreeSet whose backing TreeMap uses the supplied |
||||||
|
* Comparator. |
||||||
|
* |
||||||
|
* @param oComparator the Comparator this Set will use |
||||||
|
*/ |
||||||
|
public TreeSet(Comparator oComparator) |
||||||
|
{ |
||||||
|
_oMap = new TreeMap(oComparator); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new TreeSet whose backing TreeMap uses the "natural" |
||||||
|
* orering of the keys and which contains all of the elements in the |
||||||
|
* supplied Collection. |
||||||
|
* |
||||||
|
* @param oCollection the new Set will be initialized with all |
||||||
|
* of the elements in this Collection |
||||||
|
*/ |
||||||
|
public TreeSet(Collection oCollection) |
||||||
|
{ |
||||||
|
this((Comparator) null); |
||||||
|
addAll(oCollection); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct a new TreeSet, using the same key ordering as the supplied |
||||||
|
* SortedSet and containing all of the elements in the supplied SortedSet. |
||||||
|
* This constructor runs in linear time. |
||||||
|
* |
||||||
|
* @param oSortedSet the new TreeSet will use this SortedSet's |
||||||
|
* comparator and will initialize itself |
||||||
|
* with all of the elements in this SortedSet |
||||||
|
*/ |
||||||
|
public TreeSet(SortedSet oSortedSet) |
||||||
|
{ |
||||||
|
this(oSortedSet.comparator()); |
||||||
|
|
||||||
|
TreeMap oMap = (TreeMap) _oMap; |
||||||
|
int i = 0; |
||||||
|
Map.Entry[] arEntries = new Map.Entry[oSortedSet.size()]; |
||||||
|
Iterator itEntries = oSortedSet.iterator(); |
||||||
|
|
||||||
|
while (itEntries.hasNext()) |
||||||
|
arEntries[i++] = new BasicMapEntry(itEntries.next(), Boolean.TRUE); |
||||||
|
|
||||||
|
oMap._iSize = i; |
||||||
|
oMap.putAllLinear(arEntries); |
||||||
|
} |
||||||
|
|
||||||
|
TreeSet(SortedMap oMap) |
||||||
|
{ |
||||||
|
_oMap = oMap; |
||||||
|
} |
||||||
|
|
||||||
|
// METHODS -----------------------------------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
* Adds the spplied Object to the Set if it is not already in the Set; |
||||||
|
* returns true if the element is added, false otherwise |
||||||
|
* |
||||||
|
* @param oObject the Object to be added to this Set |
||||||
|
*/ |
||||||
|
public boolean add(Object oObject) |
||||||
|
{ |
||||||
|
if (_oMap.containsKey(oObject)) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
internalAdd(_oMap, oObject); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Adds all of the elements in the supplied Collection to this TreeSet. |
||||||
|
* |
||||||
|
* @param oCollection All of the elements in this Collection |
||||||
|
* will be added to the Set. |
||||||
|
* |
||||||
|
* @return true if the Set is altered, false otherwise |
||||||
|
*/ |
||||||
|
public boolean addAll(Collection oCollection) |
||||||
|
{ |
||||||
|
boolean boResult = false; |
||||||
|
Iterator itElements = oCollection.iterator(); |
||||||
|
|
||||||
|
while (itElements.hasNext()) |
||||||
|
boResult = (boResult || add(itElements.next())); |
||||||
|
|
||||||
|
return boResult; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Removes all elements in this Set. |
||||||
|
*/ |
||||||
|
public void clear() |
||||||
|
{ |
||||||
|
_oMap.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns a shallow copy of this Set. */ |
||||||
|
public Object clone() |
||||||
|
{ |
||||||
|
TreeSet oClone; |
||||||
|
|
||||||
|
try |
||||||
|
{ |
||||||
|
oClone = (TreeSet) super.clone(); |
||||||
|
oClone._oMap = _oMap; |
||||||
|
} |
||||||
|
catch(CloneNotSupportedException e) |
||||||
|
{ |
||||||
|
oClone = null; |
||||||
|
} |
||||||
|
return oClone; |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns this Set's comparator */ |
||||||
|
public Comparator comparator() |
||||||
|
{ |
||||||
|
return _oMap.comparator(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns true if this Set contains the supplied Object, |
||||||
|
* false otherwise |
||||||
|
* |
||||||
|
* @param oObject the Object whose existence in the Set is |
||||||
|
* being tested |
||||||
|
*/ |
||||||
|
public boolean contains(Object oObject) |
||||||
|
{ |
||||||
|
return _oMap.containsKey(oObject); |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns true if this Set has size 0, false otherwise */ |
||||||
|
public boolean isEmpty() |
||||||
|
{ |
||||||
|
return _oMap.isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns the number of elements in this Set */ |
||||||
|
public int size() |
||||||
|
{ |
||||||
|
return _oMap.size(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* If the supplied Object is in this Set, it is removed, and true is |
||||||
|
* returned; otherwise, false is returned. |
||||||
|
* |
||||||
|
* @param oObject the Object we are attempting to remove |
||||||
|
* from this Set |
||||||
|
*/ |
||||||
|
public boolean remove(Object oObject) |
||||||
|
{ |
||||||
|
return (_oMap.remove(oObject) != null); |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns the first (by order) element in this Set */ |
||||||
|
public Object first() |
||||||
|
{ |
||||||
|
return _oMap.firstKey(); |
||||||
|
} |
||||||
|
|
||||||
|
/** Returns the last (by order) element in this Set */ |
||||||
|
public Object last() |
||||||
|
{ |
||||||
|
return _oMap.lastKey(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a view of this Set including all elements in the interval |
||||||
|
* [oFromElement, oToElement). |
||||||
|
* |
||||||
|
* @param oFromElement the resultant view will contain all |
||||||
|
* elements greater than or equal to this |
||||||
|
* element |
||||||
|
* @param oToElement the resultant view will contain all |
||||||
|
* elements less than this element |
||||||
|
*/ |
||||||
|
public SortedSet subSet(Object oFromElement, Object oToElement) |
||||||
|
{ |
||||||
|
return new TreeSet(_oMap.subMap(oFromElement, oToElement)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a view of this Set including all elements less than oToElement |
||||||
|
* |
||||||
|
* @param oToElement the resultant view will contain all |
||||||
|
* elements less than this element |
||||||
|
*/ |
||||||
|
public SortedSet headSet(Object oToElement) |
||||||
|
{ |
||||||
|
return new TreeSet(_oMap.headMap(oToElement)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a view of this Set including all elements greater than or |
||||||
|
* equal to oFromElement. |
||||||
|
* |
||||||
|
* @param oFromElement the resultant view will contain all |
||||||
|
* elements greater than or equal to this |
||||||
|
* element |
||||||
|
*/ |
||||||
|
public SortedSet tailSet(Object oFromElement) |
||||||
|
{ |
||||||
|
return new TreeSet(_oMap.tailMap(oFromElement)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** Returns in Iterator over the elements in this TreeSet */ |
||||||
|
public Iterator iterator() |
||||||
|
{ |
||||||
|
return _oMap.keySet().iterator(); |
||||||
|
} |
||||||
|
|
||||||
|
private void writeObject(ObjectOutputStream oOut) throws IOException |
||||||
|
{ |
||||||
|
Iterator itElements = iterator(); |
||||||
|
|
||||||
|
oOut.writeObject(comparator()); |
||||||
|
oOut.writeInt(size()); |
||||||
|
|
||||||
|
while (itElements.hasNext()) |
||||||
|
oOut.writeObject(itElements.next()); |
||||||
|
} |
||||||
|
|
||||||
|
private void readObject(ObjectInputStream oIn) |
||||||
|
throws IOException, ClassNotFoundException |
||||||
|
{ |
||||||
|
int i; |
||||||
|
Map.Entry[] arEntries; |
||||||
|
TreeMap oMap; |
||||||
|
Comparator oComparator = (Comparator) oIn.readObject(); |
||||||
|
int iSize = oIn.readInt(); |
||||||
|
|
||||||
|
arEntries = new Map.Entry[iSize]; |
||||||
|
|
||||||
|
for (i = 0; i < iSize; i++) |
||||||
|
arEntries[iSize] = new BasicMapEntry(oIn.readObject(), Boolean.TRUE); |
||||||
|
|
||||||
|
oMap = new TreeMap(oComparator); |
||||||
|
oMap._iSize = iSize; |
||||||
|
oMap.putAllLinear(arEntries); |
||||||
|
_oMap = oMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* adds the supplied element to this Set; this private method is used |
||||||
|
* internally instead of add(), because add() can be overridden |
||||||
|
* to do unexpected things |
||||||
|
* |
||||||
|
* @param o the Object to add to this Set |
||||||
|
*/ |
||||||
|
private static final void internalAdd(Map oMap, Object oObject) |
||||||
|
{ |
||||||
|
oMap.put(oObject, Boolean.TRUE); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue