/* Copyright (C) 2002 Univ. of Massachusetts Amherst, Computer Science Dept. This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit). http://www.cs.umass.edu/~mccallum/mallet This software is provided under the terms of the Common Public License, version 1.0, as published by http://www.opensource.org. For further information, see the file `LICENSE' included with this distribution. */ /** @author Andrew McCallum <a href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a> */ package cc.mallet.extract; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.IOException; import cc.mallet.types.Token; /** A sub-section of a linear string. */ public class StringSpan extends Token implements Span { private CharSequence document; // The larger string of which this is a span. private int start, end; public StringSpan (CharSequence doc, int start, int end) { super (constructTokenText (doc, start, end)); this.document = doc; this.start = start; this.end = end; } public Span intersection (Span r) { StringSpan other = (StringSpan) r; int newStart = Math.max (start, other.start); int newEnd = Math.min (end, other.end); return new StringSpan (document, newStart, newEnd); } private static String constructTokenText (CharSequence doc, int start, int end) { CharSequence subseq = doc.subSequence(start,end); return subseq.toString(); } public Object getDocument () { return document; } public boolean intersects (Span r) { if (!(r instanceof StringSpan)) return false; StringSpan sr = (StringSpan)r; return (sr.document == this.document && !(sr.end < this.start || sr.start > this.end)); } public boolean isSubspan (Span r) { return (r.getDocument() == this.document && (this.start <= r.getStartIdx ()) && (r.getEndIdx () <= this.end)); } public int getStartIdx () { return start; } public int getEndIdx () { return end; } public String toString() { return super.toString() + " span["+start+".."+end+"]"; } // Serialization garbage private static final long serialVersionUID = 1; private static final int CURRENT_SERIAL_VERSION = 1; private void writeObject (ObjectOutputStream out) throws IOException { out.defaultWriteObject (); out.writeInt (CURRENT_SERIAL_VERSION); } private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject (); int version = in.readInt (); } }