#ifndef COMPLEX_H
#define COMPLEX_H

#include <iostream>
using namespace std;

class Complex {
public:
  // default constructor
  Complex(double r = 0.0, double i = 0.0) {re = r; im = i;}

  // copy constructor
  Complex(const Complex& rhs) {re = rhs.re; im = rhs.im;}

  // destructor
  ~Complex(void) {}

  // field access functions
  double real(void) const {return re;}
  double imag(void) const {return im;}

  // field modify functions
  void imag(double i) {im = i;}
  void real(double r) {re = r;}

  // assignment operator
  Complex& operator=(const Complex& rhs) {
    if (this == &rhs) return *this;  // time-saving self-test
    re = rhs.re; im = rhs.im;
    return *this;                    // for daisy-chaining
  }

  // equality test operator
  bool operator==(const Complex& rhs) {
    return ((real()==rhs.real()) && (imag()==rhs.imag()));
  }

  // addition operator
  const Complex operator+(const Complex& rhs) {
    return Complex(re+rhs.re, im+rhs.im);
  }


private:
    double re, im;
};

// output operator
ostream& operator<<(ostream& output, const Complex& rhs) {
  return output << "(" << rhs.real() << "," << rhs.imag() << "i)";
}

#endif