package jscl.math.function; import jscl.math.Generic; import jscl.math.JsclInteger; import jscl.mathml.MathML; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * User: serso * Date: 11/12/11 * Time: 3:48 PM */ public abstract class AbstractDms extends Algebraic { protected AbstractDms(@Nonnull String name, Generic degrees, Generic minutes, Generic seconds) { super(name, new Generic[]{degrees, minutes, seconds}); } @Nonnull private static Generic[] createParameters(@Nullable Generic degrees, @Nullable Generic minutes, @Nullable Generic seconds) { final Generic[] result = new Generic[3]; setDefaultValue(result, degrees, 0); setDefaultValue(result, minutes, 1); setDefaultValue(result, seconds, 2); return result; } private static void setDefaultValue(@Nonnull Generic[] parameters, @Nullable Generic parameter, int position) { if (parameter == null) { parameters[position] = JsclInteger.valueOf(0); } else { parameters[position] = parameter; } } @Override public int getMaxParameters() { return 3; } @Override public void setParameters(@Nullable Generic[] parameters) { super.setParameters(createParameters(getParameter(parameters, 0), getParameter(parameters, 1), getParameter(parameters, 2))); } @Override public Root rootValue() throws NotRootException { throw new UnsupportedOperationException("Root for " + name + "() is not supported!"); } @Override void bodyToMathML(MathML element, boolean fenced) { final MathML child = element.element(name); parameters[0].toMathML(child, null); // todo serso: add other parameters element.appendChild(child); } @Override public Generic selfExpand() { return expressionValue(); } @Override public Generic selfElementary() { return selfExpand(); } @Override public Generic selfSimplify() { return selfExpand(); } @Override public Generic selfNumeric() { Generic degrees = parameters[0]; if (parameters.length > 1 && parameters[1] != null) { Generic minutes = parameters[1]; degrees = degrees.add(minutes.divide(JsclInteger.valueOf(60))); } if (parameters.length > 2 && parameters[2] != null) { Generic seconds = parameters[2]; degrees = degrees.add(seconds.divide(JsclInteger.valueOf(60 * 60))); } return degrees; } @Override public Generic derivative(int n) { throw new UnsupportedOperationException("Derivative for " + name + "() is not supported!"); } }