@@ -247,6 +247,39 @@ inline std::ostream &operator<<(std::ostream & s, const Matrix<REALSXP, StorageP
247247 return s;
248248}
249249
250+ #define RCPP_GENERATE_MATRIX_SCALAR_OPERATOR (__OPERATOR__ ) \
251+ template <int RTYPE, template <class > class StoragePolicy > \
252+ inline Matrix<RTYPE, StoragePolicy> operator __OPERATOR__ (const Matrix<RTYPE, StoragePolicy> &lhs, \
253+ const typename Matrix<RTYPE, StoragePolicy>::stored_type &rhs) { \
254+ Vector<RTYPE, StoragePolicy> v = static_cast <const Vector<RTYPE, StoragePolicy> &>(lhs) __OPERATOR__ rhs; \
255+ v.attr (" dim" ) = Vector<INTSXP>::create (lhs.nrow (), lhs.ncol ()); \
256+ return as< Matrix<RTYPE, StoragePolicy> >(v); \
257+ }
258+
259+ RCPP_GENERATE_MATRIX_SCALAR_OPERATOR (+)
260+ RCPP_GENERATE_MATRIX_SCALAR_OPERATOR (-)
261+ RCPP_GENERATE_MATRIX_SCALAR_OPERATOR (*)
262+ RCPP_GENERATE_MATRIX_SCALAR_OPERATOR (/)
263+
264+ #undef RCPP_GENERATE_MATRIX_SCALAR_OPERATOR
265+
266+ #define RCPP_GENERATE_SCALAR_MATRIX_OPERATOR (__OPERATOR__ ) \
267+ template <int RTYPE, template <class > class StoragePolicy > \
268+ inline Matrix<RTYPE, StoragePolicy> operator __OPERATOR__ (const typename Matrix<RTYPE, StoragePolicy>::stored_type &lhs, \
269+ const Matrix<RTYPE, StoragePolicy> &rhs) { \
270+ Vector<RTYPE, StoragePolicy> v = static_cast <const Vector<RTYPE, StoragePolicy> &>(rhs); \
271+ v = lhs __OPERATOR__ v; \
272+ v.attr (" dim" ) = Vector<INTSXP>::create (rhs.nrow (), rhs.ncol ()); \
273+ return as< Matrix<RTYPE, StoragePolicy> >(v); \
274+ }
275+
276+ RCPP_GENERATE_SCALAR_MATRIX_OPERATOR (+)
277+ RCPP_GENERATE_SCALAR_MATRIX_OPERATOR (-)
278+ RCPP_GENERATE_SCALAR_MATRIX_OPERATOR (*)
279+ RCPP_GENERATE_SCALAR_MATRIX_OPERATOR (/)
280+
281+ #undef RCPP_GENERATE_SCALAR_MATRIX_OPERATOR
282+
250283template <template <class > class StoragePolicy >
251284inline std::ostream &operator <<(std::ostream & s, const Matrix<INTSXP, StoragePolicy> & rhs) {
252285 typedef Matrix<INTSXP, StoragePolicy> MATRIX;
0 commit comments