|
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