diff --git a/include/armadillo_bits/op_vectorise_bones.hpp b/include/armadillo_bits/op_vectorise_bones.hpp index eabe2eed..c446f655 100644 --- a/include/armadillo_bits/op_vectorise_bones.hpp +++ b/include/armadillo_bits/op_vectorise_bones.hpp @@ -34,8 +34,6 @@ struct op_vectorise_col template inline static void apply_direct(Mat_noalias& out, const T1& expr); template inline static void apply_subview(Mat& out, const subview& sv); - - template inline static void apply_proxy(Mat& out, const Proxy& P); }; diff --git a/include/armadillo_bits/op_vectorise_meat.hpp b/include/armadillo_bits/op_vectorise_meat.hpp index 27d4e201..e2f8d5d5 100644 --- a/include/armadillo_bits/op_vectorise_meat.hpp +++ b/include/armadillo_bits/op_vectorise_meat.hpp @@ -80,39 +80,12 @@ op_vectorise_col::apply_direct(Mat& out, const T1& expr) } } else - if( (quasi_unwrap::has_orig_mem) || (is_Mat::stored_type>::value) || (arma_config::openmp && Proxy::use_mp) ) { - const quasi_unwrap U(expr); + Mat tmp = expr; - if(U.is_alias(out)) - { - Mat tmp(U.M.memptr(), U.M.n_elem, 1); - - out.steal_mem(tmp); - } - else - { - out.set_size(U.M.n_elem, 1); - - arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); - } - } - else - { - const Proxy P(expr); + tmp.set_size(tmp.n_elem, 1); - if(P.is_alias(out)) - { - Mat tmp; - - op_vectorise_col::apply_proxy(tmp, P); - - out.steal_mem(tmp); - } - else - { - op_vectorise_col::apply_proxy(out, P); - } + out.steal_mem(tmp); } } @@ -133,12 +106,23 @@ op_vectorise_col::apply(Mat_noalias& out, const Op inline void -op_vectorise_col::apply_direct(Mat_noalias& out, const T1& expr) +op_vectorise_col::apply_direct(Mat_noalias& actual_out, const T1& expr) { arma_debug_sigprint(); typedef typename T1::elem_type eT; + Mat& out = actual_out; + + if(is_Mat::value) + { + const plain_unwrap U(expr); + + out.set_size(U.M.n_elem, 1); + + arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); + } + else if(is_subview::value) { const subview& sv = reinterpret_cast< const subview& >(expr); @@ -146,19 +130,12 @@ op_vectorise_col::apply_direct(Mat_noalias& out, const T op_vectorise_col::apply_subview(out, sv); } else - if( (quasi_unwrap::has_orig_mem) || (is_Mat::stored_type>::value) || (arma_config::openmp && Proxy::use_mp) ) { - const quasi_unwrap U(expr); + Mat tmp = expr; - out.set_size(U.M.n_elem, 1); + tmp.set_size(tmp.n_elem, 1); - arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); - } - else - { - const Proxy P(expr); - - op_vectorise_col::apply_proxy(out, P); + out.steal_mem(tmp); } } @@ -190,71 +167,6 @@ op_vectorise_col::apply_subview(Mat& out, const subview& sv) -template -inline -void -op_vectorise_col::apply_proxy(Mat& out, const Proxy& P) - { - arma_debug_sigprint(); - - typedef typename T1::elem_type eT; - - const uword N = P.get_n_elem(); - - out.set_size(N, 1); - - if(N == 0) { return; } - - eT* outmem = out.memptr(); - - if(Proxy::use_at == false) - { - // TODO: add handling of aligned access ? - - typename Proxy::ea_type A = P.get_ea(); - - uword i,j; - - for(i=0, j=1; j < N; i+=2, j+=2) - { - const eT tmp_i = A[i]; - const eT tmp_j = A[j]; - - outmem[i] = tmp_i; - outmem[j] = tmp_j; - } - - if(i < N) - { - outmem[i] = A[i]; - } - } - else - { - const uword n_rows = P.get_n_rows(); - const uword n_cols = P.get_n_cols(); - - if(n_rows == 1) - { - for(uword i=0; i < n_cols; ++i) - { - outmem[i] = P.at(0,i); - } - } - else - { - for(uword col=0; col < n_cols; ++col) - for(uword row=0; row < n_rows; ++row) - { - *outmem = P.at(row,col); - outmem++; - } - } - } - } - - - template inline void