|
22 | 22 | #ifndef Rcpp__macros__dispatch_h
|
23 | 23 | #define Rcpp__macros__dispatch_h
|
24 | 24 |
|
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__); |
28 | 31 |
|
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 | + } |
43 | 54 |
|
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___)); |
46 | 64 |
|
| 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 |
47 | 85 |
|
48 | 86 | #endif
|
0 commit comments