Mathter
A configurable 3D math library for game developers.
Namespaces | Macros | Functions
MatrixArithmetic.hpp File Reference
#include "MatrixImpl.hpp"

Go to the source code of this file.

Namespaces

 mathter
 

Macros

#define MATHTER_MATMUL_EXPAND(...)   __VA_ARGS__
 
#define MATHTER_MATMUL_RR_FACTOR(X, Y)   rhs.stripes[X] * lhs(Y, X)
 
#define MATHTER_MATMUL_RR_STRIPE_1(Y)   MATHTER_MATMUL_RR_FACTOR(0, Y)
 
#define MATHTER_MATMUL_RR_STRIPE_2(Y)   MATHTER_MATMUL_RR_STRIPE_1(Y) + MATHTER_MATMUL_RR_FACTOR(1, Y)
 
#define MATHTER_MATMUL_RR_STRIPE_3(Y)   MATHTER_MATMUL_RR_STRIPE_2(Y) + MATHTER_MATMUL_RR_FACTOR(2, Y)
 
#define MATHTER_MATMUL_RR_STRIPE_4(Y)   MATHTER_MATMUL_RR_STRIPE_3(Y) + MATHTER_MATMUL_RR_FACTOR(3, Y)
 
#define MATHTER_MATMUL_RR_STRIPE(CX, Y)
 
#define MATHTER_MATMUL_RR_ARRAY_1(CX)   result.stripes[0] = MATHTER_MATMUL_RR_STRIPE(CX, 0);
 
#define MATHTER_MATMUL_RR_ARRAY_2(CX)
 
#define MATHTER_MATMUL_RR_ARRAY_3(CX)
 
#define MATHTER_MATMUL_RR_ARRAY_4(CX)
 
#define MATHTER_MATMUL_RR_ARRAY(CX, CY)
 
#define MATHTER_MATMUL_RR_UNROLL(MATCH, ROWS1)
 
#define MATHTER_MATMUL_CC_FACTOR(X, Y)   lhs.stripes[Y] * rhs(Y, X)
 
#define MATHTER_MATMUL_CC_STRIPE_1(X)   MATHTER_MATMUL_CC_FACTOR(X, 0)
 
#define MATHTER_MATMUL_CC_STRIPE_2(X)   MATHTER_MATMUL_CC_STRIPE_1(X) + MATHTER_MATMUL_CC_FACTOR(X, 1)
 
#define MATHTER_MATMUL_CC_STRIPE_3(X)   MATHTER_MATMUL_CC_STRIPE_2(X) + MATHTER_MATMUL_CC_FACTOR(X, 2)
 
#define MATHTER_MATMUL_CC_STRIPE_4(X)   MATHTER_MATMUL_CC_STRIPE_3(X) + MATHTER_MATMUL_CC_FACTOR(X, 3)
 
#define MATHTER_MATMUL_CC_STRIPE(CY, X)
 
#define MATHTER_MATMUL_CC_ARRAY_1(CY)   result.stripes[0] = MATHTER_MATMUL_CC_STRIPE(CY, 0);
 
#define MATHTER_MATMUL_CC_ARRAY_2(CY)
 
#define MATHTER_MATMUL_CC_ARRAY_3(CY)
 
#define MATHTER_MATMUL_CC_ARRAY_4(CY)
 
#define MATHTER_MATMUL_CC_ARRAY(CX, CY)
 
#define MATHTER_MATMUL_CC_UNROLL(COLUMNS2, MATCH)
 
#define MATHTER_MATADD_SAME_ARRAY_1(OP)   result.stripes[0] = lhs.stripes[0] OP rhs.stripes[0];
 
#define MATHTER_MATADD_SAME_ARRAY_2(OP)
 
#define MATHTER_MATADD_SAME_ARRAY_3(OP)
 
#define MATHTER_MATADD_SAME_ARRAY_4(OP)
 
#define MATHTER_MATADD_SAME_UNROLL(S, OP)
 

Functions

template<class T , class U , int Rows1, int Match, int Columns2, eMatrixOrder Order1, eMatrixOrder Order2, bool Packed, class V >
auto mathter::operator* (const Matrix< T, Rows1, Match, Order1, eMatrixLayout::ROW_MAJOR, Packed > &lhs, const Matrix< U, Match, Columns2, Order2, eMatrixLayout::ROW_MAJOR, Packed > &rhs) -> Matrix< V, Rows1, Columns2, Order1, eMatrixLayout::ROW_MAJOR, Packed >
 
