package de.unisiegen.gtitool.core.entities.regex;
import java.util.ArrayList;
/**
* Representation of a RegexNode with two children
*/
public abstract class TwoChildNode extends RegexNode
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = 3752945655164551118L;
/**
* Cached {@link ArrayList} for the children
*/
private transient ArrayList < RegexNode > childrenCache = null;
/**
* Flag that indicates if Node is already used in NFA construction
*/
private boolean marked = false;
/**
* The first {@link RegexNode}
*/
protected RegexNode regex1;
/**
* The second {@link RegexNode}
*/
protected RegexNode regex2;
/**
* Constructor for a {@link RegexNode} with two direct children
*
* @param regex1 The first {@link RegexNode}
* @param regex2 The second {@link RegexNode}
*/
public TwoChildNode ( RegexNode regex1, RegexNode regex2 )
{
this.regex1 = regex1;
this.regex2 = regex2;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getChildren()
*/
@Override
public ArrayList < RegexNode > getChildren ()
{
if ( this.childrenCache == null )
{
this.childrenCache = new ArrayList < RegexNode > ();
this.childrenCache.add ( this.regex1 );
this.childrenCache.add ( this.regex2 );
}
return this.childrenCache;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getHeight()
*/
@Override
public int getHeight ()
{
if ( this.regex1.getHeight () > this.regex2.getHeight () )
{
return 1 + this.regex1.getHeight ();
}
return 1 + this.regex2.getHeight ();
}
/**
* {@inheritDoc}
*
* @see RegexNode#getNextNodeForNFA()
*/
@Override
public RegexNode getNextNodeForNFA ()
{
if ( !this.marked )
{
this.marked = true;
return this;
}
if ( !this.regex1.isMarkedAll () )
{
return this.regex1.getNextNodeForNFA ();
}
if ( !this.regex2.isMarkedAll () )
{
return this.regex2.getNextNodeForNFA ();
}
return null;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getNextUnfinishedNode()
*/
@Override
public UnfinishedNode getNextUnfinishedNode ()
{
UnfinishedNode node = this.regex1.getNextUnfinishedNode ();
if ( node == null )
{
node = this.regex2.getNextUnfinishedNode ();
}
return node;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getParentNodeForNode(RegexNode)
*/
@Override
public RegexNode getParentNodeForNode ( RegexNode node )
{
if ( this.regex1.equals ( node ) || this.regex2.equals ( node ) )
{
return this;
}
RegexNode newNode = this.regex1.getParentNodeForNode ( node );
if ( newNode == null )
{
newNode = this.regex2.getParentNodeForNode ( node );
}
return newNode;
}
/**
* Returns the regex1.
*
* @return The regex1.
* @see #regex1
*/
public RegexNode getRegex1 ()
{
return this.regex1;
}
/**
* Returns the regex2.
*
* @return The regex2.
* @see #regex2
*/
public RegexNode getRegex2 ()
{
return this.regex2;
}
/**
* {@inheritDoc}
*
* @see RegexNode#getWidth()
*/
@Override
public int getWidth ()
{
return 1 + this.regex1.getWidth () + this.regex2.getWidth ();
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode ()
{
return ( this.regex1.hashCode () * this.regex2.hashCode () * 23 );
}
/**
* {@inheritDoc}
*
* @see RegexNode#isInCoreSyntax()
*/
@Override
public boolean isInCoreSyntax ()
{
return this.regex1.isInCoreSyntax () && this.regex2.isInCoreSyntax ();
}
/**
* {@inheritDoc}
*
* @see RegexNode#isMarked()
*/
@Override
public boolean isMarked ()
{
return this.marked;
}
/**
* {@inheritDoc}
*
* @see RegexNode#isMarkedAll()
*/
@Override
public boolean isMarkedAll ()
{
return this.marked && this.regex1.isMarkedAll ()
&& this.regex2.isMarkedAll ();
}
/**
* Sets the regex1.
*
* @param regex1 The regex1 to set.
* @see #regex1
*/
public void setRegex1 ( RegexNode regex1 )
{
this.childrenCache = null;
this.regex1 = regex1;
}
/**
* Sets the regex2.
*
* @param regex2 The regex2 to set.
* @see #regex2
*/
public void setRegex2 ( RegexNode regex2 )
{
this.childrenCache = null;
this.regex2 = regex2;
}
/**
* {@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.regex1.unmarkAll ();
this.regex2.unmarkAll ();
}
}