use crate::algebra::abstr::Real;
use crate::algebra::linear::matrix::General;
use crate::matrix;

macro_rules! impl_from_mint(
    ($(($rows: literal, $columns: literal) => $MV: ident, $m: ident, $ret: expr);* $(;)*) => {$(

        impl<T> From<mint::$MV<T>> for General<T>
            where T: Real
        {
            fn from(m_mint: mint::$MV<T>) -> Self
            {
                let $m = m_mint;

                $ret
            }
        }
    )*}
);

impl_from_mint!(
    (2, 2) => ColumnMatrix2, m,
    matrix![
        m.x.x, m.y.x;
        m.x.y, m.y.y
    ];

    (2, 3) => ColumnMatrix2x3, m,
    matrix![
        m.x.x, m.y.x, m.z.x;
        m.x.y, m.y.y, m.z.y
    ];

    (2, 4) => ColumnMatrix2x4, m,
    matrix![
        m.x.x, m.y.x, m.z.x, m.w.x;
        m.x.y, m.y.y, m.z.y, m.w.y
    ];

    (3, 2) => ColumnMatrix3x2, m,
    matrix![
        m.x.x, m.y.x;
        m.x.y, m.y.y;
        m.x.z, m.y.z
    ];

    (3, 3) => ColumnMatrix3, m,
    matrix![
        m.x.x, m.y.x, m.z.x;
        m.x.y, m.y.y, m.z.y;
        m.x.z, m.y.z, m.z.z
    ];

    (3, 4) => ColumnMatrix3x4, m,
    matrix![
        m.x.x, m.y.x, m.z.x, m.w.x;
        m.x.y, m.y.y, m.z.y, m.w.y;
        m.x.z, m.y.z, m.z.z, m.w.z
    ];

    (4, 2) => ColumnMatrix4x2, m,
    matrix![
        m.x.x, m.y.x;
        m.x.y, m.y.y;
        m.x.z, m.y.z;
        m.x.w, m.y.w
    ];

    (4, 3) => ColumnMatrix4x3, m,
    matrix![
        m.x.x, m.y.x, m.z.x;
        m.x.y, m.y.y, m.z.y;
        m.x.z, m.y.z, m.z.z;
        m.x.w, m.y.w, m.z.w
    ];

    (4, 4) => ColumnMatrix4, m,
    matrix![
        m.x.x, m.y.x, m.z.x, m.w.x;
        m.x.y, m.y.y, m.z.y, m.w.y;
        m.x.z, m.y.z, m.z.z, m.w.z;
        m.x.w, m.y.w, m.z.w, m.w.w
    ];

    (2, 2) => RowMatrix2, m,
    matrix![
        m.x.x, m.x.y;
        m.y.x, m.y.y
    ];

    (2, 3) => RowMatrix2x3, m,
    matrix![
        m.x.x, m.x.y, m.x.z;
        m.y.x, m.y.y, m.y.z
    ];

    (2, 4) => RowMatrix2x4, m,
    matrix![
        m.x.x, m.x.y, m.x.z, m.x.w;
        m.y.x, m.y.y, m.y.z, m.y.w
    ];

    (3, 2) => RowMatrix3x2, m,
    matrix![
        m.x.x, m.x.y;
        m.y.x, m.y.y;
        m.z.x, m.z.y
    ];

    (3, 3) => RowMatrix3, m,
    matrix![
        m.x.x, m.x.y, m.x.z;
        m.y.x, m.y.y, m.y.z;
        m.z.x, m.z.y, m.z.z
    ];

    (3, 4) => RowMatrix3x4, m,
    matrix![
        m.x.x, m.x.y, m.x.z, m.x.w;
        m.y.x, m.y.y, m.y.z, m.y.w;
        m.z.x, m.z.y, m.z.z, m.z.w
    ];

    (4, 2) => RowMatrix4x2, m,
    matrix![
        m.x.x, m.x.y;
        m.y.x, m.y.y;
        m.z.x, m.z.y;
        m.w.x, m.w.y
    ];

    (4, 3) => RowMatrix4x3, m,
    matrix![
        m.x.x, m.x.y, m.x.z;
        m.y.x, m.y.y, m.y.z;
        m.z.x, m.z.y, m.z.z;
        m.w.x, m.w.y, m.w.z
    ];

    (4, 4) => RowMatrix4, m,
    matrix![
        m.x.x, m.x.y, m.x.z, m.x.w;
        m.y.x, m.y.y, m.y.z, m.y.w;
        m.z.x, m.z.y, m.z.z, m.z.w;
        m.w.x, m.w.y, m.w.z, m.w.w
    ];
);
