//package kcdc.applets.genart;

// JM: minor class to hold operator definitions
abstract public class QuaternionOperator implements Operator
{
	// JM: temps for operations
	protected transient static Quaternion tmp1 = new Quaternion();
	protected transient static Quaternion tmp2 = new Quaternion();
	protected transient static Quaternion tmp3 = new Quaternion();

	// Return a null string for operator
	//public String getName() { return "nop"; }
	// By default quaternion operators are not constant
	public boolean isConstant() { return false; }
	// Get degree (number of variables needed) for this operator
	//public int getDegree() { return 0; }
	// Apply this operater
	//public void operator(Quaternion q, Quaternion a, Quaternion b, double x, double y)
	//{ return q; }

	// JM: long list of operators

	static class qplus extends QuaternionOperator
	{
		public String getName() { return "+"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qplus(a,b); }
	}
    
	static class qsub extends QuaternionOperator
	{
		public String getName() { return "-"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qsub(a,b); }
	}
    
	static class qmult extends QuaternionOperator
	{
		public String getName() { return "*"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qmult(a,b); }
	}
    
	static class qinv extends QuaternionOperator
	{
		public String getName() { return "inv"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qinv(a); }
	}
    
	static class qdiv extends QuaternionOperator
	{
		public String getName() { return "/"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qdiv(a,b,tmp1); }
	}
    
	static class qconj extends QuaternionOperator
	{
		public String getName() { return "conj"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qconj(a); }
	}

	static class qaut1 extends QuaternionOperator
	{
		public String getName() { return "A1"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qaut1(a,b,tmp1,tmp2); }
	}

	static class qaut2 extends QuaternionOperator
	{
		public String getName() { return "A2"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qaut2(a,b,tmp1,tmp2,tmp3); }
	}

	static class qexp extends QuaternionOperator
	{
		public String getName() { return "exp"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qexp(a,tmp1,tmp2,tmp3); }
	}

	static class qfloor extends QuaternionOperator
	{
		public String getName() { return "floor"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qfloor(a); }
	}

	static class qmod extends QuaternionOperator
	{
		public String getName() { return "mod"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qmod(a,b,tmp1); }
	}

	static class qnorm extends QuaternionOperator
	{
		public String getName() { return "normalize"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qnorm(a); }
	}

	static class qnormp extends QuaternionOperator
	{
		public String getName() { return "normp"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qnormp(a); }
	}

	static class qorth1 extends QuaternionOperator
	{
		public String getName() { return "orth1"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qorth1(a,b,tmp1,tmp2,tmp3); }
	}

	static class qorth2 extends QuaternionOperator
	{
		public String getName() { return "orth2"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qorth2(a,b,tmp1,tmp2,tmp3); }
	}

	static class qc1 extends QuaternionOperator
	{
		public String getName() { return "1"; }
		public int getDegree() { return 0; }
		public boolean isConstant() { return true; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qc1(); }
	}

	static class qc2 extends QuaternionOperator
	{
		public String getName() { return "i"; }
		public int getDegree() { return 0; }
		public boolean isConstant() { return true; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qc2(); }
	}

	static class qc3 extends QuaternionOperator
	{
		public String getName() { return "j"; }
		public int getDegree() { return 0; }
		public boolean isConstant() { return true; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qc3(); }
	}

	static class qc4 extends QuaternionOperator
	{
		public String getName() { return "k"; }
		public int getDegree() { return 0; }
		public boolean isConstant() { return true; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qc4(); }
	}

	static class qc5 extends QuaternionOperator
	{
		public String getName() { return "golden"; }
		public int getDegree() { return 0; }
		public boolean isConstant() { return true; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qc5(); }
	}

	static class qcx extends QuaternionOperator
	{
		public String getName() { return "x"; }
		public int getDegree() { return 0; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qcx(x,y); }
	}

	static class qcy extends QuaternionOperator
	{
		public String getName() { return "y"; }
		public int getDegree() { return 0; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qcy(x,y); }
	}

	static class qcx1 extends QuaternionOperator
	{
		public String getName() { return "x_k"; }
		public int getDegree() { return 0; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qcx1(x,y); }
	}

	static class qcy1 extends QuaternionOperator
	{
		public String getName() { return "y_k"; }
		public int getDegree() { return 0; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qcy1(x,y); }
	}

	static class qcxy extends QuaternionOperator
	{
		public String getName() { return "x_iy"; }
		public int getDegree() { return 0; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qcxy(x,y); }
	}

	static class qcxy2 extends QuaternionOperator
	{
		public String getName() { return "x_iy_jx_ky"; }
		public int getDegree() { return 0; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qcxy2(x,y); }
	}

	static class qisin extends QuaternionOperator
	{
		public String getName() { return "isin"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qisin(a); }
	}

	static class qilog extends QuaternionOperator
	{
		public String getName() { return "ilog"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qilog(a); }
	}

	static class qiexp extends QuaternionOperator
	{
		public String getName() { return "iexp"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qiexp(a); }
	}

	static class qimin extends QuaternionOperator
	{
		public String getName() { return "imin"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qimin(a,b); }
	}

	static class qimax extends QuaternionOperator
	{
		public String getName() { return "imax"; }
		public int getDegree() { return 2; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qimax(a,b); }
	}

	static class qrl extends QuaternionOperator
	{
		public String getName() { return "rolL"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qrl(a); }
	}

	static class qrr extends QuaternionOperator
	{
		public String getName() { return "rolR"; }
		public int getDegree() { return 1; }
		public void operate(Quaternion q, Quaternion a, Quaternion b, double x, double y)
		{ q.qrr(a); }
	}

	static final public void main(String[] args)
	{
		QuaternionOperator[] quaternion_operators =
		{
			new QuaternionOperator.qplus(),
			new QuaternionOperator.qsub(),
			new QuaternionOperator.qmult(),
			new QuaternionOperator.qinv(),
			new QuaternionOperator.qdiv(),
			new QuaternionOperator.qconj(),
			new QuaternionOperator.qaut1(),
			new QuaternionOperator.qaut2(),
			new QuaternionOperator.qexp(),
			new QuaternionOperator.qfloor(),
			new QuaternionOperator.qmod(),
			new QuaternionOperator.qnorm(),
			new QuaternionOperator.qnormp(),
			new QuaternionOperator.qorth1(),
			new QuaternionOperator.qorth2(),
			new QuaternionOperator.qc1(),
			new QuaternionOperator.qc2(),
			new QuaternionOperator.qc3(),
			new QuaternionOperator.qc4(),
			new QuaternionOperator.qc5(),
			new QuaternionOperator.qcx(),
			new QuaternionOperator.qcy(),
			new QuaternionOperator.qcx1(),
			new QuaternionOperator.qcy1(),
			new QuaternionOperator.qcxy(),
			new QuaternionOperator.qcxy2(),
			new QuaternionOperator.qisin(),
			new QuaternionOperator.qilog(),
			new QuaternionOperator.qiexp(),
			new QuaternionOperator.qimin(),
			new QuaternionOperator.qimax(),
			new QuaternionOperator.qrl(),
			new QuaternionOperator.qrr()
		};

		for (int i = 0; i < quaternion_operators.length; i++)
			System.out.println(quaternion_operators[i].getName());
	}
}