1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use crate::*;
use std::convert::TryFrom;

// MatrixDxD
// --------------------------------------------------
impl<T> TryFrom<Vec<Vec<T>>> for MatrixDxD<T> {
    type Error = &'static str;
    fn try_from(data: Vec<Vec<T>>) -> Result<Self, Self::Error> {
        // If it contains some rows.
        if !data.is_empty() {
            // Check every row has the same number of columns.
            let cols = data[0].len();
            if data.iter().any(|c| c.len() != cols) {
                return Err("Inside `Vec`s differ in length.");
            }
        }
        let (rows, columns) = (data.len(), data[0].len());
        Ok(Self {
            data: data.into_iter().flatten().collect::<Vec<_>>(),
            rows,
            columns,
        })
    }
}
impl<T> TryFrom<(usize, usize, Vec<T>)> for MatrixDxD<T> {
    type Error = &'static str;
    fn try_from((rows, columns, data): (usize, usize, Vec<T>)) -> Result<Self, Self::Error> {
        if rows * columns == data.len() {
            Ok(Self {
                data: data,
                rows,
                columns,
            })
        } else {
            Err("Inside `Vec`s differ in length.")
        }
    }
}
impl<T: Clone> TryFrom<(usize, usize, &[T])> for MatrixDxD<T> {
    type Error = &'static str;
    fn try_from((rows, columns, data): (usize, usize, &[T])) -> Result<Self, Self::Error> {
        if rows * columns == data.len() {
            Ok(Self {
                data: Vec::from(data),
                rows,
                columns,
            })
        } else {
            Err("Inside `Vec`s differ in length.")
        }
    }
}
// MatrixSxD
// --------------------------------------------------
impl<T: Clone, const ROWS: usize> TryFrom<[Vec<T>; ROWS]> for MatrixSxD<T, ROWS> {
    type Error = &'static str;
    fn try_from(data: [Vec<T>; ROWS]) -> Result<Self, Self::Error> {
        if ROWS > 0 {
            // Check every row has the same number of columns.
            let cols = data[0].len();
            if data.iter().any(|c| c.len() != cols) {
                return Err("Inside `Vec`s differ in length.");
            }
        }

        Ok(Self {
            data: data.concat(),
            columns: data[0].len(),
        })
    }
}
impl<T, const ROWS: usize> TryFrom<(usize, Vec<T>)> for MatrixSxD<T, ROWS> {
    type Error = &'static str;
    fn try_from((columns, data): (usize, Vec<T>)) -> Result<Self, Self::Error> {
        if ROWS * columns == data.len() {
            Ok(Self {
                data: data,
                columns,
            })
        } else {
            Err("Inside `Vec`s differ in length.")
        }
    }
}
impl<T: Clone, const ROWS: usize> TryFrom<(usize, &[T])> for MatrixSxD<T, ROWS> {
    type Error = &'static str;
    fn try_from((columns, data): (usize, &[T])) -> Result<Self, Self::Error> {
        if ROWS * columns == data.len() {
            Ok(Self {
                data: Vec::from(data),
                columns,
            })
        } else {
            Err("Inside `Vec`s differ in length.")
        }
    }
}
// MatrixDxS
// --------------------------------------------------
impl<T, const COLUMNS: usize> TryFrom<(usize, Vec<T>)> for MatrixDxS<T, COLUMNS> {
    type Error = &'static str;
    fn try_from((rows, data): (usize, Vec<T>)) -> Result<Self, Self::Error> {
        if COLUMNS * rows == data.len() {
            Ok(Self { data: data, rows })
        } else {
            Err("Inside `Vec`s differ in length.")
        }
    }
}
impl<T: Clone, const COLUMNS: usize> TryFrom<(usize, &[T])> for MatrixDxS<T, COLUMNS> {
    type Error = &'static str;
    fn try_from((rows, data): (usize, &[T])) -> Result<Self, Self::Error> {
        if COLUMNS * rows == data.len() {
            Ok(Self {
                data: Vec::from(data),
                rows,
            })
        } else {
            Err("Inside `Vec`s differ in length.")
        }
    }
}