24#include "AstMath/MathOperator.hpp"
25#include "AstMath/Vector.hpp"
36template<
typename _Scalar>
41 Matrix(
size_t row,
size_t col);
47 void resize(
size_t row,
size_t col);
49 size_t size()
const{
return row_ * col_;}
50 size_t row()
const{
return row_;}
51 size_t col()
const{
return col_;}
52 _Scalar* data()
const{
return data_;}
53 _Scalar& operator()(
size_t row,
size_t col){
return data_[row * col_ + col];}
54 _Scalar operator()(
size_t row,
size_t col)
const{
return data_[row * col_ + col];}
63template <
typename _Scalar>
70template <
typename _Scalar>
71inline Matrix<_Scalar>::Matrix(
size_t row,
size_t col)
76 data_ = (_Scalar*)malloc(row * col *
sizeof(_Scalar));
80template <
typename _Scalar>
81inline Matrix<_Scalar>::~Matrix()
87template <
typename _Scalar>
88inline Matrix<_Scalar>::Matrix(
const Matrix& other)
94 this->data_ = (_Scalar*)malloc(other.size() * sizeof(_Scalar));
97 memcpy(data_, other.data_, other.size() * sizeof(_Scalar));
109template <
typename _Scalar>
110inline Matrix<_Scalar>& Matrix<_Scalar>::operator=(
const Matrix& other)
113 resize(other.row(), other.col());
115 memcpy(data_, other.data_, other.size() *
sizeof(_Scalar));
121template <
typename _Scalar>
122inline Matrix<_Scalar>::Matrix(Matrix&& other)
125 , data_{other.data()}
129 other.data_ =
nullptr;
132template <
typename _Scalar>
133inline Matrix<_Scalar>& Matrix<_Scalar>::operator=(Matrix&& other)
136 std::swap(row_, other.row_);
137 std::swap(col_, other.col_);
138 std::swap(data_, other.data_);
143template <
typename _Scalar>
144inline void Matrix<_Scalar>::resize(
size_t row,
size_t col)
150 data_ = (_Scalar*)malloc(row * col *
sizeof(_Scalar));
154template <
typename _Scalar>
155inline void Matrix<_Scalar>::setZero()
158 memset(data_, 0, size() *
sizeof(_Scalar));
162template<
typename _Scalar,
size_t Row,
size_t Col>
167 typedef _Scalar Scalar;
169 constexpr size_t size()
const{
return Row*Col;}
170 constexpr size_t row()
const{
return Row;}
171 constexpr size_t col()
const{
return Col;}
172 constexpr Scalar* data()
const{
return (Scalar*)
this;}
173 Scalar operator[](
size_t idx)
const{
return data()[idx];}
174 Scalar operator()(
size_t idx)
const {
return data()[idx]; }
175 Scalar& operator()(
size_t idx) {
return data()[idx]; }
176 Scalar operator()(
size_t row,
size_t col)
const {
return data_[row][col]; }
177 Scalar& operator()(
size_t row,
size_t col) {
return data_[row][col]; }
180 Scalar data_[Row][Col];
184template<
typename _Scalar>
188 enum {Row = 3, Col = 3};
190 typedef _Scalar Scalar;
191 static Self Identity(){
return Self{1,0,0,0,1,0,0,0,1};}
192 static Self Zero(){
return Self{0,0,0,0,0,0,0,0,0};}
194 constexpr size_t size()
const{
return Row*Col;}
195 constexpr size_t row()
const{
return Row;}
196 constexpr size_t col()
const{
return Col;}
197 constexpr Scalar* data()
const{
return (Scalar*)
this;}
198 Scalar operator[](
size_t idx)
const{
return data()[idx];}
199 Scalar operator()(
size_t idx)
const {
return data()[idx]; }
200 Scalar& operator()(
size_t idx) {
return data()[idx]; }
201 Scalar operator()(
size_t row,
size_t col)
const {
return data_[row][col]; }
202 Scalar& operator()(
size_t row,
size_t col) {
return data_[row][col]; }
204 Self transpose()
const;
205 void transposeInPlace();
206 void setIdentity(){*
this = Identity();}
207 Self& operator*=(
const Self& other);
210 Scalar data_[Row][Col];
216template <
typename _Scalar>
220 data_[0][0], data_[1][0], data_[2][0],
221 data_[0][1], data_[1][1], data_[2][1],
222 data_[0][2], data_[1][2], data_[2][2],
226template <
typename _Scalar>
227A_ALWAYS_INLINE
void MatrixMN<_Scalar, 3, 3>::transposeInPlace()
229 std::swap(data_[0][1], data_[1][0]);
230 std::swap(data_[0][2], data_[2][0]);
231 std::swap(data_[1][2], data_[2][1]);
234template <
typename _Scalar>
235A_ALWAYS_INLINE
typename MatrixMN<_Scalar, 3, 3>::Self &MatrixMN<_Scalar, 3, 3>::operator*=(
const Self &other)
237 using namespace _AST math;
238 *
this = operator*(*
this, other);
246AST_DECL_TYPE_ALIAS(Matrix3d)