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 FcnItem extends Item {

	public FcnItem(Calculator ca) {
		super(ca);
		ca.systemInstall(this);
	}
	
	public abstract double f(double x);

	public boolean inRange(double x) {
		return(true);
	}
	
	public void exec() {
		if (ca.check(1)) {
			Item a = ca.peek();
			if (a instanceof DoubleValue) {
				ca.pop();
				double x = ((DoubleValue) a).doubleValue();
				if (inRange(x)) {
					x = f(x);
					ca.push(new DoubleItem(ca, x));
				} else {
					ca.error(this, CalcErr.RealRange);
				}
			} else {
				ca.error(this, CalcErr.Type);
			}
		}
		else {
			ca.error(this, CalcErr.Underflow);
		}
	}
}