template<class T , class U , int Rows1, int Match, int Columns2, eMatrixOrder Order1, eMatrixOrder Order2, bool Packed, class V >
auto mathter::operator* (const Matrix< T, Rows1, Match, Order1, eMatrixLayout::ROW_MAJOR, Packed > &lhs, const Matrix< U, Match, Columns2, Order2, eMatrixLayout::COLUMN_MAJOR, Packed > &rhs) -> Matrix< V, Rows1, Columns2, Order1, eMatrixLayout::ROW_MAJOR, Packed >
 
template<class T , class U , int Rows1, int Match, int Columns2, eMatrixOrder Order1, eMatrixOrder Order2, bool Packed, class V >
auto mathter::operator* (const Matrix< T, Rows1, Match, Order1, eMatrixLayout::COLUMN_MAJOR, Packed > &lhs, const Matrix< U, Match, Columns2, Order2, eMatrixLayout::COLUMN_MAJOR, Packed > &rhs) -> Matrix< V, Rows1, Columns2, Order1, eMatrixLayout::COLUMN_MAJOR, Packed >
 
template<class T , class U , int Rows1, int Match, int Columns2, eMatrixOrder Order1, eMatrixOrder Order2, bool Packed, class V >
auto mathter::operator* (const Matrix< T, Rows1, Match, Order1, eMatrixLayout::COLUMN_MAJOR, Packed > &lhs, const Matrix< U, Match, Columns2, Order2, eMatrixLayout::ROW_MAJOR, Packed > &rhs) -> Matrix< V, Rows1, Columns2, Order1, eMatrixLayout::COLUMN_MAJOR, Packed >
 
template<class T1 , class T2 , int Rows1, int Match, int Columns2, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout Layout1, eMatrixLayout Layout2, bool PackedA>
auto mathter::operator* (const Matrix< T1, Rows1, Match, Order1, Layout1, PackedA > &lhs, const Matrix< T2, Match, Columns2, Order2, Layout2, PackedA > &rhs) -> Matrix< traits::MatMulElemT< T1, T2 >, Rows1, Columns2, Order1, Layout1, PackedA >
 
template<class T1 , class T2 , int Dim, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout Layout1, eMatrixLayout Layout2, bool Packed>
Matrix< T1, Dim, Dim, Order1, Layout1, Packed > & mathter::operator*= (Matrix< T1, Dim, Dim, Order1, Layout1, Packed > &lhs, const Matrix< T2, Dim, Dim, Order2, Layout2, Packed > &rhs)
 
template<class T , class U , int Rows, int Columns, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout SameLayout, bool Packed, class V = decltype(T() + U())>
Matrix< U, Rows, Columns, Order1, SameLayout, Packed > mathter::operator+ (const Matrix< T, Rows, Columns, Order1, SameLayout, Packed > &lhs, const Matrix< U, Rows, Columns, Order2, SameLayout, Packed > &rhs)
 
template<class T , class U , int Rows, int Columns, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout SameLayout, bool Packed, class V = decltype(T() - U())>
Matrix< U, Rows, Columns, Order1, SameLayout, Packed > mathter::operator- (const Matrix< T, Rows, Columns, Order1, SameLayout, Packed > &lhs, const Matrix< U, Rows, Columns, Order2, SameLayout, Packed > &rhs)
 
template<class T , class U , int Rows, int Columns, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout Layout1, eMatrixLayout Layout2, bool Packed, class V , class = typename std::enable_if<Layout1 != Layout2>::type>
Matrix< U, Rows, Columns, Order1, Layout1, Packed > mathter::operator+ (const Matrix< T, Rows, Columns, Order1, Layout1, Packed > &lhs, const Matrix< U, Rows, Columns, Order2, Layout2, Packed > &rhs)
 
template<class T , class U , int Rows, int Columns, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout Layout1, eMatrixLayout Layout2, bool Packed, class V , class = typename std::enable_if<Layout1 != Layout2>::type>
Matrix< U, Rows, Columns, Order1, Layout1, Packed > mathter::operator- (const Matrix< T, Rows, Columns, Order1, Layout1, Packed > &lhs, const Matrix< U, Rows, Columns, Order2, Layout2, Packed > &rhs)
 
template<class T , class U , int Rows, int Columns, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout Layout1, eMatrixLayout Layout2, bool Packed, class V >
Matrix< U, Rows, Columns, Order1, Layout1, Packed > & mathter::operator+= (Matrix< T, Rows, Columns, Order1, Layout1, Packed > &lhs, const Matrix< U, Rows, Columns, Order2, Layout2, Packed > &rhs)
 Performs matrix addition and stores result in this. More...
 
