// equal().

// General includes.
#include "cl_sysdep.h"

// Specification.
#include "cln/complex.h"


// Implementation.

#include "cl_C.h"
#include "cln/real.h"

namespace cln {

cl_boolean equal (const cl_N& x, const cl_N& y)
{
// Methode:
// Falls beide reell, klar.
// Falls x reell, y komplex: (= x (realpart y)) und (zerop (imagpart y)).
// Falls x komplex, y reell: analog
// Falls beide komplex: Realteile und Imaginärteile jeweils gleich?
	if (realp(x)) {
		DeclareType(cl_R,x);
		if (realp(y)) {
			DeclareType(cl_R,y);
			// x,y beide reell
			return equal(x,y);
		} else {
			DeclareType(cl_C,y);
			// x reell, y komplex
			if (!zerop(imagpart(y)))
				return cl_false;
			return equal(x,realpart(y));
		}
	} else {
		DeclareType(cl_C,x);
		if (realp(y)) {
			DeclareType(cl_R,y);
			// x komplex, y reell
			if (!zerop(imagpart(x)))
				return cl_false;
			return equal(realpart(x),y);
		} else {
			DeclareType(cl_C,y);
			// x,y beide komplex
			if (!equal(realpart(x),realpart(y)))
				return cl_false;
			if (!equal(imagpart(x),imagpart(y)))
				return cl_false;
			return cl_true;
		}
	}
}

}  // namespace cln
