/*******************************************************************************
* Copyright (c) 2009-2013 CWI
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* * Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI
* * Tijs van der Storm - Tijs.van.der.Storm@cwi.nl
* * Paul Klint - Paul.Klint@cwi.nl - CWI
* * Arnold Lankamp - Arnold.Lankamp@cwi.nl
*******************************************************************************/
package org.rascalmpl.interpreter.result;
import static org.rascalmpl.interpreter.result.ResultFactory.bool;
import java.util.Iterator;
import org.rascalmpl.interpreter.IEvaluatorContext;
import org.rascalmpl.value.IBool;
import org.rascalmpl.value.IValue;
import org.rascalmpl.value.type.Type;
public class BoolResult extends ElementResult<IBool> {
public BoolResult(Type type, IBool bool, IEvaluatorContext ctx) {
this(type, bool, null, ctx);
}
public BoolResult(Type type, IBool bool, Iterator<Result<IValue>> iter, IEvaluatorContext ctx) {
super(type, bool, iter, ctx);
}
@Override
public <V extends IValue> Result<IBool> equals(Result<V> that) {
return that.equalToBool(this);
}
@Override
public <V extends IValue> Result<IBool> nonEquals(Result<V> that) {
return that.nonEqualToBool(this);
}
@Override
public <V extends IValue> Result<IBool> lessThan(Result<V> result) {
return result.lessThanBool(this);
}
@Override
public <V extends IValue> LessThanOrEqualResult lessThanOrEqual(Result<V> result) {
return result.lessThanOrEqualBool(this);
}
@Override
public <V extends IValue> Result<IBool> greaterThan(Result<V> result) {
return result.greaterThanBool(this);
}
@Override
public <V extends IValue> Result<IBool> greaterThanOrEqual(Result<V> result) {
return result.greaterThanOrEqualBool(this);
}
@Override
public Result<IBool> negate() {
return bool(getValue().not().getValue(), ctx);
}
/////
@Override
public Result<IValue> ifThenElse(Result<IValue> then, Result<IValue> _else) {
if (isTrue()) {
return then;
}
return _else;
}
///
@Override
protected Result<IBool> equalToBool(BoolResult that) {
return that.equalityBoolean(this);
}
@Override
protected Result<IBool> nonEqualToBool(BoolResult that) {
return that.nonEqualityBoolean(this);
}
@Override
protected LessThanOrEqualResult lessThanOrEqualBool(BoolResult that) {
// false < true or true <= true
if (that.isTrue()) {
return new LessThanOrEqualResult(false, isTrue(), ctx);
}
else {
return new LessThanOrEqualResult(isTrue(), !isTrue(), ctx);
}
}
@Override
protected Result<IBool> lessThanBool(BoolResult that) {
return bool(!that.isTrue() && isTrue(), ctx);
}
@Override
protected Result<IBool> greaterThanBool(BoolResult that) {
return that.lessThanBool(this);
}
@Override
protected Result<IBool> greaterThanOrEqualBool(BoolResult that) {
LessThanOrEqualResult r = that.lessThanOrEqualBool(this);
return r;
}
@Override
public boolean isTrue() {
return getValue().getValue();
}
@Override
protected <U extends IValue> Result<U> addListRelation(ListRelationResult that) {
return that.addBool(this);
}
@Override
protected <U extends IValue> Result<U> addRelation(RelationResult that) {
return that.addBool(this);
}
}