//=============================================================================
//! (DO NOT USE) Smart-temporary Real Double-precision General Sparse Matrix Class
class _zgsmatrix
{
public:
  //// objects ////
  mutable long M; //!< matrix row size
  mutable long N; //!< matrix column size
  mutable long CAP; //!< the length of data arrays
  mutable long VOL; //!< the number of non-zero components
  mutable std::complex<double>* Array; //!< 1D array to store non-zero matrix data
  mutable long* Indx; //!< 1D array to store the i-index of non-zero matrix components
  mutable long* Jndx; //!< 1D array to store the j-index of non-zero matrix components
  mutable std::vector< std::pair<long,long> >* Row; //!< array of vector to store the entry information of component for each row
  mutable std::vector< std::pair<long,long> >* Col; //!< array of vector to store the entry information of component for each column
  //// constructor ////
  inline _zgsmatrix();
  inline _zgsmatrix(const _zgsmatrix&);
  inline ~_zgsmatrix(); //destructor
  
  //// cast ////
  inline _zgematrix to_zgematrix() const;
  
  //// io ////
  inline std::complex<double> operator()(const long&, const long&) const;//not return std::complex<double>&
  inline friend std::ostream& operator<<(std::ostream&, const _zgsmatrix&);
  inline void write(const char *) const;
  
  //// misc ////
  inline void nullify() const;
  inline void destroy() const;
  
  //// calc ////
  inline friend _zgsmatrix t(const zgsmatrix&);
  inline friend void idamax(long&, long&, const zgsmatrix&);
  inline friend std::complex<double> damax(const zgsmatrix&);
  
  //// unary ////
  inline friend const _zgsmatrix& operator+(const _zgsmatrix&);
  inline friend _zgsmatrix operator-(const _zgsmatrix&);
  
