Skip to content

Commit 56993ec

Browse files
committed
Merge pull request #476 from dcdillon/master
Fixing ambiguous arithmetic operators for Matrix/Vector on 32-bit
2 parents b45896d + 0112816 commit 56993ec

File tree

5 files changed

+45
-42
lines changed

5 files changed

+45
-42
lines changed

inst/include/Rcpp/sugar/operators/divides.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -408,20 +408,20 @@ namespace sugar{
408408

409409
}
410410

411-
template <int RTYPE,bool NA, typename T>
412-
inline sugar::Divides_Vector_Primitive< RTYPE , NA, T >
411+
template <int RTYPE,bool NA, typename T, typename U>
412+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Divides_Vector_Primitive< RTYPE , NA, T > >::type
413413
operator/(
414414
const VectorBase<RTYPE,NA,T>& lhs,
415-
typename traits::storage_type<RTYPE>::type rhs
415+
const U &rhs
416416
) {
417417
return sugar::Divides_Vector_Primitive<RTYPE,NA,T>( lhs, rhs ) ;
418418
}
419419

420420

421-
template <int RTYPE,bool NA, typename T>
422-
inline sugar::Divides_Primitive_Vector< RTYPE , NA,T>
421+
template <int RTYPE,bool NA, typename T, typename U>
422+
inline typename traits::enable_if< traits::is_convertible< typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Divides_Primitive_Vector< RTYPE , NA,T> >::type
423423
operator/(
424-
typename traits::storage_type<RTYPE>::type lhs,
424+
const U &lhs,
425425
const VectorBase<RTYPE,NA,T>& rhs
426426
) {
427427
return sugar::Divides_Primitive_Vector<RTYPE,NA,T>( lhs, rhs ) ;

inst/include/Rcpp/sugar/operators/minus.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,20 +412,20 @@ namespace sugar{
412412

413413
}
414414

415-
template <int RTYPE,bool NA, typename T>
416-
inline sugar::Minus_Vector_Primitive< RTYPE , NA, T >
415+
template <int RTYPE,bool NA, typename T, typename U>
416+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Minus_Vector_Primitive< RTYPE , NA, T > >::type
417417
operator-(
418418
const VectorBase<RTYPE,NA,T>& lhs,
419-
typename traits::storage_type<RTYPE>::type rhs
419+
const U &rhs
420420
) {
421421
return sugar::Minus_Vector_Primitive<RTYPE,NA,T>( lhs, rhs ) ;
422422
}
423423

424424

425-
template <int RTYPE,bool NA, typename T>
426-
inline sugar::Minus_Primitive_Vector< RTYPE , NA,T>
425+
template <int RTYPE,bool NA, typename T, typename U>
426+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Minus_Primitive_Vector< RTYPE , NA,T> >::type
427427
operator-(
428-
typename traits::storage_type<RTYPE>::type lhs,
428+
const U &lhs,
429429
const VectorBase<RTYPE,NA,T>& rhs
430430
) {
431431
return sugar::Minus_Primitive_Vector<RTYPE,NA,T>( lhs, rhs ) ;

inst/include/Rcpp/sugar/operators/plus.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -442,40 +442,41 @@ namespace sugar{
442442

443443
}
444444

445-
template <int RTYPE,bool NA, typename T>
446-
inline sugar::Plus_Vector_Primitive<RTYPE,NA,T>
445+
446+
template <int RTYPE,bool NA, typename T, typename U>
447+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, typename sugar::Plus_Vector_Primitive<RTYPE,NA,T> >::type
447448
operator+(
448449
const VectorBase<RTYPE,NA,T>& lhs,
449-
typename traits::storage_type<RTYPE>::type rhs
450+
const U &rhs
450451
) {
451452
return sugar::Plus_Vector_Primitive<RTYPE,NA,T>( lhs, rhs ) ;
452453
}
453454

454455

455-
template <int RTYPE,bool NA, typename T>
456-
inline sugar::Plus_Vector_Primitive< RTYPE , NA , T >
456+
template <int RTYPE,bool NA, typename T, typename U>
457+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, typename sugar::Plus_Vector_Primitive< RTYPE , NA , T> >::type
457458
operator+(
458-
typename traits::storage_type<RTYPE>::type rhs,
459+
const U &rhs,
459460
const VectorBase<RTYPE,NA,T>& lhs
460461
) {
461462
return sugar::Plus_Vector_Primitive<RTYPE,NA, T >( lhs, rhs ) ;
462463
}
463464

464465

465466

466-
template <int RTYPE,bool NA, typename T>
467-
inline sugar::Plus_Vector_Primitive_nona<RTYPE,NA,T>
467+
template <int RTYPE,bool NA, typename T, typename U>
468+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Plus_Vector_Primitive_nona<RTYPE,NA,T> >::type
468469
operator+(
469470
const VectorBase<RTYPE,NA,T>& lhs,
470-
typename sugar::NonaPrimitive< typename traits::storage_type<RTYPE>::type > rhs
471+
const typename sugar::NonaPrimitive< U > &rhs
471472
) {
472473
return sugar::Plus_Vector_Primitive_nona<RTYPE,NA,T>( lhs, rhs ) ;
473474
}
474475

475-
template <int RTYPE,bool NA, typename T>
476-
inline sugar::Plus_Vector_Primitive_nona< RTYPE , NA , T >
476+
template <int RTYPE,bool NA, typename T, typename U>
477+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Plus_Vector_Primitive_nona< RTYPE , NA , T> >::type
477478
operator+(
478-
typename sugar::NonaPrimitive< typename traits::storage_type<RTYPE>::type > rhs,
479+
const typename sugar::NonaPrimitive< U > &rhs,
479480
const VectorBase<RTYPE,NA,T>& lhs
480481
) {
481482
return sugar::Plus_Vector_Primitive_nona<RTYPE,NA, T >( lhs, rhs ) ;

inst/include/Rcpp/sugar/operators/times.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -424,40 +424,40 @@ namespace sugar{
424424

425425
}
426426

427-
template <int RTYPE,bool NA, typename T>
428-
inline sugar::Times_Vector_Primitive<RTYPE,NA,T>
427+
template <int RTYPE,bool NA, typename T, typename U>
428+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Times_Vector_Primitive<RTYPE,NA,T> >::type
429429
operator*(
430430
const VectorBase<RTYPE,NA,T>& lhs,
431-
typename traits::storage_type<RTYPE>::type rhs
431+
const U &rhs
432432
) {
433433
return sugar::Times_Vector_Primitive<RTYPE,NA,T>( lhs, rhs ) ;
434434
}
435435

436436

437-
template <int RTYPE,bool NA, typename T>
438-
inline sugar::Times_Vector_Primitive< RTYPE , NA , T >
437+
template <int RTYPE,bool NA, typename T, typename U>
438+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Times_Vector_Primitive< RTYPE , NA , T > >::type
439439
operator*(
440-
typename traits::storage_type<RTYPE>::type rhs,
440+
const U &rhs,
441441
const VectorBase<RTYPE,NA,T>& lhs
442442
) {
443443
return sugar::Times_Vector_Primitive<RTYPE,NA, T >( lhs, rhs ) ;
444444
}
445445

446446

447447

448-
template <int RTYPE,bool NA, typename T>
449-
inline sugar::Times_Vector_Primitive_nona<RTYPE,NA,T>
448+
template <int RTYPE,bool NA, typename T, typename U>
449+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Times_Vector_Primitive_nona<RTYPE,NA,T> >::type
450450
operator*(
451451
const VectorBase<RTYPE,NA,T>& lhs,
452-
typename sugar::NonaPrimitive< typename traits::storage_type<RTYPE>::type > rhs
452+
const typename sugar::NonaPrimitive< U > &rhs
453453
) {
454454
return sugar::Times_Vector_Primitive_nona<RTYPE,NA,T>( lhs, rhs ) ;
455455
}
456456

457-
template <int RTYPE,bool NA, typename T>
458-
inline sugar::Times_Vector_Primitive_nona< RTYPE , NA , T >
457+
template <int RTYPE,bool NA, typename T, typename U>
458+
inline typename traits::enable_if<traits::is_convertible<typename traits::remove_const_and_reference<U>::type, typename traits::storage_type<RTYPE>::type>::value, sugar::Times_Vector_Primitive_nona< RTYPE , NA , T > >::type
459459
operator*(
460-
typename sugar::NonaPrimitive< typename traits::storage_type<RTYPE>::type > rhs,
460+
const typename sugar::NonaPrimitive< U > &rhs,
461461
const VectorBase<RTYPE,NA,T>& lhs
462462
) {
463463
return sugar::Times_Vector_Primitive_nona<RTYPE,NA, T >( lhs, rhs ) ;

inst/include/Rcpp/vector/Matrix.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,10 @@ inline std::ostream &operator<<(std::ostream & s, const Matrix<REALSXP, StorageP
248248
}
249249

250250
#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) { \
251+
template <int RTYPE, template <class> class StoragePolicy, typename T > \
252+
inline typename traits::enable_if< traits::is_convertible< typename traits::remove_const_and_reference< T >::type, \
253+
typename Matrix<RTYPE, StoragePolicy>::stored_type >::value, Matrix<RTYPE, StoragePolicy> >::type \
254+
operator __OPERATOR__ (const Matrix<RTYPE, StoragePolicy> &lhs, const T &rhs) { \
254255
Vector<RTYPE, StoragePolicy> v = static_cast<const Vector<RTYPE, StoragePolicy> &>(lhs) __OPERATOR__ rhs; \
255256
v.attr("dim") = Vector<INTSXP>::create(lhs.nrow(), lhs.ncol()); \
256257
return as< Matrix<RTYPE, StoragePolicy> >(v); \
@@ -264,9 +265,10 @@ RCPP_GENERATE_MATRIX_SCALAR_OPERATOR(/)
264265
#undef RCPP_GENERATE_MATRIX_SCALAR_OPERATOR
265266

266267
#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) { \
268+
template <int RTYPE, template <class> class StoragePolicy, typename T > \
269+
inline typename traits::enable_if< traits::is_convertible< typename traits::remove_const_and_reference< T >::type, \
270+
typename Matrix<RTYPE, StoragePolicy>::stored_type >::value, Matrix<RTYPE, StoragePolicy> >::type \
271+
operator __OPERATOR__ (const T &lhs, const Matrix<RTYPE, StoragePolicy> &rhs) { \
270272
Vector<RTYPE, StoragePolicy> v = static_cast<const Vector<RTYPE, StoragePolicy> &>(rhs); \
271273
v = lhs __OPERATOR__ v; \
272274
v.attr("dim") = Vector<INTSXP>::create(rhs.nrow(), rhs.ncol()); \

0 commit comments

Comments
 (0)