/*
* Copyright (c) 2004-2009, Jean-Marc François. All Rights Reserved.
* Licensed under the New BSD license. See the LICENSE file.
*/
package be.ac.ulg.montefiore.run.jahmm.io;
import java.io.IOException;
import java.io.StreamTokenizer;
import be.ac.ulg.montefiore.run.jahmm.ObservationInteger;
/**
* Reads an {@link be.ac.ulg.montefiore.run.jahmm.ObservationInteger
* ObservationInteger} up to (and including) a semi-colon.
* <p>
* The format of this observation is a simple integer ([+-]?[0123456789]+).
* <p>
* For example, reading
* <pre>76;</pre>
* creates an observation such as the one generated by
* <code>new ObservationInteger(76);</code>
*/
public class ObservationIntegerReader
extends ObservationReader<ObservationInteger>
{
// Maximum value of the obserations read + 1
private int nbElements;
/**
* Constructs a reader of {@link ObservationInteger ObservationInteger}.
*/
public ObservationIntegerReader()
{
nbElements = Integer.MAX_VALUE;
}
/**
* Constructs a reader of {@link ObservationInteger ObservationInteger}.
* Verifies the maximum value of the observations read.
*
* @param nbElements The permitted number of different elements. Each
* value read must be <tt>0 ≤ value < nbElements</tt>.
*/
public ObservationIntegerReader(int nbElements)
{
if (nbElements <= 0)
throw new IllegalArgumentException("Nb of elements must be " +
"positive");
this.nbElements = nbElements;
}
/**
* Reads an {@link be.ac.ulg.montefiore.run.jahmm.ObservationInteger
* ObservationInteger} reader, as explained in
* {@link ObservationReader ObservationReader}.
*
* @param st A stream tokenizer.
* @return The {@link be.ac.ulg.montefiore.run.jahmm.ObservationInteger
* ObservationInteger} read.
*/
public ObservationInteger read(StreamTokenizer st)
throws IOException, FileFormatException
{
ObservationInteger oi;
st.ordinaryChar((int)'.');
if (st.nextToken() == StreamTokenizer.TT_NUMBER) {
if (st.nval > nbElements)
throw new FileFormatException(st.lineno(),
"Integer higher than maximum value " + (nbElements-1));
oi = new ObservationInteger((int) st.nval);
} else
throw new FileFormatException(st.lineno(), "Integer expected");
if (st.nextToken() != (int) ';')
throw new FileFormatException(st.lineno(), "';' expected");
ObservationSequencesReader.initSyntaxTable(st);
return oi;
}
}