Char2IntCaster.java

package dev.civl.mc.semantics.common;

import java.util.Arrays;

import dev.civl.mc.dynamic.IF.SymbolicUtility;
import dev.civl.mc.model.IF.type.CIVLType;
import dev.civl.sarl.IF.SymbolicUniverse;
import dev.civl.sarl.IF.expr.BooleanExpression;
import dev.civl.sarl.IF.expr.SymbolicConstant;
import dev.civl.sarl.IF.expr.SymbolicExpression;
import dev.civl.sarl.IF.expr.SymbolicExpression.SymbolicOperator;
import dev.civl.sarl.IF.object.CharObject;

//char to int
public class Char2IntCaster implements CIVLUnaryOperator<SymbolicExpression> {
	private SymbolicUniverse universe;
	private SymbolicConstant char2IntFunc;
	private SymbolicUtility symbolicUtil;

	public Char2IntCaster(SymbolicUniverse universe,
			SymbolicUtility symbolicUtil) {
		this.universe = universe;
		this.symbolicUtil = symbolicUtil;
		this.char2IntFunc = universe.symbolicConstant(
				universe.stringObject(CommonEvaluator.CHAR_TO_INT_FUNCTION),
				universe.functionType(
						Arrays.asList(this.universe.characterType()),
						universe.integerType()));
	}

	@Override
	public SymbolicExpression apply(BooleanExpression context,
			SymbolicExpression value, CIVLType type) {
		if (value.operator() == SymbolicOperator.CONCRETE) {
			CharObject charObj = (CharObject) value.argument(0);

			return this.universe.integer((int) charObj.getChar());
		} else {
			SymbolicExpression castedValue = this.symbolicUtil
					.applyReverseFunction(CommonEvaluator.INT_TO_CHAR_FUNCTION,
							value);

			if (castedValue != null)
				value = castedValue;
			else
				value = universe.apply(this.char2IntFunc, Arrays.asList(value));
		}
		return value;
	}
}