/* complex.h */

#ifndef COMPLEX_H
#define COMPLEX_H 1


/* Complex structure representing a complex number consisting
 * of a double re- and a double im-part: re + im * i.
 */
typedef struct _Complex {
  double re;
  double im;
} Complex;


/*
 * Set a complex number to re + im * i.
 * Params:
 *   Complex *z         Pointer to complex number
 *   double re          real part of complex number
 *   double im          imaginary part of complex number
 */
void setComplex(Complex *z, double re, double im);


/*
 * Copy the complex *source to *dest.
 * Params:
 *   Complex *dest      Pointer to destination complex number
 *   Complex *source    Pointer to source complex number
 */
void copyComplex(Complex *dest, Complex *source);

/*
 * Print the complex number.
 * Params:
 *   Complex *z         Pointer to complex number of interest
 */
void printComplex(Complex *z);

/*
 * Add complex numbers: *dest = *dest + *source.
 */
void add(Complex *dest, Complex *source);

/*
 * Subtract complex numbers: *dest = *dest - *source.
 */
void sub(Complex *dest, Complex *source);

/*
 * Multiply complex numbers: *dest = *dest * *source.
 */
void mult(Complex *dest, Complex *source);

/*
 * Conjugate complex numbers: *dest = conj(*dest).
 */
void conj(Complex *destination);

/*
 * Divide complex numbers: *dest = *dest / *source.
 */
void div(Complex *dest, Complex *source);

#endif
