#ifndef PASTELSYS_RATIONAL_HPP
#define PASTELSYS_RATIONAL_HPP
#include "pastel/sys/rational/rational.h"
#include <type_traits>
namespace Pastel
{
    template <typename Integer>
    Rational<Integer>& Rational<Integer>::operator=(
        Rational that)
    {
        swap(that);
        return *this;
    }
    template <typename Integer>
    void Rational<Integer>::swap(
        Rational& that)
    {
        using std::swap;
        swap(m_, that.m_);
        swap(n_, that.n_);
    }
    template <typename Integer>
    void Rational<Integer>::set(Integer m, Integer n)
    {
        Rational copy(
            std::move(m), 
            std::move(n));
        swap(copy);
    }
    template <typename Integer>
    const Integer& Rational<Integer>::m() const
    {
        return m_;
    }
    template <typename Integer>
    const Integer& Rational<Integer>::n() const
    {
        return n_;
    }
    // Private
    template <typename Integer>
    void Rational<Integer>::set(
        Integer m, Integer n,
        SkipSimplify)
    {
        Rational copy(
            std::move(m), 
            std::move(n),
            SkipSimplify());
        swap(copy);
    }
}
#endif