package de.unisiegen.gtitool.core.entities.regex;
import java.util.ArrayList;
/**
* Node that has only one direct child
*/
public abstract class OneChildNode extends RegexNode
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = -3109784857649152942L;
/**
* Cached {@link ArrayList} for firstPos
*/
private transient ArrayList < LeafNode > firstPosCache = null;
/**
* Cached {@link ArrayList} for lastPos
*/
private transient ArrayList < LeafNode > lastPosCache = null;
/**
* Flag that indicates if Node is already used in NFA construction
*/
private boolean marked = false;
/**
* The Child of this {@link OneChildNode}
*/
protected RegexNode regex;
/**
* Constructor for a Node with one direct child
*
* @param regex Child of this {@link OneChildNode}
*/
public OneChildNode ( RegexNode regex )
{
this.regex = regex;
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.core.entities.regex.RegexNode#firstPos()
*/
@Override
public ArrayList < LeafNode > firstPos ()
{
if ( this.firstPosCache == null )
{
this.firstPosCache = this.regex.firstPos ();
}
return this.firstPosCache;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getHeight()
*/
@Override
public int getHeight ()
{
return 1 + this.regex.getHeight ();
}
/**
* {@inheritDoc}
*
* @see RegexNode#getNextNodeForNFA()
*/
@Override
public RegexNode getNextNodeForNFA ()
{
if ( !this.marked )
{
this.marked = true;
return this;
}
return this.regex.getNextNodeForNFA ();
}
/**
* {@inheritDoc}
*
* @see RegexNode#getNextUnfinishedNode()
*/
@Override
public UnfinishedNode getNextUnfinishedNode ()
{
return this.regex.getNextUnfinishedNode ();
}
/**
* {@inheritDoc}
*
* @see RegexNode#getParentNodeForNode(RegexNode)
*/
@Override
public RegexNode getParentNodeForNode ( RegexNode node )
{
if ( this.regex.equals ( node ) )
{
return this;
}
return this.regex.getParentNodeForNode ( node );
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.core.entities.regex.RegexNode#getPriority()
*/
@Override
public int getPriority ()
{
return 3;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getWidth()
*/
@Override
public int getWidth ()
{
return this.regex.getWidth ();
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode ()
{
return this.regex.hashCode () * 41;
}
/**
* {@inheritDoc}
*
* @see RegexNode#isMarked()
*/
@Override
public boolean isMarked ()
{
return this.marked;
}
/**
* {@inheritDoc}
*
* @see RegexNode#isMarkedAll()
*/
@Override
public boolean isMarkedAll ()
{
return this.marked && this.regex.isMarkedAll ();
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.core.entities.regex.RegexNode#lastPos()
*/
@Override
public ArrayList < LeafNode > lastPos ()
{
if ( this.lastPosCache == null )
{
this.lastPosCache = this.regex.lastPos ();
}
return this.lastPosCache;
}
/**
* Sets the regex.
*
* @param regex The regex to set.
* @see #regex
*/
public void setRegex ( RegexNode regex )
{
this.regex = regex;
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.core.entities.regex.RegexNode#unmark()
*/
@Override
public void unmark ()
{
this.marked = false;
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.core.entities.regex.RegexNode#unmarkAll()
*/
@Override
public void unmarkAll ()
{
unmark ();
this.regex.unmarkAll ();
}
}