Skip to content

Commit

Permalink
added optional RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR and co. (#151)
Browse files Browse the repository at this point in the history
* added optional RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR and co.

Signed-off-by: Serguei Sokol <sokol at insa-toulouse.fr>

* added unit tests for RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR and co.;
unit_test_setup() is modified to accept character vector as first argument;
  • Loading branch information
sgsokol authored and eddelbuettel committed Aug 1, 2017
1 parent 1779ced commit 41f7930
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 7 deletions.
14 changes: 8 additions & 6 deletions R/unit.test.R
Expand Up @@ -35,12 +35,14 @@ unit_test_setup <- function(file = NULL, packages = NULL) {
}
}
if (!is.null(file)) {
if (exists("pathRcppArmadilloTests")) {
sourceCpp(file.path(get("pathRcppArmadilloTests"), "cpp", file))
} else if (file.exists(file.path("cpp", file))) {
sourceCpp(file.path( "cpp", file))
} else {
sourceCpp(system.file("unitTests", "cpp", file, package="RcppArmadillo"))
for (f in file) {
if (exists("pathRcppArmadilloTests")) {
sourceCpp(file.path(get("pathRcppArmadilloTests"), "cpp", f))
} else if (file.exists(file.path("cpp", f))) {
sourceCpp(file.path( "cpp", f))
} else {
sourceCpp(system.file("unitTests", "cpp", f, package="RcppArmadillo"))
}
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions inst/include/RcppArmadilloWrap.h
Expand Up @@ -62,11 +62,19 @@ namespace Rcpp{
}

template <typename T> SEXP wrap( const arma::Col<T>& data ){
#if defined(RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR) || defined(RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR)
return RcppArmadillo::arma_wrap( data ) ;
#else
return RcppArmadillo::arma_wrap( data, Dimension( data.n_elem, 1) ) ;
#endif
}

template <typename T> SEXP wrap( const arma::Row<T>& data ){
#if defined(RCPP_ARMADILLO_RETURN_ROWVEC_AS_VECTOR) || defined(RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR)
return RcppArmadillo::arma_wrap( data ) ;
#else
return RcppArmadillo::arma_wrap(data, Dimension( 1, data.n_elem ) ) ;
#endif
}

template <typename T> SEXP wrap( const arma::Cube<T>& data ){
Expand Down
11 changes: 11 additions & 0 deletions inst/unitTests/cpp/any_as_vec.cpp
@@ -0,0 +1,11 @@
// [[Rcpp::depends(RcppArmadillo)]]
#define RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR

#include <RcppArmadillo.h>

using namespace Rcpp;

// [[Rcpp::export]]
arma::vec veccany_as_v_test(arma::vec v) { return(v); }
// [[Rcpp::export]]
arma::rowvec vecrany_as_v_test(arma::rowvec v) { return(v); }
6 changes: 6 additions & 0 deletions inst/unitTests/cpp/armadillo.cpp
Expand Up @@ -295,3 +295,9 @@ arma::umat r_umat_test(arma::umat& v) { return(v); }

// [[Rcpp::export]]
arma::umat cr_umat_test(const arma::umat& v) { return(v); }

// [[Rcpp::export]]
arma::vec vecc_test(arma::vec v) { return(v); }

// [[Rcpp::export]]
arma::rowvec vecr_test(arma::rowvec v) { return(v); }
11 changes: 11 additions & 0 deletions inst/unitTests/cpp/colrow_as_vec.cpp
@@ -0,0 +1,11 @@
// [[Rcpp::depends(RcppArmadillo)]]
#define RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR
#define RCPP_ARMADILLO_RETURN_ROWVEC_AS_VECTOR
#include <RcppArmadillo.h>

using namespace Rcpp;

// [[Rcpp::export]]
arma::vec vecc_as_v_test(arma::vec v) { return(v); }
// [[Rcpp::export]]
arma::rowvec vecr_as_v_test(arma::rowvec v) { return(v); }
13 changes: 12 additions & 1 deletion inst/unitTests/runit.RcppArmadillo.R
Expand Up @@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with RcppArmadillo. If not, see <http://www.gnu.org/licenses/>.

.setUp <- RcppArmadillo:::unit_test_setup( "armadillo.cpp", "RcppArmadillo" )
.setUp <- RcppArmadillo:::unit_test_setup( c("armadillo.cpp", "colrow_as_vec.cpp", "any_as_vec.cpp"), "RcppArmadillo" )

test.wrap.R <- function(){
fx <- wrap_
Expand Down Expand Up @@ -237,3 +237,14 @@ test.armadillo.unsigned.as <- function() {
checkEquals(mat, r_umat_test(mat))
checkEquals(mat, cr_umat_test(mat))
}
test.armadillo.as_vector <- function() {
vec <- 1:3
vecc <- as.matrix(1:3)
vecr <- t(vecc)
checkEquals(vecc, vecc_test(vec), msg="legacy vec")
checkEquals(vecr, vecr_test(vecr), msg="legacy rowvec")
checkEquals(vec, vecc_as_v_test(vec), msg="vec as vector")
checkEquals(vec, vecr_as_v_test(vec), msg="rowvec as vector")
checkEquals(vec, veccany_as_v_test(vec), msg="vec (by any) as vector")
checkEquals(vec, vecrany_as_v_test(vec), msg="rowvec (by any) as vector")
}

0 comments on commit 41f7930

Please sign in to comment.