Skip to content

Commit e22c3e8

Browse files
Avoid GNU extensions in variadic macros
1 parent e68489e commit e22c3e8

File tree

3 files changed

+61
-33
lines changed

3 files changed

+61
-33
lines changed

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
2016-11-04 Nathan Russell <[email protected]>
2+
3+
* inst/include/Rcpp/macros/dispatch.h: Modify variadic macros
4+
to not use GNU extensions
5+
* DESCRIPTION: roll minor version
6+
17
2016-11-03 Nathan Russell <[email protected]>
28

39
* inst/include/Rcpp/hash/IndexHash.h: Add casts to eliminate

DESCRIPTION

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Package: Rcpp
22
Title: Seamless R and C++ Integration
3-
Version: 0.12.7.3
4-
Date: 2016-10-20
3+
Version: 0.12.7.5
4+
Date: 2016-10-25
55
Author: Dirk Eddelbuettel, Romain Francois [2009-2013], JJ Allaire, Kevin Ushey,
66
Qiang Kou, Douglas Bates [2010-2012] and John Chambers
77
Maintainer: Dirk Eddelbuettel <[email protected]>

inst/include/Rcpp/macros/dispatch.h

Lines changed: 53 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
//
33
// dispatch.h: Rcpp R/C++ interface class library -- macros for dispatch
44
//
5-
// Copyright (C) 2012 Dirk Eddelbuettel and Romain Francois
5+
// Copyright (C) 2012 - 2016 Dirk Eddelbuettel and Romain Francois
6+
// Copyright (C) 2016 Dirk Eddelbuettel, Romain Francois, Artem Klevtsov and Nathan Russell
67
//
78
// This file is part of Rcpp.
89
//
@@ -22,41 +23,62 @@
2223
#ifndef Rcpp__macros__dispatch_h
2324
#define Rcpp__macros__dispatch_h
2425

26+
// The variadic macros below incorporate techniques presented by
27+
// Stack Overflow user Richard Hansen in this answer
28+
//
29+
// http://stackoverflow.com/a/11172679/1869097
30+
//
31+
// and are necessary to avoid the use of GNU compiler extensions.
32+
2533
#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__);
3134

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"); \
35+
#define ___RCPP_HANDLE_CASE___(___RTYPE___, ___FUN___, ___RCPPTYPE___, ...) \
36+
case ___RTYPE___: \
37+
return ___FUN___(::Rcpp::___RCPPTYPE___<___RTYPE___>(RCPP_MACRO_FIRST(__VA_ARGS__)) \
38+
RCPP_MACRO_REST(__VA_ARGS__));
39+
40+
41+
#define ___RCPP_RETURN___(__FUN__, __RCPPTYPE__, ...) \
42+
SEXP __TMP__ = RCPP_MACRO_FIRST(__VA_ARGS__); \
43+
switch (TYPEOF(__TMP__)) { \
44+
___RCPP_HANDLE_CASE___(INTSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
45+
___RCPP_HANDLE_CASE___(REALSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
46+
___RCPP_HANDLE_CASE___(RAWSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
47+
___RCPP_HANDLE_CASE___(LGLSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
48+
___RCPP_HANDLE_CASE___(CPLXSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
49+
___RCPP_HANDLE_CASE___(STRSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
50+
___RCPP_HANDLE_CASE___(VECSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
51+
___RCPP_HANDLE_CASE___(EXPRSXP, __FUN__, __RCPPTYPE__, __VA_ARGS__) \
52+
default: \
53+
throw std::range_error("Not a vector"); \
5354
}
5455

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__)
56+
57+
#define RCPP_RETURN_VECTOR(_FUN_, ...) \
58+
___RCPP_RETURN___(_FUN_, Vector, __VA_ARGS__)
59+
#define RCPP_RETURN_MATRIX(_FUN_, ...) \
60+
___RCPP_RETURN___(_FUN_, Matrix, __VA_ARGS__)
61+
62+
63+
#define RCPP_MACRO_FIRST(...) RCPP_MACRO_FIRST_HELPER(__VA_ARGS__, throwaway)
64+
#define RCPP_MACRO_FIRST_HELPER(first, ...) first
65+
66+
#define RCPP_MACRO_REST(...) RCPP_MACRO_REST_HELPER(RCPP_MACRO_NUM(__VA_ARGS__), __VA_ARGS__)
67+
#define RCPP_MACRO_REST_HELPER(qty, ...) RCPP_MACRO_REST_HELPER2(qty, __VA_ARGS__)
68+
#define RCPP_MACRO_REST_HELPER2(qty, ...) RCPP_MACRO_REST_HELPER_##qty(__VA_ARGS__)
69+
#define RCPP_MACRO_REST_HELPER_ONE(first)
70+
#define RCPP_MACRO_REST_HELPER_TWOORMORE(first, ...) , __VA_ARGS__
71+
#define RCPP_MACRO_NUM(...) \
72+
RCPP_MACRO_SELECT_25TH(__VA_ARGS__, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, \
73+
TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, \
74+
TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, \
75+
TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, \
76+
TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, ONE, throwaway)
77+
#define RCPP_MACRO_SELECT_25TH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, \
78+
a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, ...) a25
79+
5980
#else
81+
6082
#define ___RCPP_HANDLE_CASE___(___RTYPE___, ___FUN___, ___OBJECT___, \
6183
___RCPPTYPE___) \
6284
case ___RTYPE___: \

0 commit comments

Comments
 (0)