|
2 | 2 | // |
3 | 3 | // RcppEigenWrap.h: Rcpp wrap methods for Eigen matrices, vectors and arrays |
4 | 4 | // |
5 | | -// Copyright (C) 2011 - 2012 Douglas Bates, Dirk Eddelbuettel and Romain Francois |
| 5 | +// Copyright (C) 2011 - 2022 Douglas Bates, Dirk Eddelbuettel and Romain Francois |
6 | 6 | // |
7 | 7 | // This file is part of RcppEigen. |
8 | 8 | // |
@@ -80,16 +80,19 @@ namespace Rcpp{ |
80 | 80 |
|
81 | 81 | // for plain dense objects |
82 | 82 | template <typename T> |
83 | | - SEXP eigen_wrap_plain_dense( const T& obj, Rcpp::traits::true_type ){ |
84 | | - typename Eigen::internal::conditional<T::IsRowMajor, |
85 | | - Eigen::Matrix<typename T::Scalar, |
86 | | - T::RowsAtCompileTime, |
87 | | - T::ColsAtCompileTime>, |
88 | | - const T&>::type objCopy(obj); |
89 | | - int m = obj.rows(), n = obj.cols(); |
90 | | - R_xlen_t size = static_cast<R_xlen_t>(m) * n; |
91 | | - SEXP ans = PROTECT(::Rcpp::wrap(objCopy.data(), objCopy.data() + size)); |
92 | | - if( T::ColsAtCompileTime != 1 ) { |
| 83 | + SEXP eigen_wrap_plain_dense( const T& obj, Rcpp::traits::true_type ) { |
| 84 | + typename Eigen::internal::conditional< |
| 85 | + T::IsRowMajor, |
| 86 | + Eigen::Matrix<typename T::Scalar, |
| 87 | + T::RowsAtCompileTime, |
| 88 | + T::ColsAtCompileTime>, |
| 89 | + const T&>::type objCopy(obj); |
| 90 | + R_xlen_t m = obj.rows(), n = obj.cols(), size = m * n; |
| 91 | + SEXP ans = PROTECT(::Rcpp::wrap(objCopy.data(), objCopy.data() + size)); |
| 92 | + if ( T::ColsAtCompileTime != 1 ) { |
| 93 | + if (m > INT_MAX || n > INT_MAX) { |
| 94 | + Rcpp::stop("array dimensions cannot exceed INT_MAX"); |
| 95 | + } |
93 | 96 | SEXP dd = PROTECT(::Rf_allocVector(INTSXP, 2)); |
94 | 97 | int *d = INTEGER(dd); |
95 | 98 | d[0] = m; |
|
0 commit comments