more efficient handling of aliasing
This commit is contained in:
@@ -27,6 +27,9 @@ struct op_diagmat
|
||||
template<typename T1>
|
||||
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagmat>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagmat>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply(Mat<typename T1::elem_type>& out, const Proxy<T1>& P);
|
||||
|
||||
@@ -48,6 +51,9 @@ struct op_diagmat2
|
||||
template<typename T1>
|
||||
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagmat2>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagmat2>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset);
|
||||
};
|
||||
|
||||
@@ -104,6 +104,20 @@ op_diagmat::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagmat>& X)
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
op_diagmat::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagmat>& X)
|
||||
{
|
||||
arma_debug_sigprint();
|
||||
|
||||
const Proxy<T1> P(X.m);
|
||||
|
||||
op_diagmat::apply(out, P);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
@@ -701,6 +715,23 @@ op_diagmat2::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagmat2>&
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
op_diagmat2::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagmat2>& X)
|
||||
{
|
||||
arma_debug_sigprint();
|
||||
|
||||
const uword row_offset = X.aux_uword_a;
|
||||
const uword col_offset = X.aux_uword_b;
|
||||
|
||||
const Proxy<T1> P(X.m);
|
||||
|
||||
op_diagmat2::apply(out, P, row_offset, col_offset);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
|
||||
@@ -27,6 +27,9 @@ struct op_diagvec
|
||||
template<typename T1>
|
||||
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagvec>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagvec>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P);
|
||||
|
||||
@@ -45,6 +48,9 @@ struct op_diagvec2
|
||||
template<typename T1>
|
||||
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagvec2>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagvec2>& X);
|
||||
|
||||
template<typename T1>
|
||||
inline static void apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset);
|
||||
};
|
||||
|
||||
@@ -48,6 +48,20 @@ op_diagvec::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagvec>& X)
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
op_diagvec::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagvec>& X)
|
||||
{
|
||||
arma_debug_sigprint();
|
||||
|
||||
const Proxy<T1> P(X.m);
|
||||
|
||||
op_diagvec::apply_proxy(out, P);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
@@ -491,6 +505,26 @@ op_diagvec2::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagvec2>&
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
op_diagvec2::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagvec2>& X)
|
||||
{
|
||||
arma_debug_sigprint();
|
||||
|
||||
const uword a = X.aux_uword_a;
|
||||
const uword b = X.aux_uword_b;
|
||||
|
||||
const uword row_offset = (b > 0) ? a : 0;
|
||||
const uword col_offset = (b == 0) ? a : 0;
|
||||
|
||||
const Proxy<T1> P(X.m);
|
||||
|
||||
op_diagvec2::apply_proxy(out, P, row_offset, col_offset);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename T1>
|
||||
inline
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user