// This may look like C code, but it is really -*- C++ -*-

/* 
 * Copyright (c) University of Aizu
 */

#ifndef _Cvector_h
#define _Cvector_h 1

#ifdef __GNUG__
#pragma interface
#endif

#include <complex.h>

class  Cvector
{
 private:
  complex* v;
  int sz;

 public:
  // constructors and destructors
  Cvector(int size, int pos, const complex& value = complex(1));
  Cvector(int size, const complex& initial = complex(0));
  Cvector(const Cvector&);
  ~Cvector();

  // basic structural operations
  complex& operator[](int) const;
  complex& elem(int) const;
  int      len() const;
  void     set(double ...);
  void     set(float ...);
  void     set(int ...);

  // assignment
  Cvector& operator =  (const Cvector& y);
  Cvector& operator =  (const complex& y);

  // basic math
  Cvector& operator += (const Cvector& y);
  Cvector& operator -= (const Cvector& y);
  Cvector& operator *= (const complex& y);
  Cvector& operator /= (const complex& y);
  Cvector& operator -  ();
  Cvector& operator +  ();

// other functions
friend istream&  operator >> (istream& s, Cvector& x);
friend ostream&  operator << (ostream& s, const Cvector& x);

// multiplication and division by scalar values
friend Cvector operator  * (const complex&, const Cvector&);
 
friend Cvector operator  * (const Cvector&, const complex&);
friend Cvector operator  / (const Cvector&, const complex&);

// inner product
friend complex operator  * (const Cvector&, const Cvector&);

// adding und subtracting vectors
friend Cvector operator  + (const Cvector&, const Cvector&);
friend Cvector operator  - (const Cvector&, const Cvector&);

// comparisons
friend int     operator == (const Cvector&, const Cvector&);
friend int     operator != (const Cvector&, const Cvector&);

// the "infinity" norm
friend double norm(const Cvector&);
friend complex max(const Cvector&);
};

#endif

