diff --git a/include/armadillo_bits/Col_meat.hpp b/include/armadillo_bits/Col_meat.hpp index 942541a0..6b318c00 100644 --- a/include/armadillo_bits/Col_meat.hpp +++ b/include/armadillo_bits/Col_meat.hpp @@ -483,7 +483,7 @@ Col::operator=(Col&& X) // if(X.n_cols != 1) { const Mat& XX = X; Mat::operator=(XX); return *this; } // // (*this).steal_mem(X, true); -// +// // return *this; // } @@ -521,11 +521,9 @@ template template inline Col::Col(const Base& X) - : Mat(arma_vec_indicator(), 1) + : Mat(X.get_ref(), arma_vec_indicator(), 1) { - arma_debug_sigprint(); - - Mat::operator=(X.get_ref()); + arma_debug_sigprint_this(this); } @@ -549,11 +547,9 @@ template template inline Col::Col(const SpBase& X) - : Mat(arma_vec_indicator(), 1) + : Mat(X.get_ref(), arma_vec_indicator(), 1) { arma_debug_sigprint_this(this); - - Mat::operator=(X.get_ref()); } @@ -607,12 +603,9 @@ Col::Col const Base::pod_type, T1>& A, const Base::pod_type, T2>& B ) + : Mat(A.get_ref(), B.get_ref(), arma_vec_indicator(), 1) { - arma_debug_sigprint(); - - access::rw(Mat::vec_state) = 1; - - Mat::init(A,B); + arma_debug_sigprint_this(this); } @@ -621,12 +614,9 @@ template template inline Col::Col(const BaseCube& X) + : Mat(X.get_ref(), arma_vec_indicator(), 1) { - arma_debug_sigprint(); - - access::rw(Mat::vec_state) = 1; - - Mat::operator=(X); + arma_debug_sigprint_this(this); } @@ -649,12 +639,9 @@ Col::operator=(const BaseCube& X) template inline Col::Col(const subview_cube& X) + : Mat(X, arma_vec_indicator(), 1) { - arma_debug_sigprint(); - - access::rw(Mat::vec_state) = 1; - - Mat::operator=(X); + arma_debug_sigprint_this(this); } diff --git a/include/armadillo_bits/Mat_bones.hpp b/include/armadillo_bits/Mat_bones.hpp index d0673160..a0e71c9f 100644 --- a/include/armadillo_bits/Mat_bones.hpp +++ b/include/armadillo_bits/Mat_bones.hpp @@ -99,6 +99,7 @@ class Mat : public Base< eT, Mat > inline Mat& operator*=(const eT val); inline Mat& operator/=(const eT val); + inline Mat(const Mat& m, const arma_vec_indicator&, const uhword in_vec_state); inline Mat(const Mat& m); inline Mat& operator= (const Mat& m); inline Mat& operator+=(const Mat& m); @@ -107,6 +108,7 @@ class Mat : public Base< eT, Mat > inline Mat& operator%=(const Mat& m); inline Mat& operator/=(const Mat& m); + template inline Mat(const BaseCube& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const BaseCube& X); template inline Mat& operator= (const BaseCube& X); template inline Mat& operator+=(const BaseCube& X); @@ -115,11 +117,12 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const BaseCube& X); template inline Mat& operator/=(const BaseCube& X); - template - inline explicit Mat(const Base& A, const Base& B); + template inline explicit Mat(const Base& A, const Base& B, const arma_vec_indicator&, const uhword in_vec_state); + template inline explicit Mat(const Base& A, const Base& B); inline explicit Mat(const subview& X, const bool use_colmem); // only to be used by the quasi_unwrap class + inline Mat(const subview& X, const arma_vec_indicator&, const uhword in_vec_state); inline Mat(const subview& X); inline Mat& operator= (const subview& X); inline Mat& operator+=(const subview& X); @@ -135,6 +138,7 @@ class Mat : public Base< eT, Mat > template inline Mat(const xtrans_mat& X); // xtrans_mat can only be generated by the Proxy class + inline Mat(const subview_cube& X, const arma_vec_indicator&, const uhword in_vec_state); inline Mat(const subview_cube& X); inline Mat& operator= (const subview_cube& X); inline Mat& operator+=(const subview_cube& X); @@ -143,6 +147,7 @@ class Mat : public Base< eT, Mat > inline Mat& operator%=(const subview_cube& X); inline Mat& operator/=(const subview_cube& X); + inline Mat(const diagview& X, const arma_vec_indicator&, const uhword in_vec_state); inline Mat(const diagview& X); inline Mat& operator= (const diagview& X); inline Mat& operator+=(const diagview& X); @@ -151,6 +156,7 @@ class Mat : public Base< eT, Mat > inline Mat& operator%=(const diagview& X); inline Mat& operator/=(const diagview& X); + template inline Mat(const subview_elem1& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const subview_elem1& X); template inline Mat& operator= (const subview_elem1& X); template inline Mat& operator+=(const subview_elem1& X); @@ -159,6 +165,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const subview_elem1& X); template inline Mat& operator/=(const subview_elem1& X); + template inline Mat(const subview_elem2& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const subview_elem2& X); template inline Mat& operator= (const subview_elem2& X); template inline Mat& operator+=(const subview_elem2& X); @@ -168,6 +175,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator/=(const subview_elem2& X); // Operators on sparse matrices (and subviews) + template inline explicit Mat(const SpBase& m, const arma_vec_indicator&, const uhword in_vec_state); template inline explicit Mat(const SpBase& m); template inline Mat& operator= (const SpBase& m); template inline Mat& operator+=(const SpBase& m); @@ -176,11 +184,13 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const SpBase& m); template inline Mat& operator/=(const SpBase& m); + inline explicit Mat(const SpSubview& X, const arma_vec_indicator&, const uhword in_vec_state); inline explicit Mat(const SpSubview& X); inline Mat& operator= (const SpSubview& X); inline Mat& operator+=(const SpSubview& X); inline Mat& operator-=(const SpSubview& X); + inline explicit Mat(const spdiagview& X, const arma_vec_indicator&, const uhword in_vec_state); inline explicit Mat(const spdiagview& X); inline Mat& operator= (const spdiagview& X); inline Mat& operator+=(const spdiagview& X); @@ -320,6 +330,7 @@ class Mat : public Base< eT, Mat > template inline void insert_cols(const uword col_num, const Base& X); + template inline Mat(const Gen& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const Gen& X); template inline Mat& operator= (const Gen& X); template inline Mat& operator+=(const Gen& X); @@ -328,6 +339,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const Gen& X); template inline Mat& operator/=(const Gen& X); + template inline Mat(const Op& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const Op& X); template inline Mat& operator= (const Op& X); template inline Mat& operator+=(const Op& X); @@ -336,6 +348,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const Op& X); template inline Mat& operator/=(const Op& X); + template inline Mat(const eOp& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const eOp& X); template inline Mat& operator= (const eOp& X); template inline Mat& operator+=(const eOp& X); @@ -344,6 +357,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const eOp& X); template inline Mat& operator/=(const eOp& X); + template inline Mat(const mtOp& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const mtOp& X); template inline Mat& operator= (const mtOp& X); template inline Mat& operator+=(const mtOp& X); @@ -352,6 +366,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const mtOp& X); template inline Mat& operator/=(const mtOp& X); + template inline Mat(const CubeToMatOp& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const CubeToMatOp& X); template inline Mat& operator= (const CubeToMatOp& X); template inline Mat& operator+=(const CubeToMatOp& X); @@ -360,6 +375,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const CubeToMatOp& X); template inline Mat& operator/=(const CubeToMatOp& X); + template inline Mat(const SpToDOp& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const SpToDOp& X); template inline Mat& operator= (const SpToDOp& X); template inline Mat& operator+=(const SpToDOp& X); @@ -368,6 +384,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const SpToDOp& X); template inline Mat& operator/=(const SpToDOp& X); + template inline explicit Mat(const mtSpReduceOp& X, const arma_vec_indicator&, const uhword in_vec_state); template inline explicit Mat(const mtSpReduceOp& X); template inline Mat& operator= (const mtSpReduceOp& X); template inline Mat& operator+=(const mtSpReduceOp& X); @@ -376,6 +393,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const mtSpReduceOp& X); template inline Mat& operator/=(const mtSpReduceOp& X); + template inline Mat(const Glue& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const Glue& X); template inline Mat& operator= (const Glue& X); template inline Mat& operator+=(const Glue& X); @@ -387,6 +405,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator+=(const Glue& X); template inline Mat& operator-=(const Glue& X); + template inline Mat(const eGlue& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const eGlue& X); template inline Mat& operator= (const eGlue& X); template inline Mat& operator+=(const eGlue& X); @@ -395,6 +414,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const eGlue& X); template inline Mat& operator/=(const eGlue& X); + template inline Mat(const mtGlue& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const mtGlue& X); template inline Mat& operator= (const mtGlue& X); template inline Mat& operator+=(const mtGlue& X); @@ -403,6 +423,7 @@ class Mat : public Base< eT, Mat > template inline Mat& operator%=(const mtGlue& X); template inline Mat& operator/=(const mtGlue& X); + template inline Mat(const SpToDGlue& X, const arma_vec_indicator&, const uhword in_vec_state); template inline Mat(const SpToDGlue& X); template inline Mat& operator= (const SpToDGlue& X); template inline Mat& operator+=(const SpToDGlue& X); diff --git a/include/armadillo_bits/Mat_meat.hpp b/include/armadillo_bits/Mat_meat.hpp index 42e1736d..41da8bc7 100644 --- a/include/armadillo_bits/Mat_meat.hpp +++ b/include/armadillo_bits/Mat_meat.hpp @@ -880,7 +880,26 @@ Mat::operator/=(const eT val) -//! construct a matrix from a given matrix +template +inline +Mat::Mat(const Mat& in_mat, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint(arma_str::format("this: %x; in_mat: %x") % this % &in_mat); + + init_cold(); + + arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem ); + } + + + template inline Mat::Mat(const Mat& in_mat) @@ -901,7 +920,6 @@ Mat::Mat(const Mat& in_mat) -//! construct a matrix from a given matrix template inline Mat& @@ -1496,6 +1514,25 @@ Mat::operator/=(const Mat& m) +template +template +inline +Mat::Mat(const BaseCube& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + (*this).operator=(X); + } + + + template template inline @@ -1943,15 +1980,30 @@ Mat::operator/=(const BaseCube& X) +template +template +inline +Mat::Mat(const Base::pod_type,T1>& A, const Base::pod_type,T2>& B, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + init(A,B); + } + + + //! for constructing a complex matrix out of two non-complex matrices template template inline -Mat::Mat - ( - const Base::pod_type,T1>& A, - const Base::pod_type,T2>& B - ) +Mat::Mat(const Base::pod_type,T1>& A, const Base::pod_type,T2>& B) : n_rows(0) , n_cols(0) , n_elem(0) @@ -1994,6 +2046,26 @@ Mat::Mat(const subview& X, const bool use_colmem) +template +inline +Mat::Mat(const subview& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + init_warm(X.n_rows, X.n_cols); + + subview::extract(*this, X); + } + + + //! construct a matrix from subview (eg. construct a matrix from a delayed submatrix operation) template inline @@ -2197,6 +2269,24 @@ Mat::Mat(const xtrans_mat& X) +template +inline +Mat::Mat(const subview_cube& x, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + (*this).operator=(x); + } + + + //! construct a matrix from a subview_cube instance template inline @@ -2211,7 +2301,7 @@ Mat::Mat(const subview_cube& x) { arma_debug_sigprint_this(this); - this->operator=(x); + (*this).operator=(x); } @@ -2308,6 +2398,26 @@ Mat::operator/=(const subview_cube& X) +template +inline +Mat::Mat(const diagview& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + init_warm(X.n_rows, X.n_cols); + + diagview::extract(*this, X); + } + + + //! construct a matrix from diagview (eg. construct a matrix from a delayed diag operation) template inline @@ -2432,6 +2542,25 @@ Mat::operator/=(const diagview& X) +template +template +inline +Mat::Mat(const subview_elem1& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + (*this).operator=(X); + } + + + template template inline @@ -2446,7 +2575,7 @@ Mat::Mat(const subview_elem1& X) { arma_debug_sigprint_this(this); - this->operator=(X); + (*this).operator=(X); } @@ -2541,6 +2670,25 @@ Mat::operator/=(const subview_elem1& X) +template +template +inline +Mat::Mat(const subview_elem2& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + (*this).operator=(X); + } + + + template template inline @@ -2555,7 +2703,7 @@ Mat::Mat(const subview_elem2& X) { arma_debug_sigprint_this(this); - this->operator=(X); + (*this).operator=(X); } @@ -2650,6 +2798,25 @@ Mat::operator/=(const subview_elem2& X) +template +template +inline +Mat::Mat(const SpBase& m, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + (*this).operator=(m); + } + + + template template inline @@ -2835,6 +3002,24 @@ Mat::operator/=(const SpBase& m) +template +inline +Mat::Mat(const SpSubview& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + (*this).operator=(X); + } + + + template inline Mat::Mat(const SpSubview& X) @@ -3018,6 +3203,26 @@ Mat::operator-=(const SpSubview& X) +template +inline +Mat::Mat(const spdiagview& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + init_warm(X.n_rows, X.n_cols); + + spdiagview::extract(*this, X); + } + + + template inline Mat::Mat(const spdiagview& X) @@ -4925,6 +5130,29 @@ Mat::insert_cols(const uword col_num, const Base& X) +template +template +inline +Mat::Mat(const Gen& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + + init_warm(X.n_rows, X.n_cols); + + X.apply(*this); + } + + + template template inline @@ -5052,6 +5280,27 @@ Mat::operator/=(const Gen& X) +template +template +inline +Mat::Mat(const Op& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + + op_type::apply(static_cast< Mat_noalias& >(*this), X); + } + + + //! create a matrix from Op, ie. run the previously delayed unary operations template template @@ -5182,6 +5431,37 @@ Mat::operator/=(const Op& X) +template +template +inline +Mat::Mat(const eOp& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + + init_warm(X.get_n_rows(), X.get_n_cols()); + + if(arma_config::optimise_powexpr && is_same_type::value) + { + constexpr bool eT_ok = is_real_or_cx::value; + + if( X.aux == eT(2) ) { eop_square::apply(*this, reinterpret_cast< const eOp& >(X)); return; } + if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply(*this, reinterpret_cast< const eOp& >(X)); return; } + } + + eop_type::apply(*this, X); + } + + + //! create a matrix from eOp, ie. run the previously delayed unary operations template template @@ -5379,6 +5659,25 @@ Mat::operator/=(const eOp& X) +template +template +inline +Mat::Mat(const mtOp& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + op_type::apply(*this, X); + } + + + template template inline @@ -5488,6 +5787,27 @@ Mat::operator/=(const mtOp& X) +template +template +inline +Mat::Mat(const CubeToMatOp& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + + op_type::apply(*this, X); + } + + + template template inline @@ -5501,9 +5821,9 @@ Mat::Mat(const CubeToMatOp& X) , mem() { arma_debug_sigprint_this(this); - + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); - + op_type::apply(*this, X); } @@ -5516,7 +5836,7 @@ Mat& Mat::operator=(const CubeToMatOp& X) { arma_debug_sigprint(); - + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); @@ -5611,6 +5931,27 @@ Mat::operator/=(const CubeToMatOp& X) +template +template +inline +Mat::Mat(const SpToDOp& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + + op_type::apply(*this, X); + } + + + template template inline @@ -5624,9 +5965,9 @@ Mat::Mat(const SpToDOp& X) , mem() { arma_debug_sigprint_this(this); - + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); - + op_type::apply(*this, X); } @@ -5640,7 +5981,7 @@ Mat& Mat::operator=(const SpToDOp& X) { arma_debug_sigprint(); - + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); @@ -5740,6 +6081,25 @@ Mat::operator/=(const SpToDOp& X) +template +template +inline +Mat::Mat(const mtSpReduceOp& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + op_type::apply(*this, X); + } + + + template template inline @@ -5753,7 +6113,7 @@ Mat::Mat(const mtSpReduceOp& X) , mem() { arma_debug_sigprint_this(this); - + op_type::apply(*this, X); } @@ -5766,7 +6126,7 @@ Mat& Mat::operator=(const mtSpReduceOp& X) { arma_debug_sigprint(); - + op_type::apply(*this, X); return *this; @@ -5849,6 +6209,28 @@ Mat::operator/=(const mtSpReduceOp& X) +template +template +inline +Mat::Mat(const Glue& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); + + glue_type::apply(static_cast< Mat_noalias& >(*this), X); + } + + + //! create a matrix from Glue, ie. run the previously delayed binary operations template template @@ -6016,6 +6398,30 @@ Mat::operator-=(const Glue& X) +template +template +inline +Mat::Mat(const eGlue& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); + + init_warm(X.get_n_rows(), X.get_n_cols()); + + eglue_type::apply(*this, X); + } + + + //! create a matrix from eGlue, ie. run the previously delayed binary operations template template @@ -6199,6 +6605,25 @@ Mat::operator/=(const eGlue& X) +template +template +inline +Mat::Mat(const mtGlue& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + glue_type::apply(*this, X); + } + + + template template inline @@ -6310,6 +6735,28 @@ Mat::operator/=(const mtGlue& X) +template +template +inline +Mat::Mat(const SpToDGlue& X, const arma_vec_indicator&, const uhword in_vec_state) + : n_rows( (in_vec_state == 2) ? 1 : 0 ) + , n_cols( (in_vec_state == 1) ? 1 : 0 ) + , n_elem(0) + , n_alloc(0) + , vec_state(in_vec_state) + , mem_state(0) + , mem() + { + arma_debug_sigprint_this(this); + + arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); + arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); + + glue_type::apply(*this, X); + } + + + template template inline diff --git a/include/armadillo_bits/Row_meat.hpp b/include/armadillo_bits/Row_meat.hpp index bfc5950c..012d85ef 100644 --- a/include/armadillo_bits/Row_meat.hpp +++ b/include/armadillo_bits/Row_meat.hpp @@ -521,11 +521,9 @@ template template inline Row::Row(const Base& X) - : Mat(arma_vec_indicator(), 2) + : Mat(X.get_ref(), arma_vec_indicator(), 2) { - arma_debug_sigprint(); - - Mat::operator=(X.get_ref()); + arma_debug_sigprint_this(this); } @@ -549,11 +547,9 @@ template template inline Row::Row(const SpBase& X) - : Mat(arma_vec_indicator(), 2) + : Mat(X.get_ref(), arma_vec_indicator(), 2) { - arma_debug_sigprint(); - - Mat::operator=(X.get_ref()); + arma_debug_sigprint_this(this); } @@ -607,12 +603,9 @@ Row::Row const Base::pod_type, T1>& A, const Base::pod_type, T2>& B ) + : Mat(A.get_ref(), B.get_ref(), arma_vec_indicator(), 2) { - arma_debug_sigprint(); - - access::rw(Mat::vec_state) = 2; - - Mat::init(A,B); + arma_debug_sigprint_this(this); } @@ -631,12 +624,9 @@ template template inline Row::Row(const BaseCube& X) + : Mat(X.get_ref(), arma_vec_indicator(), 2) { - arma_debug_sigprint(); - - access::rw(Mat::vec_state) = 2; - - Mat::operator=(X); + arma_debug_sigprint_this(this); } @@ -659,12 +649,9 @@ Row::operator=(const BaseCube& X) template inline Row::Row(const subview_cube& X) + : Mat(X, arma_vec_indicator(), 2) { - arma_debug_sigprint(); - - access::rw(Mat::vec_state) = 2; - - Mat::operator=(X); + arma_debug_sigprint_this(this); }