template<class T , class U , int Rows, int Columns, eMatrixOrder Order1, eMatrixOrder Order2, eMatrixLayout Layout1, eMatrixLayout Layout2, bool Packed, class V >
Matrix< U, Rows, Columns, Order1, Layout1, Packed > & mathter::operator-= (Matrix< T, Rows, Columns, Order1, Layout1, Packed > &lhs, const Matrix< U, Rows, Columns, Order2, Layout2, Packed > &rhs)
 Performs matrix subtraction and stores result in this. More...
 
template<class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > & mathter::operator*= (Matrix< T, Rows, Columns, Order, Layout, Packed > &mat, T s)
 Multiplies all elements of the matrix by scalar. More...
 
template<class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > & mathter::operator/= (Matrix< T, Rows, Columns, Order, Layout, Packed > &mat, T s)
 Divides all elements of the matrix by scalar. More...
 
template<class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > mathter::operator* (T s, const Matrix< T, Rows, Columns, Order, Layout, Packed > &mat)
 
template<class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > mathter::operator/ (T s, const Matrix< T, Rows, Columns, Order, Layout, Packed > &mat)
 
template<class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > mathter::operator* (const Matrix< T, Rows, Columns, Order, Layout, Packed > &mat, T s)
 
template<class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > mathter::operator/ (const Matrix< T, Rows, Columns, Order, Layout, Packed > &mat, T s)
 
template<class T , class T2 , int Rows, int Columns, eMatrixOrder Order, eMatrixOrder Order2, eMatrixLayout Layout, bool Packed>
auto mathter::MulElementwise (const Matrix< T, Rows, Columns, Order, Layout, Packed > &lhs, const Matrix< T2, Rows, Columns, Order2, Layout, Packed > &rhs)
 
template<class T , class T2 , int Rows, int Columns, eMatrixOrder Order, eMatrixOrder Order2, eMatrixLayout Layout, bool Packed>
auto mathter::MulElementwise (const Matrix< T, Rows, Columns, Order, Layout, Packed > &lhs, const Matrix< T2, Rows, Columns, Order2, traits::OppositeLayout< Layout >::value, Packed > &rhs)
 
template<class T , class T2 , int Rows, int Columns, eMatrixOrder Order, eMatrixOrder Order2, eMatrixLayout Layout, bool Packed>
auto mathter::DivElementwise (const Matrix< T, Rows, Columns, Order, Layout, Packed > &lhs, const Matrix< T2, Rows, Columns, Order2, Layout, Packed > &rhs)
 
template<class T , class T2 , int Rows, int Columns, eMatrixOrder Order, eMatrixOrder Order2, eMatrixLayout Layout, bool Packed>
auto mathter::DivElementwise (const Matrix< T, Rows, Columns, Order, Layout, Packed > &lhs, const Matrix< T2, Rows, Columns, Order2, traits::OppositeLayout< Layout >::value, Packed > &rhs)
 
template<class U , class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > mathter::operator+ (const Matrix< T, Rows, Columns, Order, Layout, Packed > &mat)
 
template<class U , class T , int Rows, int Columns, eMatrixOrder Order, eMatrixLayout Layout, bool Packed>
Matrix< T, Rows, Columns, Order, Layout, Packed > mathter::operator- (const Matrix< T, Rows, Columns, Order, Layout, Packed > &mat)
 

Macro Definition Documentation

◆ MATHTER_MATADD_SAME_ARRAY_1

#define MATHTER_MATADD_SAME_ARRAY_1 (   OP)    result.stripes[0] = lhs.stripes[0] OP rhs.stripes[0];

◆ MATHTER_MATADD_SAME_ARRAY_2

#define MATHTER_MATADD_SAME_ARRAY_2 (   OP)
Value:
result.stripes[1] = lhs.stripes[1] OP rhs.stripes[1];
#define MATHTER_MATADD_SAME_ARRAY_1(OP)
Definition: MatrixArithmetic.hpp:203

◆ MATHTER_MATADD_SAME_ARRAY_3

#define MATHTER_MATADD_SAME_ARRAY_3 (   OP)
Value:
result.stripes[2] = lhs.stripes[2] OP rhs.stripes[2];
#define MATHTER_MATADD_SAME_ARRAY_2(OP)
Definition: MatrixArithmetic.hpp:204

