#ifndef __AMSMATHUTIL25_COMPLEX64_HPP__
#define __AMSMATHUTIL25_COMPLEX64_HPP__

namespace ams
{
namespace cmp
{

    class complex64
    {
        public:
        float r,i;

        complex64();
        complex64(float _r, float _i);
        explicit complex64(float _r);
        complex64(const complex64 &other);
        complex64& operator=(const complex64& other);
        complex64& operator=(const float other);

        friend complex64 operator-(const complex64& z); //negation sign

        complex64 operator+(const complex64& z);
        complex64 operator-(const complex64& z);
        complex64 operator*(const complex64& z);
        complex64 operator/(const complex64& z);

        complex64 operator+(const float & z);
        complex64 operator-(const float & z);
        complex64 operator*(const float & z);
        complex64 operator/(const float & z);

        float& operator[](int& ind);
        const float& operator[](const int& ind) const;
     
        //comparison operators
        bool operator==(const complex64& z);
        bool operator!=(const complex64& z);
        bool operator>(const complex64& z);
        bool operator<(const complex64& z);
        bool operator>=(const complex64& z);
        bool operator<=(const complex64& z);
        bool isnan();
        bool isinf();
        


        bool isreal();
        bool isimag();
        bool iszero();
        float arg();
        float mag();
        const complex64 conj();
    };

    float arg(ams::cmp::complex64 z);

    float real(complex64 z);
    float imag(complex64 z);
    complex64 sin(complex64 z);
    complex64 cos(complex64 z);
    complex64 tan(complex64 z);
    complex64 exp(complex64 z);
    complex64 log(complex64 z);
    float abs(complex64 z);
    complex64 conj(complex64 z);

    //need hyperbolic trig Functions
    complex64 cosh(complex64 z);
    complex64 sinh(complex64 z);
    complex64 tanh(complex64 z);

    complex64 pow(complex64 z1, complex64 z2);

    //returns "complex64 sign" of complex64 number - 0, or a unit number with same argument
    complex64 csgn(complex64 z);
    
}; //end namespace cmp
}; //end namespace ams

#endif

