Skip to content

Commit 3050bd0

Browse files
committed
Add variadic variants of the RCPP_RETURN_VECTOR/MATRIX macro
1 parent f2bcaf4 commit 3050bd0

File tree

3 files changed

+64
-19
lines changed

3 files changed

+64
-19
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
2016-08-09 Artem Klevtsov <a.a.klevtsov@gmail.com>
2+
3+
* inst/include/Rcpp/macros/dispatch.h: Add variadic conditional macro
4+
when C++11 compiler used
5+
16
2016-08-05 James J Balamuta <balamut2@illinois.edu>
27

38
* inst/examples/FastLM/fastLMviaArmadillo.r: format fix

inst/NEWS.Rd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
\ghit{387}).
2121
\item String constructors now set default UTF-8 encoding (Qiang Kou in
2222
\ghpr{529} fixing \ghit{263}).
23+
\item Add variadic variants of the \code{RCPP_RETURN_VECTOR} and \code{RCPP_RETURN_MATRIX} macro when C++11 compiler used (Artem Klevtsov
24+
in \ghpr{536} fixing \ghit{38}).
2325
}
2426
\item Changes in Rcpp unit tests
2527
\itemize{

inst/include/Rcpp/macros/dispatch.h

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,65 @@
2222
#ifndef Rcpp__macros__dispatch_h
2323
#define Rcpp__macros__dispatch_h
2424

25-
#define ___RCPP_HANDLE_CASE___( ___RTYPE___ , ___FUN___ , ___OBJECT___ , ___RCPPTYPE___ ) \
26-
case ___RTYPE___ : \
27-
return ___FUN___( ::Rcpp::___RCPPTYPE___< ___RTYPE___ >( ___OBJECT___ ) ) ;
25+
#ifdef RCPP_USING_CXX11
26+
#define ___RCPP_HANDLE_CASE___(___RTYPE___, ___FUN___, ___OBJECT___, \
27+
___RCPPTYPE___, ...) \
28+
case ___RTYPE___: \
29+
return ___FUN___(::Rcpp::___RCPPTYPE___<___RTYPE___>(___OBJECT___), \
30+
##__VA_ARGS__);
2831

29-
#define ___RCPP_RETURN___( __FUN__, __SEXP__ , __RCPPTYPE__ ) \
30-
SEXP __TMP__ = __SEXP__ ; \
31-
switch( TYPEOF( __TMP__ ) ){ \
32-
___RCPP_HANDLE_CASE___( INTSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
33-
___RCPP_HANDLE_CASE___( REALSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
34-
___RCPP_HANDLE_CASE___( RAWSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
35-
___RCPP_HANDLE_CASE___( LGLSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
36-
___RCPP_HANDLE_CASE___( CPLXSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
37-
___RCPP_HANDLE_CASE___( STRSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
38-
___RCPP_HANDLE_CASE___( VECSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
39-
___RCPP_HANDLE_CASE___( EXPRSXP , __FUN__ , __TMP__ , __RCPPTYPE__ ) \
40-
default: \
41-
throw std::range_error( "not a vector" ) ; \
42-
}
32+
#define ___RCPP_RETURN___(__FUN__, __SEXP__, __RCPPTYPE__, ...) \
33+
SEXP __TMP__ = __SEXP__; \
34+
switch (TYPEOF(__TMP__)) { \
35+
___RCPP_HANDLE_CASE___(INTSXP, __FUN__, __TMP__, __RCPPTYPE__, \
36+
##__VA_ARGS__) \
37+
___RCPP_HANDLE_CASE___(REALSXP, __FUN__, __TMP__, __RCPPTYPE__, \
38+
##__VA_ARGS__) \
39+
___RCPP_HANDLE_CASE___(RAWSXP, __FUN__, __TMP__, __RCPPTYPE__, \
40+
##__VA_ARGS__) \
41+
___RCPP_HANDLE_CASE___(LGLSXP, __FUN__, __TMP__, __RCPPTYPE__, \
42+
##__VA_ARGS__) \
43+
___RCPP_HANDLE_CASE___(CPLXSXP, __FUN__, __TMP__, __RCPPTYPE__, \
44+
##__VA_ARGS__) \
45+
___RCPP_HANDLE_CASE___(STRSXP, __FUN__, __TMP__, __RCPPTYPE__, \
46+
##__VA_ARGS__) \
47+
___RCPP_HANDLE_CASE___(VECSXP, __FUN__, __TMP__, __RCPPTYPE__, \
48+
##__VA_ARGS__) \
49+
___RCPP_HANDLE_CASE___(EXPRSXP, __FUN__, __TMP__, __RCPPTYPE__, \
50+
##__VA_ARGS__) \
51+
default: \
52+
throw std::range_error("Not a vector"); \
53+
}
4354

44-
#define RCPP_RETURN_VECTOR( _FUN_, _SEXP_ ) ___RCPP_RETURN___( _FUN_, _SEXP_ , Vector )
45-
#define RCPP_RETURN_MATRIX( _FUN_, _SEXP_ ) ___RCPP_RETURN___( _FUN_, _SEXP_ , Matrix )
55+
#define RCPP_RETURN_VECTOR(_FUN_, _SEXP_, ...) \
56+
___RCPP_RETURN___(_FUN_, _SEXP_, Vector, ##__VA_ARGS__)
57+
#define RCPP_RETURN_MATRIX(_FUN_, _SEXP_, ...) \
58+
___RCPP_RETURN___(_FUN_, _SEXP_, Matrix, ##__VA_ARGS__)
59+
#else
60+
#define ___RCPP_HANDLE_CASE___(___RTYPE___, ___FUN___, ___OBJECT___, \
61+
___RCPPTYPE___) \
62+
case ___RTYPE___: \
63+
return ___FUN___(::Rcpp::___RCPPTYPE___<___RTYPE___>(___OBJECT___));
4664

65+
#define ___RCPP_RETURN___(__FUN__, __SEXP__, __RCPPTYPE__) \
66+
SEXP __TMP__ = __SEXP__; \
67+
switch (TYPEOF(__TMP__)) { \
68+
___RCPP_HANDLE_CASE___(INTSXP, __FUN__, __TMP__, __RCPPTYPE__) \
69+
___RCPP_HANDLE_CASE___(REALSXP, __FUN__, __TMP__, __RCPPTYPE__) \
70+
___RCPP_HANDLE_CASE___(RAWSXP, __FUN__, __TMP__, __RCPPTYPE__) \
71+
___RCPP_HANDLE_CASE___(LGLSXP, __FUN__, __TMP__, __RCPPTYPE__) \
72+
___RCPP_HANDLE_CASE___(CPLXSXP, __FUN__, __TMP__, __RCPPTYPE__) \
73+
___RCPP_HANDLE_CASE___(STRSXP, __FUN__, __TMP__, __RCPPTYPE__) \
74+
___RCPP_HANDLE_CASE___(VECSXP, __FUN__, __TMP__, __RCPPTYPE__) \
75+
___RCPP_HANDLE_CASE___(EXPRSXP, __FUN__, __TMP__, __RCPPTYPE__) \
76+
default: \
77+
throw std::range_error("Not a vector"); \
78+
}
79+
80+
#define RCPP_RETURN_VECTOR(_FUN_, _SEXP_) \
81+
___RCPP_RETURN___(_FUN_, _SEXP_, Vector)
82+
#define RCPP_RETURN_MATRIX(_FUN_, _SEXP_) \
83+
___RCPP_RETURN___(_FUN_, _SEXP_, Matrix)
84+
#endif
4785

4886
#endif

0 commit comments

Comments
 (0)