Factored some bits into AbstractIntSet, added keySet() to IntIntMap.

git-svn-id: https://samskivert.googlecode.com/svn/trunk@2583 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
samskivert
2009-07-10 22:45:48 +00:00
parent 18acdb2401
commit 297466ec29
4 changed files with 141 additions and 64 deletions
@@ -0,0 +1,61 @@
//
// $Id$
//
// samskivert library - useful routines for java programs
// Copyright (C) 2001-2008 Michael Bayne
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.samskivert.util;
import java.util.AbstractSet;
import java.util.Iterator;
/**
* A base class for {@link IntSet} implementations.
*/
public abstract class AbstractIntSet extends AbstractSet<Integer>
implements IntSet
{
@Override // from AbstractSet
public Iterator<Integer> iterator ()
{
return interator();
}
@Override // from AbstractSet
public boolean add (int t)
{
throw new UnsupportedOperationException();
}
/**
* Creates an iterator that provides access to our int values without unboxing.
*/
public abstract Interator interator ();
/**
* Converts the contents of this set to an int array.
*/
public int[] toIntArray ()
{
int[] vals = new int[size()];
int ii=0;
for (Interator intr = interator(); intr.hasNext(); ) {
vals[ii++] = intr.nextInt();
}
return vals;
}
}
+40 -62
View File
@@ -391,72 +391,50 @@ public class HashIntMap<V> extends AbstractMap<Integer,V>
}
}
protected class IntKeySet extends AbstractSet<Integer>
implements IntSet
{
@Override public Iterator<Integer> iterator () {
return interator();
}
public Interator interator () {
return new Interator () {
public boolean hasNext () {
return i.hasNext();
}
public Integer next () {
return i.next().getKey();
}
public int nextInt () {
return i.next().getIntKey();
}
public void remove () {
i.remove();
}
private Iterator<IntEntry<V>> i = intEntrySet().iterator();
};
}
@Override public int size () {
return HashIntMap.this.size();
}
@Override public boolean contains (Object t) {
return HashIntMap.this.containsKey(t);
}
public boolean contains (int t) {
return HashIntMap.this.containsKey(t);
}
public boolean add (int t) {
throw new UnsupportedOperationException();
}
@Override public boolean remove (Object o) {
return (null != HashIntMap.this.remove(o));
}
public boolean remove (int value) {
return (null != HashIntMap.this.remove(value));
}
public int[] toIntArray () {
int[] vals = new int[size()];
int ii=0;
for (Interator intr = interator(); intr.hasNext(); ) {
vals[ii++] = intr.nextInt();
}
return vals;
}
}
// documentation inherited from interface IntMap
public IntSet intKeySet ()
{
// damn Sun bastards made the 'keySet' variable with default access,
// so we can't share it
// damn Sun bastards made the 'keySet' variable with default access, so we can't share it
if (_keySet == null) {
_keySet = new IntKeySet();
_keySet = new AbstractIntSet() {
public Interator interator () {
return new Interator () {
public boolean hasNext () {
return i.hasNext();
}
public Integer next () {
return i.next().getKey();
}
public int nextInt () {
return i.next().getIntKey();
}
public void remove () {
i.remove();
}
private Iterator<IntEntry<V>> i = intEntrySet().iterator();
};
}
@Override public int size () {
return HashIntMap.this.size();
}
@Override public boolean contains (Object t) {
return HashIntMap.this.containsKey(t);
}
public boolean contains (int t) {
return HashIntMap.this.containsKey(t);
}
@Override public boolean remove (Object o) {
return (null != HashIntMap.this.remove(o));
}
public boolean remove (int value) {
return (null != HashIntMap.this.remove(value));
}
};
}
return _keySet;
}
@@ -309,6 +309,44 @@ public class IntIntMap
return new KeyValueInterator(true, new IntEntryIterator());
}
public IntSet keySet ()
{
return new AbstractIntSet() {
public Interator interator () {
return IntIntMap.this.keys();
}
@Override public int size () {
return IntIntMap.this.size();
}
@Override public boolean contains (Object t) {
return (t instanceof Integer) ? IntIntMap.this.containsKey((Integer)t) : false;
}
public boolean contains (int t) {
return IntIntMap.this.containsKey(t);
}
@Override public boolean remove (Object o) {
if (!(o instanceof Integer)) {
return false;
}
return remove((Integer)o);
}
public boolean remove (int value) {
// we have to check for presence in the map separately because we have no "not in
// the set" return value
if (!IntIntMap.this.containsKey(value)) {
return false;
}
IntIntMap.this.remove(value);
return true;
}
};
}
public Interator values ()
{
return new KeyValueInterator(false, new IntEntryIterator());
+2 -2
View File
@@ -23,8 +23,8 @@ package com.samskivert.util;
import java.util.Iterator;
/**
* Can be used as an Iterator, and all Objects returned should be Integer
* objects, but can also can avoid object creation by calling nextInt().
* Can be used as an Iterator, and all Objects returned should be Integer objects, but can also can
* avoid boxing by calling {@link #nextInt}.
*/
public interface Interator extends Iterator<Integer>
{