/*-*-c++-*-****************************************************************
 *                     lacomplex.h Helper file for complex numbers 
                       -------------------
 begin                : 2004-01-14
 copyright            : (C) 2004 by Christian Stimming
 email                : stimming@tuhh.de
***************************************************************************/

// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2, or (at your option) any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.

// You should have received a copy of the GNU Lesser General
// Public License along with this library; see the file COPYING.
// If not, write to the Free Software Foundation, 59 Temple Place
// - Suite 330, Boston, MA 02111-1307, USA.

#ifndef _LACOMPLEX_H
#define _LACOMPLEX_H

/** @file
    
@brief Helper file for complex numbers

This file exists to be a replacement to Lapack++'s inclusion of
<complex.h>. 

@note Complex numbers are a difficult issue. This solution might be
non-trivial to understand, but please bear in mind that complex
numbers are really a nuisance in the C++ programming language.

This file is being used to help the automated conversion from
LAPACK++'s legacy type COMPLEX to the current up-to-date type
std::complex<double>. More information at the type definitions below.

*/

// Include the version number defines
#include <laversion.h>

// Include the FORTRAN definitions from LAPACK++
#include <f2c.h>


// ////////////////////////////////////////////////////////////

/** An application must define LA_COMPLEX_SUPPORT if it wants to use
 * complex numbers here. */
#ifdef LA_COMPLEX_SUPPORT

/** @brief Complex type that is used in LAPACK++ internally. 

The complex type inside LAPACK++ should be the FORTRAN type, since
LAPACK++ has to pass these values back and forth to the FORTRAN
functions. Don't use this data type anywhere outside anymore. */
typedef doublecomplex COMPLEX;

// As opposed to the FORTRAN "COMPLEX", include now the
// std::complex<double> type.
#include <complex>
// And finally include the la::complex<double> which is a copy of
// std::complex<double> with additional type conversions.
#include <lacomplex>

/** @brief Complex data type that can be used from the application.
 *
 * This type is used for passing scalars in and out of LAPACK++. It is
 * a copy of the \c std::complex<double> and it includes automatic
 * conversion from and to \c std::complex<double>. Additionally it
 * includes automatic conversion from and to the internal FORTRAN type
 * COMPLEX, which is why this class is needed to pass complex values
 * into Lapack++.
 *
 * Again: If you get errors when passing a \c std::complex<double>
 * into Lapack++, then you first need to convert your \c
 * std::complex<double> into this \c LaComplex value.
 */
typedef la::complex<double> LaComplex;

/** Additional operator to make stream output easier.
*/
inline std::ostream&
operator<<(std::ostream& __os, const COMPLEX& __x)
{
  return __os << LaComplex(__x);
}

/** Equality operator for \ref COMPLEX. (New in lapackpp-2.4.5) */
inline bool operator==(const COMPLEX& _a, const COMPLEX& _b)
{
    return _a.r == _b.r && _a.i == _b.i;
}
/** Inequality operator for \ref COMPLEX. (New in lapackpp-2.4.5) */
inline bool operator!=(const COMPLEX& _a, const COMPLEX& _b)
{
    return _a.r != _b.r || _a.i != _b.i;
}

#endif /* LA_COMPLEX_SUPPORT */

// ////////////////////////////////////////////////////////////

#endif // _LACOMPLEX_H


syntax highlighted by Code2HTML, v. 0.9.1