// @topic T53025 12/03/2012 -- Operator Overloading
// @brief class Rational implementation

#include "rational.h"

// rational.cpp
Rational::Rational( int num, int denom )
:
m_n( num ), m_d( denom )
{
}

Rational::Rational( Rational const& other )
:
m_n( other.m_n ), m_d( other.m_d )
{
    std::cout << "copy of " << &other << " was made\n";
}

/* ik-12/03/2010 commented out temporarily to demo non-member syntax
Rational Rational::operator-() const
{
    // uses 2-argument constructor
    return Rational( -m_n, m_d );
}
*/

Rational operator-( Rational const& rat )
{
    // uses 2-argument constructor
    return Rational( -rat.m_n, rat.m_d );
}

std::ostream& operator<<(
                         std::ostream& ostr,
                         Rational const& rat
                         )
{
    ostr << rat.m_n << '/' << rat.m_d;
    return ostr;
}

Rational& Rational::operator=( Rational const& other )
{
    if ( this == &other ) {
        // beware of self assignment!
        return *this;
    }

    m_n = other.m_n;
    m_d = other.m_d;

    return *this;
}

bool Rational::operator==( Rational const& other ) const
{
    // This way, 1/2 == 2/4
    return ( ( m_n * other.m_d ) == ( m_d * other.m_n ) );
}