package de.westnordost.streetcomplete.data.osm.tql;
import java.util.EmptyStackException;
import java.util.Stack;
/** Builds a boolean expression. Basically a BooleanExpression with a cursor. */
public class BooleanExpressionBuilder<T extends BooleanExpressionValue>
{
private BooleanExpression<T> node;
private Stack<BooleanExpression<T>> bracket;
public BooleanExpressionBuilder()
{
node = new BooleanExpression<>(true);
bracket = new Stack<>();
}
public void addOpenBracket()
{
bracket.push(node);
node = node.addOpenBracket();
}
public void addCloseBracket()
{
try
{
node = bracket.pop();
}
catch(EmptyStackException e)
{
throw new IllegalStateException("Closed one bracket too much");
}
}
public void addValue(T t)
{
node.addValue(t);
}
public void addAnd()
{
node = node.addAnd();
}
public void addOr()
{
node = node.addOr();
}
public BooleanExpression<T> getResult()
{
if(!bracket.empty())
{
throw new IllegalStateException("Closed one bracket too little");
}
while(node.getParent() != null)
{
node = node.getParent();
}
node.flatten();
return node;
}
}