#ifndef PASTELSYS_RATIONAL_MULTIPLY_HPP
#define PASTELSYS_RATIONAL_MULTIPLY_HPP
#include "pastel/sys/rational/rational.h"
namespace Pastel
{
    template <typename Integer>
    Rational<Integer>& Rational<Integer>::operator*=(
        Rational that)
    {
        /*
       *   |   Num NaN +oo -oo 0
       ---+---------------------------
       Num|    Num
       NaN|    NaN NaN
       +oo|    +oo NaN +oo
       -oo|    -oo NaN -oo +oo
       0  |      0 NaN 0   0   0
       */
        NumberType thisType = classify();
        NumberType thatType = that.classify();
        Rational result;
        if (thisType == NumberType::Nan ||
            thatType == NumberType::Nan)
        {
            // The result is NaN.
            result.set(0, 0, SkipSimplify());
        }
        else if ((thisType == NumberType::Infinity &&
            thatType == NumberType::Infinity) ||
            (thisType == NumberType::MinusInfinity &&
            thatType == NumberType::MinusInfinity))
        {
            // The result is +oo.
            result.set(1, 0, SkipSimplify());
        }
        else if ((thisType == NumberType::Infinity &&
            thatType == NumberType::MinusInfinity) ||
            (thisType == NumberType::MinusInfinity &&
            thatType == NumberType::Infinity))
        {
            // The result is -oo.
            result.set(-1, 0, SkipSimplify());
        }
        else if (thisType == NumberType::Zero ||
            thatType == NumberType::Zero)
        {
            // The result is zero.
            result.set(0, 1, SkipSimplify());
        }
        else
        {
            // Both are just normal numbers.
            result.set(
                m_  * std::move(that.m_),
                n_ * std::move(that.n_));
        }
        swap(result);
        return *this;
    }
    template <typename Integer>
    Rational<Integer>& Rational<Integer>::operator/=(
        Rational that)
    {
        return (*this) *=
            Rational(
            std::move(that.n_), 
            std::move(that.m_));
    }
}
#endif