//---------------------------------------------------------------------------
// ŠNikolai V. Shokhirev, 2004-2008  <nikolai@shokhirev.com> http://www.shokhirev.com/nikolai.html
// struct implementation of complex numbers
//---------------------------------------------------------------------------

#ifndef Complex_H
#define Complex_H
#include "MathUtils.h"

//---------------------------------------------------------------------------


struct Complex {
  real Re;
  real Im;
};

Complex cmplx(real r, real i = 0.0);
Complex Real(real r);
Complex Img(real i);

Complex Cadd(Complex c1, Complex c2);
Complex Cadd(Complex c1, real r);
Complex Cadd(real r, Complex c2);

Complex Csub(Complex c1, Complex c2);
Complex Csub(Complex c1, real r);
Complex Csub(real r, Complex c2);

Complex Cmul(Complex c1, Complex c2);
Complex Cmul(Complex c1, real r);
Complex Cmul(real r, Complex c2);

Complex Cdiv(Complex c1, Complex c2);
Complex Cdiv(Complex c1, real r);
Complex Cdiv(real r, Complex c2);

// Complex library

Complex conjug(Complex c);

real mod2(Complex c);

real mod(Complex c);

bool Equal(Complex c1, Complex c2, real eps = eps0);

bool Equal(Complex c1, real r, real i, real eps = eps0);

bool IsZero(Complex c);

Complex exp(Complex c);

// result = sqrt(z), result.Re > 0
Complex Csqrt(Complex z);

#endif