◆ MATHTER_MATADD_SAME_ARRAY_4

#define MATHTER_MATADD_SAME_ARRAY_4 (   OP)
Value:
result.stripes[3] = lhs.stripes[3] OP rhs.stripes[3];
#define MATHTER_MATADD_SAME_ARRAY_3(OP)
Definition: MatrixArithmetic.hpp:207

◆ MATHTER_MATADD_SAME_UNROLL

#define MATHTER_MATADD_SAME_UNROLL (   S,
  OP 
)
Value:
if (result.StripeCount == S) { \
MATHTER_MATMUL_EXPAND(MATHTER_MATADD_SAME_ARRAY_##S) \
(OP) return result; \
}

◆ MATHTER_MATMUL_CC_ARRAY

#define MATHTER_MATMUL_CC_ARRAY (   CX,
  CY 
)
Value:
MATHTER_MATMUL_EXPAND(MATHTER_MATMUL_CC_ARRAY_##CX) \
(CY)
#define MATHTER_MATMUL_EXPAND(...)
Definition: MatrixArithmetic.hpp:10

◆ MATHTER_MATMUL_CC_ARRAY_1

#define MATHTER_MATMUL_CC_ARRAY_1 (   CY)    result.stripes[0] = MATHTER_MATMUL_CC_STRIPE(CY, 0);

◆ MATHTER_MATMUL_CC_ARRAY_2

#define MATHTER_MATMUL_CC_ARRAY_2 (   CY)
Value:
result.stripes[1] = MATHTER_MATMUL_CC_STRIPE(CY, 1);
#define MATHTER_MATMUL_CC_STRIPE(CY, X)
Definition: MatrixArithmetic.hpp:50
#define MATHTER_MATMUL_CC_ARRAY_1(CY)
Definition: MatrixArithmetic.hpp:54

◆ MATHTER_MATMUL_CC_ARRAY_3

#define MATHTER_MATMUL_CC_ARRAY_3 (   CY)
Value:
result.stripes[2] = MATHTER_MATMUL_CC_STRIPE(CY, 2);
#define MATHTER_MATMUL_CC_STRIPE(CY, X)
Definition: MatrixArithmetic.hpp:50
#define MATHTER_MATMUL_CC_ARRAY_2(CY)
Definition: MatrixArithmetic.hpp:55

◆ MATHTER_MATMUL_CC_ARRAY_4

#define MATHTER_MATMUL_CC_ARRAY_4 (   CY)
Value:
result.stripes[3] = MATHTER_MATMUL_CC_STRIPE(CY, 3);
#define MATHTER_MATMUL_CC_STRIPE(CY, X)
Definition: MatrixArithmetic.hpp:50
#define MATHTER_MATMUL_CC_ARRAY_3(CY)
Definition: MatrixArithmetic.hpp:58

◆ MATHTER_MATMUL_CC_FACTOR

#define MATHTER_MATMUL_CC_FACTOR (   X,
 
)    lhs.stripes[Y] * rhs(Y, X)

◆ MATHTER_MATMUL_CC_STRIPE

#define MATHTER_MATMUL_CC_STRIPE (   CY,
 
)
Value:
MATHTER_MATMUL_EXPAND(MATHTER_MATMUL_CC_STRIPE_##CY) \
(X)
#define MATHTER_MATMUL_EXPAND(...)
Definition: MatrixArithmetic.hpp:10

◆ MATHTER_MATMUL_CC_STRIPE_1

#define MATHTER_MATMUL_CC_STRIPE_1 (   X)    MATHTER_MATMUL_CC_FACTOR(X, 0)

◆ MATHTER_MATMUL_CC_STRIPE_2

#define MATHTER_MATMUL_CC_STRIPE_2 (   X)    MATHTER_MATMUL_CC_STRIPE_1(X) + MATHTER_MATMUL_CC_FACTOR(X, 1)

◆ MATHTER_MATMUL_CC_STRIPE_3

#define MATHTER_MATMUL_CC_STRIPE_3 (   X)    MATHTER_MATMUL_CC_STRIPE_2(X) + MATHTER_MATMUL_CC_FACTOR(X, 2)

◆ MATHTER_MATMUL_CC_STRIPE_4

#define MATHTER_MATMUL_CC_STRIPE_4 (   X)    MATHTER_MATMUL_CC_STRIPE_3(X) + MATHTER_MATMUL_CC_FACTOR(X, 3)

◆ MATHTER_MATMUL_CC_UNROLL

#define MATHTER_MATMUL_CC_UNROLL (   COLUMNS2,
  MATCH 
)
Value:
if (Columns2 == COLUMNS2 && Match == MATCH) { \
MATHTER_MATMUL_CC_ARRAY(COLUMNS2, MATCH) \
return result; \
}

