edu.stanford.nlp.util.DeltaIndex Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of stanford-parser Show documentation
Show all versions of stanford-parser Show documentation
Stanford Parser processes raw text in English, Chinese, German, Arabic, and French, and extracts constituency parse trees.
The newest version!
package edu.stanford.nlp.util;
import java.io.Writer;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* A class that has a backing index, such as a hash index you don't
* want changed, and another index which will hold extra entries that
* get added during the life of the index.
*
* It is important that nothing else changes the backing index while
* a DeltaIndex is in use. The behavior of this index is
* undefined if the backing index changes, although in general the new
* entries in the backing index will be ignored.
*
* @author John Bauer
*/
public class DeltaIndex extends AbstractCollection implements Index {
private static final long serialVersionUID = -1459230891686013411L;
private final Index backingIndex;
private final Index spilloverIndex;
private final int backingIndexSize;
private boolean locked;
public DeltaIndex(Index backingIndex) {
this(backingIndex, new HashIndex<>());
}
public DeltaIndex(Index backingIndex, Index spilloverIndex) {
this.backingIndex = backingIndex;
this.spilloverIndex = spilloverIndex;
backingIndexSize = backingIndex.size();
}
@Override
public int size() {
return backingIndex.size() + spilloverIndex.size();
}
@Override
public E get(int i) {
if (i < backingIndexSize) {
return backingIndex.get(i);
} else {
return spilloverIndex.get(i - backingIndexSize);
}
}
@Override
public int indexOf(E o) {
int index = backingIndex.indexOf(o);
if (index >= 0) {
return index;
}
index = spilloverIndex.indexOf(o);
if (index >= 0) {
return index + backingIndexSize;
}
return index; // i.e., return -1
}
@Override
public int addToIndex(E o) {
int index = backingIndex.indexOf(o);
if (index >= 0) {
return index;
}
if (locked) {
index = spilloverIndex.indexOf(o);
} else {
index = spilloverIndex.addToIndex(o);
}
if (index >= 0) {
return index + backingIndexSize;
}
return index; // i.e., return -1
}
@Override
@Deprecated
public int indexOf(E o, boolean add) {
if (add) {
return addToIndex(o);
} else {
return indexOf(o);
}
}
@Override
public List objectsList() {
List result = new ArrayList<>();
if (result.size() > backingIndexSize) {
// we told you not to do this
result.addAll(backingIndex.objectsList().subList(0, backingIndexSize));
} else {
result.addAll(backingIndex.objectsList());
}
result.addAll(spilloverIndex.objectsList());
return Collections.unmodifiableList(result);
}
@Override
public Collection objects(int[] indices) {
List result = new ArrayList<>();
for (int index : indices) {
result.add(get(index));
}
return result;
}
@Override
public boolean isLocked() {
return locked;
}
@Override
public void lock() {
locked = true;
}
@Override
public void unlock() {
locked = false;
}
@Override
public void saveToWriter(Writer out) {
throw new UnsupportedOperationException();
}
@Override
public void saveToFilename(String s) {
throw new UnsupportedOperationException();
}
@Override
public boolean contains(Object o) {
return backingIndex.contains(o) || spilloverIndex.contains(o);
}
@Override
public boolean add(E e) {
if (backingIndex.contains(e))
return false;
return spilloverIndex.add(e);
}
@Override
public boolean addAll(Collection extends E> c) {
boolean changed = false;
for (E e : c) {
if (add(e)) {
changed = true;
}
}
return changed;
}
/**
* We don't want to change the backing index in any way, and "clear"
* would have to entail doing that, so we just throw an
* UnsupportedOperationException instead
*/
@Override
public void clear() {
throw new UnsupportedOperationException();
}
@Override
public boolean isEmpty() {
return backingIndexSize == 0 && spilloverIndex.size() == 0;
}
/**
* This is one instance where elements added to the backing index
* will show up in this index's operations
*/
@Override
public Iterator iterator() {
return new Iterator() {
Iterator backingIterator = backingIndex.iterator();
Iterator spilloverIterator = spilloverIndex.iterator();
@Override
public boolean hasNext() {
return backingIterator.hasNext() || spilloverIterator.hasNext();
}
@Override
public E next() {
if (backingIterator.hasNext()) {
return backingIterator.next();
} else {
return spilloverIterator.next();
}
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
/**
* super ghetto
*/
public String toString() {
return backingIndex.toString() + "," + spilloverIndex.toString();
}
}