#![cfg_attr(rustfmt, rustfmt_skip)]

extern crate nalgebra as na;

use na::{DMatrix, Dyn, Matrix2x3, Matrix3x2, Const};

fn main() {
    // Matrices can be reshaped in-place without moving or copying values.
    let m1 = Matrix2x3::new(
        1.1, 1.2, 1.3,
        2.1, 2.2, 2.3
    );
    let m2 = Matrix3x2::new(
        1.1, 2.2,
        2.1, 1.3,
        1.2, 2.3
    );

    let m3 = m1.reshape_generic(Const::<3>, Const::<2>);
    assert_eq!(m3, m2);

    // Note that, for statically sized matrices, invalid reshapes will not compile:
    //let m4 = m3.reshape_generic(U3, U3);

    // If dynamically sized matrices are used, the reshaping is checked at run-time.
    let dm1 = DMatrix::from_row_slice(
        4,
        3,
        &[
            1.0, 0.0, 0.0,
            0.0, 0.0, 1.0,
            0.0, 0.0, 0.0,
            0.0, 1.0, 0.0
        ],
    );
    let dm2 = DMatrix::from_row_slice(
        6,
        2,
        &[
            1.0, 0.0,
            0.0, 1.0,
            0.0, 0.0,
            0.0, 1.0,
            0.0, 0.0,
            0.0, 0.0,
        ],
    );

    let dm3 = dm1.reshape_generic(Dyn(6), Dyn(2));
    assert_eq!(dm3, dm2);

    // Invalid reshapings of dynamic matrices will panic at run-time.
    //let dm4 = dm3.reshape_generic(Dyn(6), Dyn(6));
}