◆ MATHTER_MATMUL_EXPAND

#define MATHTER_MATMUL_EXPAND (   ...)    __VA_ARGS__

◆ MATHTER_MATMUL_RR_ARRAY

#define MATHTER_MATMUL_RR_ARRAY (   CX,
  CY 
)
Value:
MATHTER_MATMUL_EXPAND(MATHTER_MATMUL_RR_ARRAY_##CY) \
(CX)
#define MATHTER_MATMUL_EXPAND(...)
Definition: MatrixArithmetic.hpp:10

◆ MATHTER_MATMUL_RR_ARRAY_1

#define MATHTER_MATMUL_RR_ARRAY_1 (   CX)    result.stripes[0] = MATHTER_MATMUL_RR_STRIPE(CX, 0);

◆ MATHTER_MATMUL_RR_ARRAY_2

#define MATHTER_MATMUL_RR_ARRAY_2 (   CX)
Value:
result.stripes[1] = MATHTER_MATMUL_RR_STRIPE(CX, 1);
#define MATHTER_MATMUL_RR_STRIPE(CX, Y)
Definition: MatrixArithmetic.hpp:18
#define MATHTER_MATMUL_RR_ARRAY_1(CX)
Definition: MatrixArithmetic.hpp:22

◆ MATHTER_MATMUL_RR_ARRAY_3

#define MATHTER_MATMUL_RR_ARRAY_3 (   CX)
Value:
result.stripes[2] = MATHTER_MATMUL_RR_STRIPE(CX, 2);
#define MATHTER_MATMUL_RR_ARRAY_2(CX)
Definition: MatrixArithmetic.hpp:23
#define MATHTER_MATMUL_RR_STRIPE(CX, Y)
Definition: MatrixArithmetic.hpp:18

◆ MATHTER_MATMUL_RR_ARRAY_4

#define MATHTER_MATMUL_RR_ARRAY_4 (   CX)
Value:
result.stripes[3] = MATHTER_MATMUL_RR_STRIPE(CX, 3);
#define MATHTER_MATMUL_RR_ARRAY_3(CX)
Definition: MatrixArithmetic.hpp:26
#define MATHTER_MATMUL_RR_STRIPE(CX, Y)
Definition: MatrixArithmetic.hpp:18

◆ MATHTER_MATMUL_RR_FACTOR

#define MATHTER_MATMUL_RR_FACTOR (   X,
 
)    rhs.stripes[X] * lhs(Y, X)

◆ MATHTER_MATMUL_RR_STRIPE

#define MATHTER_MATMUL_RR_STRIPE (   CX,
 
)
Value:
MATHTER_MATMUL_EXPAND(MATHTER_MATMUL_RR_STRIPE_##CX) \
(Y)
#define MATHTER_MATMUL_EXPAND(...)
Definition: MatrixArithmetic.hpp:10

◆ MATHTER_MATMUL_RR_STRIPE_1

#define MATHTER_MATMUL_RR_STRIPE_1 (   Y)    MATHTER_MATMUL_RR_FACTOR(0, Y)

◆ MATHTER_MATMUL_RR_STRIPE_2

#define MATHTER_MATMUL_RR_STRIPE_2 (   Y)    MATHTER_MATMUL_RR_STRIPE_1(Y) + MATHTER_MATMUL_RR_FACTOR(1, Y)

◆ MATHTER_MATMUL_RR_STRIPE_3

#define MATHTER_MATMUL_RR_STRIPE_3 (   Y)    MATHTER_MATMUL_RR_STRIPE_2(Y) + MATHTER_MATMUL_RR_FACTOR(2, Y)

◆ MATHTER_MATMUL_RR_STRIPE_4

#define MATHTER_MATMUL_RR_STRIPE_4 (   Y)    MATHTER_MATMUL_RR_STRIPE_3(Y) + MATHTER_MATMUL_RR_FACTOR(3, Y)

◆ MATHTER_MATMUL_RR_UNROLL

#define MATHTER_MATMUL_RR_UNROLL (   MATCH,
  ROWS1 
)
Value:
if (Rows1 == ROWS1 && Match == MATCH) { \
MATHTER_MATMUL_RR_ARRAY(MATCH, ROWS1) \
return result; \
}