  //// + ////
  inline friend _zgsmatrix operator+(const  zgsmatrix&, const  zgsmatrix&);
  inline friend _zgsmatrix operator+(const  zgsmatrix&, const _zgsmatrix&);
  inline friend _zgsmatrix operator+(const _zgsmatrix&, const  zgsmatrix&);
  inline friend _zgsmatrix operator+(const _zgsmatrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator+(const _zgsmatrix&, const  zgematrix&);
  inline friend _zgematrix operator+(const _zgsmatrix&, const _zgematrix&);
  inline friend _zgematrix operator+(const _zgematrix&, const _zgsmatrix&);
  inline friend _zgematrix operator+(const  zgematrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator+(const _zgsmatrix&, const  zgbmatrix&);
  inline friend _zgematrix operator+(const _zgsmatrix&, const _zgbmatrix&);
  inline friend _zgematrix operator+(const _zgbmatrix&, const _zgsmatrix&);
  inline friend _zgematrix operator+(const  zgbmatrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator+(const _zgsmatrix&, const  zhematrix&);
  inline friend _zgematrix operator+(const _zgsmatrix&, const _zhematrix&);
  inline friend _zgematrix operator+(const _zhematrix&, const _zgsmatrix&);
  inline friend _zgematrix operator+(const  zhematrix&, const _zgsmatrix&);
  
  //// - ////
  inline friend _zgsmatrix operator-(const  zgsmatrix&, const  zgsmatrix&);
  inline friend _zgsmatrix operator-(const  zgsmatrix&, const _zgsmatrix&);
  inline friend _zgsmatrix operator-(const _zgsmatrix&, const  zgsmatrix&);
  inline friend _zgsmatrix operator-(const _zgsmatrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator-(const _zgsmatrix&, const  zgematrix&);
  inline friend _zgematrix operator-(const _zgsmatrix&, const _zgematrix&);
  inline friend _zgematrix operator-(const _zgematrix&, const _zgsmatrix&);
  inline friend _zgematrix operator-(const  zgematrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator-(const _zgsmatrix&, const  zgbmatrix&);
  inline friend _zgematrix operator-(const _zgsmatrix&, const _zgbmatrix&);
  inline friend _zgematrix operator-(const _zgbmatrix&, const _zgsmatrix&);
  inline friend _zgematrix operator-(const  zgbmatrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator-(const _zgsmatrix&, const  zhematrix&);
  inline friend _zgematrix operator-(const _zgsmatrix&, const _zhematrix&);
  inline friend _zgematrix operator-(const _zhematrix&, const _zgsmatrix&);
  inline friend _zgematrix operator-(const  zhematrix&, const _zgsmatrix&);
  
  //// * ////
  inline friend _zgsmatrix operator*(const  zgsmatrix&, const  zgsmatrix&);
  inline friend _zgsmatrix operator*(const  zgsmatrix&, const _zgsmatrix&);
  inline friend _zgsmatrix operator*(const _zgsmatrix&, const  zgsmatrix&);
  inline friend _zgsmatrix operator*(const _zgsmatrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator*(const _zgsmatrix&, const  zgematrix&);
  inline friend _zgematrix operator*(const _zgsmatrix&, const _zgematrix&);
  inline friend _zgematrix operator*(const _zgematrix&, const _zgsmatrix&);
  inline friend _zgematrix operator*(const  zgematrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator*(const _zgsmatrix&, const  zgbmatrix&);
  inline friend _zgematrix operator*(const _zgsmatrix&, const _zgbmatrix&);
  inline friend _zgematrix operator*(const _zgbmatrix&, const _zgsmatrix&);
  inline friend _zgematrix operator*(const  zgbmatrix&, const _zgsmatrix&);
  
  inline friend _zgematrix operator*(const _zgsmatrix&, const  zhematrix&);
  inline friend _zgematrix operator*(const _zgsmatrix&, const _zhematrix&);
  inline friend _zgematrix operator*(const _zhematrix&, const _zgsmatrix&);
  inline friend _zgematrix operator*(const  zhematrix&, const _zgsmatrix&);
  
  inline friend _zcovector operator*(const  zgsmatrix&, const  zcovector&);
  inline friend _zcovector operator*(const  zgsmatrix&, const _zcovector&);
  
  inline friend _zrovector operator*(const  zrovector&, const _zgsmatrix&);
  inline friend _zrovector operator*(const _zrovector&, const _zgsmatrix&);
  
  inline friend _zgsmatrix operator*(const  zgsmatrix&, const  double&);
  inline friend _zgsmatrix operator*(const _zgsmatrix&, const  double&);
  inline friend _zgsmatrix operator*(const  double&, const  zgsmatrix&);
  inline friend _zgsmatrix operator*(const  double&, const _zgsmatrix&);
  
  inline friend _zgsmatrix operator*(const  zgsmatrix&, const  std::complex<double>&);
  inline friend _zgsmatrix operator*(const _zgsmatrix&, const  std::complex<double>&);
  inline friend _zgsmatrix operator*(const  std::complex<double>&, const  zgsmatrix&);
  inline friend _zgsmatrix operator*(const  std::complex<double>&, const _zgsmatrix&);
  
  //// / ////
  inline friend _zgsmatrix operator/(const  zgsmatrix&, const double&);
  inline friend _zgsmatrix operator/(const _zgsmatrix&, const double&);
  inline friend _zgsmatrix operator/(const  zgsmatrix&, const std::complex<double>&);
  inline friend _zgsmatrix operator/(const _zgsmatrix&, const std::complex<double>&);
  
  //// friend classes ////
  friend class  zgematrix;
  friend class _zgematrix;
  friend class  zgbmatrix;
  friend class _zgbmatrix;
  friend class  zhematrix;
  friend class _zhematrix;
  friend class  zgsmatrix;
  friend class  zhsmatrix;
  friend class _zhsmatrix;
  friend class  zcovector;
  friend class _zcovector;
  friend class  zrovector;
  friend class _zrovector;
};