diff --git a/include/armadillo_bits/op_vectorise_bones.hpp b/include/armadillo_bits/op_vectorise_bones.hpp index bcccc60d..91f7df7c 100644 --- a/include/armadillo_bits/op_vectorise_bones.hpp +++ b/include/armadillo_bits/op_vectorise_bones.hpp @@ -71,7 +71,9 @@ class op_vectorise_cube_col template inline static void apply_subview(Mat& out, const subview_cube& sv); - template inline static void apply_proxy(Mat& out, const ProxyCube& P); + template inline static void apply_unwrap(Mat& out, const T1& expr); + + template inline static void apply_proxy(Mat& out, const T1& expr); }; diff --git a/include/armadillo_bits/op_vectorise_meat.hpp b/include/armadillo_bits/op_vectorise_meat.hpp index 2573fafd..e743fc87 100644 --- a/include/armadillo_bits/op_vectorise_meat.hpp +++ b/include/armadillo_bits/op_vectorise_meat.hpp @@ -343,9 +343,14 @@ op_vectorise_cube_col::apply(Mat& out, const CubeToMatOp } else { - const ProxyCube P(in.m); - - op_vectorise_cube_col::apply_proxy(out, P); + if(is_Cube::value || (arma_config::openmp && ProxyCube::use_mp)) + { + op_vectorise_cube_col::apply_unwrap(out, in.m); + } + else + { + op_vectorise_cube_col::apply_proxy(out, in.m); + } } } @@ -380,21 +385,37 @@ op_vectorise_cube_col::apply_subview(Mat& out, const subview_cube& sv) template inline void -op_vectorise_cube_col::apply_proxy(Mat& out, const ProxyCube& P) +op_vectorise_cube_col::apply_unwrap(Mat& out, const T1& expr) + { + arma_extra_debug_sigprint(); + + const unwrap_cube U(expr); + + out.set_size(U.M.n_elem, 1); + + arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); + } + + + +template +inline +void +op_vectorise_cube_col::apply_proxy(Mat& out, const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; + const ProxyCube P(expr); + const uword N = P.get_n_elem(); out.set_size(N, 1); - if(is_Cube::stored_type>::value || (arma_config::openmp && ProxyCube::use_mp)) + if(is_Cube::stored_type>::value) { - const unwrap_cube::stored_type> tmp(P.Q); - - arrayops::copy(out.memptr(), tmp.M.memptr(), N); + op_vectorise_cube_col::apply_unwrap(out, P.Q); } else {