|
3 | 3 | // dispatch.h: Rcpp R/C++ interface class library -- macros for dispatch |
4 | 4 | // |
5 | 5 | // Copyright (C) 2012 - 2016 Dirk Eddelbuettel and Romain Francois |
6 | | -// Copyright (C) 2016 Dirk Eddelbuettel, Romain Francois, Artem Klevtsov and Nathan Russell |
| 6 | +// Copyright (C) 2016 - 2025 Dirk Eddelbuettel, Romain Francois, Artem Klevtsov and Nathan Russell |
7 | 7 | // |
8 | 8 | // This file is part of Rcpp. |
9 | 9 | // |
|
23 | 23 | #ifndef Rcpp__macros__dispatch_h |
24 | 24 | #define Rcpp__macros__dispatch_h |
25 | 25 |
|
26 | | -// The variadic macros below incorporate techniques presented by |
| 26 | +// The variadic macros below incorporate techniques presented by |
27 | 27 | // Stack Overflow user Richard Hansen in this answer |
28 | 28 | // |
29 | | -// http://stackoverflow.com/a/11172679/1869097 |
| 29 | +// http://stackoverflow.com/a/11172679/1869097 |
30 | 30 | // |
31 | 31 | // and are necessary to avoid the use of GNU compiler extensions. |
32 | 32 |
|
33 | | -#ifdef RCPP_USING_CXX11 |
34 | | - |
35 | 33 | #define ___RCPP_HANDLE_CASE___(___RTYPE___, ___FUN___, ___RCPPTYPE___, ...) \ |
36 | 34 | case ___RTYPE___: \ |
37 | 35 | return ___FUN___(::Rcpp::___RCPPTYPE___<___RTYPE___>(RCPP_MACRO_FIRST(__VA_ARGS__)) \ |
|
77 | 75 | #define RCPP_MACRO_SELECT_25TH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, \ |
78 | 76 | a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, ...) a25 |
79 | 77 |
|
80 | | -#else |
81 | | - |
82 | | -#define ___RCPP_HANDLE_CASE___(___RTYPE___, ___FUN___, ___OBJECT___, \ |
83 | | - ___RCPPTYPE___) \ |
84 | | - case ___RTYPE___: \ |
85 | | - return ___FUN___(::Rcpp::___RCPPTYPE___<___RTYPE___>(___OBJECT___)); |
86 | | - |
87 | | -#define ___RCPP_RETURN___(__FUN__, __SEXP__, __RCPPTYPE__) \ |
88 | | - SEXP __TMP__ = __SEXP__; \ |
89 | | - switch (TYPEOF(__TMP__)) { \ |
90 | | - ___RCPP_HANDLE_CASE___(INTSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
91 | | - ___RCPP_HANDLE_CASE___(REALSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
92 | | - ___RCPP_HANDLE_CASE___(RAWSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
93 | | - ___RCPP_HANDLE_CASE___(LGLSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
94 | | - ___RCPP_HANDLE_CASE___(CPLXSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
95 | | - ___RCPP_HANDLE_CASE___(STRSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
96 | | - ___RCPP_HANDLE_CASE___(VECSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
97 | | - ___RCPP_HANDLE_CASE___(EXPRSXP, __FUN__, __TMP__, __RCPPTYPE__) \ |
98 | | - default: \ |
99 | | - throw std::range_error("Not a vector"); \ |
100 | | - } |
101 | | - |
102 | | -#define RCPP_RETURN_VECTOR(_FUN_, _SEXP_) \ |
103 | | - ___RCPP_RETURN___(_FUN_, _SEXP_, Vector) |
104 | | -#define RCPP_RETURN_MATRIX(_FUN_, _SEXP_) \ |
105 | | - ___RCPP_RETURN___(_FUN_, _SEXP_, Matrix) |
106 | | -#endif |
107 | | - |
108 | 78 | #endif |
0 commit comments