package rpn.doubles;

import java.util.Hashtable;
import rpn.Calculator;
import rpn.basic.Item;
import rpn.basic.DoubleValue;
import rpn.basic.ErrItem;
import rpn.basic.IntItem;
import rpn.basic.CalcErr;

public abstract class Fcn2Item extends Item {

	static boolean installed = false;
	
	public Fcn2Item(Calculator ca) {
		super(ca);
		ca.systemInstall(this);
	}
	
	public abstract double f(double x, double y);

	public boolean inRange(double x, double y) {
		return(true);
	}
	
	public void exec() {
		if (ca.check(2)) {
			Item a = ca.peek(1);
			Item b = ca.peek(0);
			if (a instanceof DoubleValue && 
				b instanceof DoubleValue) {
				ca.pop(2);
				double x = ((DoubleValue) a).doubleValue();
				double y = ((DoubleValue) b).doubleValue();
				if (inRange(x, y)) {
					x = f(x, y);
					ca.push(new DoubleItem(ca, x));
				} else {
					ca.error(this, CalcErr.RealRange);
				}
			} else {
				ca.error(this, CalcErr.Type);
			}
		}
		else {
			ca.error(this, CalcErr.Underflow);
		}
	}
	
	/* public static void install(Calculator ca) {
		if (!installed) {
			Item x;
			x = new SqrtItem(ca);
			x = new CosItem(ca);
			x = new SinItem(ca);
			x = new AcosItem(ca);
			x = new ExpItem(ca);
			x = new LogItem(ca);
			x = new Atan2Item(ca);
			x = new CaretItem(ca);
			installed = true;
		}
	} */
	
}
