#ifndef PASTELSYS_RATIONAL_CONSTRUCT_HPP
#define PASTELSYS_RATIONAL_CONSTRUCT_HPP
#include "pastel/sys/rational/rational.h"
#include <type_traits>
namespace Pastel
{
    template <typename Integer>
    Rational<Integer>::Rational()
        : m_(0)
        , n_(1)
    {
    }
    template <typename Integer>
    Rational<Integer>::Rational(
        const Rational& that)
        : m_(that.m_)
        , n_(that.n_)
    {
    }
    template <typename Integer>
    Rational<Integer>::Rational(
        Rational&& that)
        : m_(std::move(that.m_))
        , n_(std::move(that.n_))
    {
    }
    template <typename Integer>
    template <
        typename That_Integer,
        Requires<Rational_::IsNativeOrInteger<Integer, That_Integer>>>
    Rational<Integer>::Rational(
        That_Integer wholes)
        : m_(wholes)
        , n_(1)
    {
    }
    template <typename Integer>
    template <
        typename M_Integer, 
        typename N_Integer,
        Requires<
                Rational_::IsNativeOrInteger<Integer, M_Integer>,
                Rational_::IsNativeOrInteger<Integer, N_Integer>
            >
    >
    Rational<Integer>::Rational(
        M_Integer m,
        N_Integer n)
        : m_(std::move(m))
        , n_(std::move(n))
    {
        simplify();
    }
    // Private
    template <typename Integer>
    Rational<Integer>::Rational(
        Integer m, Integer n,
        SkipSimplify)
        : m_(std::move(m))
        , n_(std::move(n))
    {
    }
}
#endif