24#include "AstMath/MathOperator.hpp"
25#include "AstMath/Vector.hpp"
35template<
typename _Scalar>
45 void resize(
size_t row,
size_t col);
47 size_t size()
const{
return m_row * m_col;}
48 size_t row()
const{
return m_row;}
49 size_t col()
const{
return m_col;}
50 _Scalar* data()
const{
return m_data;}
51 _Scalar& operator()(
size_t row,
size_t col){
return m_data[row * m_col + col];}
52 _Scalar operator()(
size_t row,
size_t col)
const{
return m_data[row * m_col + col];}
61template <
typename _Scalar>
68template <
typename _Scalar>
69inline Matrix<_Scalar>::~Matrix()
75template <
typename _Scalar>
76inline Matrix<_Scalar>::Matrix(
const Matrix& other)
82 this->m_data = (_Scalar*)malloc(other.size() *
sizeof(_Scalar));
83 memcpy(m_data, other.m_data, other.size() *
sizeof(_Scalar));
87template <
typename _Scalar>
88inline Matrix<_Scalar>& Matrix<_Scalar>::operator=(
const Matrix& other)
91 resize(other.row(), other.col());
93 memcpy(m_data, other.m_data, other.size() *
sizeof(_Scalar));
99template <
typename _Scalar>
100inline Matrix<_Scalar>::Matrix(Matrix&& other)
103 , m_data{other.m_data}
107 other.m_data =
nullptr;
110template <
typename _Scalar>
111inline Matrix<_Scalar>& Matrix<_Scalar>::operator=(Matrix&& other)
114 std::swap(m_row, other.m_row);
115 std::swap(m_col, other.m_col);
116 std::swap(m_data, other.m_data);
121template <
typename _Scalar>
122inline void Matrix<_Scalar>::resize(
size_t row,
size_t col)
128 m_data = (_Scalar*)malloc(row * col *
sizeof(_Scalar));
132template <
typename _Scalar>
133inline void Matrix<_Scalar>::setZero()
136 memset(m_data, 0, size() *
sizeof(_Scalar));
140template<
typename _Scalar,
size_t Row,
size_t Col>
145 typedef _Scalar Scalar;
147 constexpr size_t size()
const{
return Row*Col;}
148 constexpr size_t row()
const{
return Row;}
149 constexpr size_t col()
const{
return Col;}
150 constexpr Scalar* data()
const{
return (Scalar*)
this;}
151 Scalar operator[](
size_t idx)
const{
return data()[idx];}
152 Scalar operator()(
size_t idx)
const {
return data()[idx]; }
153 Scalar& operator()(
size_t idx) {
return data()[idx]; }
154 Scalar operator()(
size_t row,
size_t col)
const {
return data_[row][col]; }
155 Scalar& operator()(
size_t row,
size_t col) {
return data_[row][col]; }
158 Scalar data_[Row][Col];
162template<
typename _Scalar>
166 enum {Row = 3, Col = 3};
168 typedef _Scalar Scalar;
169 static Self Identity(){
return Self{1,0,0,0,1,0,0,0,1};}
170 static Self Zero(){
return Self{0,0,0,0,0,0,0,0,0};}
172 constexpr size_t size()
const{
return Row*Col;}
173 constexpr size_t row()
const{
return Row;}
174 constexpr size_t col()
const{
return Col;}
175 constexpr Scalar* data()
const{
return (Scalar*)
this;}
176 Scalar operator[](
size_t idx)
const{
return data()[idx];}
177 Scalar operator()(
size_t idx)
const {
return data()[idx]; }
178 Scalar& operator()(
size_t idx) {
return data()[idx]; }
179 Scalar operator()(
size_t row,
size_t col)
const {
return data_[row][col]; }
180 Scalar& operator()(
size_t row,
size_t col) {
return data_[row][col]; }
182 Self transpose()
const;
183 void transposeInPlace();
184 void setIdentity(){*
this = Identity();}
185 Self& operator*=(
const Self& other);
188 Scalar data_[Row][Col];
194template <
typename _Scalar>
198 data_[0][0], data_[1][0], data_[2][0],
199 data_[0][1], data_[1][1], data_[2][1],
200 data_[0][2], data_[1][2], data_[2][2],
204template <
typename _Scalar>
205A_ALWAYS_INLINE
void MatrixMN<_Scalar, 3, 3>::transposeInPlace()
207 std::swap(data_[0][1], data_[1][0]);
208 std::swap(data_[0][2], data_[2][0]);
209 std::swap(data_[1][2], data_[2][1]);
212template <
typename _Scalar>
213A_ALWAYS_INLINE
typename MatrixMN<_Scalar, 3, 3>::Self &MatrixMN<_Scalar, 3, 3>::operator*=(
const Self &other)
215 using namespace _AST math;
216 *
this = operator*(*
this, other);
224AST_DECL_TYPE_ALIAS(Matrix3d)