@@ -64,49 +64,49 @@ namespace helpers {
64
64
typedef struct {char a[128 ];} CTYPE_UNKNOWN;
65
65
66
66
template < std::size_t I >
67
- struct ctype_helper { };
67
+ struct ctype_helper { static const bool value = false ; };
68
68
69
69
template <>
70
- struct ctype_helper < sizeof (CTYPE_CHAR) > { typedef char type; };
70
+ struct ctype_helper < sizeof (CTYPE_CHAR) > { typedef char type; static const bool value = true ; };
71
71
72
72
template <>
73
- struct ctype_helper < sizeof (CTYPE_SHORT) > { typedef short type; };
73
+ struct ctype_helper < sizeof (CTYPE_SHORT) > { typedef short type; static const bool value = true ; };
74
74
75
75
template <>
76
- struct ctype_helper < sizeof (CTYPE_INT) > { typedef int type; };
76
+ struct ctype_helper < sizeof (CTYPE_INT) > { typedef int type; static const bool value = true ; };
77
77
78
78
template <>
79
- struct ctype_helper < sizeof (CTYPE_LONG) > { typedef long type; };
79
+ struct ctype_helper < sizeof (CTYPE_LONG) > { typedef long type; static const bool value = true ; };
80
80
81
81
template <>
82
- struct ctype_helper < sizeof (CTYPE_LONG_LONG) > { typedef long long type; };
82
+ struct ctype_helper < sizeof (CTYPE_LONG_LONG) > { typedef long long type; static const bool value = true ; };
83
83
84
84
template <>
85
- struct ctype_helper < sizeof (CTYPE_FLOAT) > { typedef float type; };
85
+ struct ctype_helper < sizeof (CTYPE_FLOAT) > { typedef float type; static const bool value = true ; };
86
86
87
87
template <>
88
- struct ctype_helper < sizeof (CTYPE_DOUBLE) > { typedef double type; };
88
+ struct ctype_helper < sizeof (CTYPE_DOUBLE) > { typedef double type; static const bool value = true ; };
89
89
90
90
template <>
91
- struct ctype_helper < sizeof (CTYPE_LONG_DOUBLE) > { typedef long double type; };
91
+ struct ctype_helper < sizeof (CTYPE_LONG_DOUBLE) > { typedef long double type; static const bool value = true ; };
92
92
93
93
template <>
94
- struct ctype_helper < sizeof (CTYPE_STRING) > { typedef std::string type; };
94
+ struct ctype_helper < sizeof (CTYPE_STRING) > { typedef std::string type; static const bool value = true ; };
95
95
96
96
template <>
97
- struct ctype_helper < sizeof (CTYPE_UNSIGNED_CHAR) > { typedef unsigned char type; };
97
+ struct ctype_helper < sizeof (CTYPE_UNSIGNED_CHAR) > { typedef unsigned char type; static const bool value = true ; };
98
98
99
99
template <>
100
- struct ctype_helper < sizeof (CTYPE_UNSIGNED_SHORT) > { typedef unsigned short type; };
100
+ struct ctype_helper < sizeof (CTYPE_UNSIGNED_SHORT) > { typedef unsigned short type; static const bool value = true ; };
101
101
102
102
template <>
103
- struct ctype_helper < sizeof (CTYPE_UNSIGNED_INT) > { typedef unsigned int type; };
103
+ struct ctype_helper < sizeof (CTYPE_UNSIGNED_INT) > { typedef unsigned int type; static const bool value = true ; };
104
104
105
105
template <>
106
- struct ctype_helper < sizeof (CTYPE_UNSIGNED_LONG) > { typedef unsigned long type; };
106
+ struct ctype_helper < sizeof (CTYPE_UNSIGNED_LONG) > { typedef unsigned long type; static const bool value = true ; };
107
107
108
108
template <>
109
- struct ctype_helper < sizeof (CTYPE_UNSIGNED_LONG_LONG) > { typedef unsigned long long type; };
109
+ struct ctype_helper < sizeof (CTYPE_UNSIGNED_LONG_LONG) > { typedef unsigned long long type; static const bool value = true ; };
110
110
111
111
112
112
template < typename T >
@@ -133,6 +133,30 @@ namespace helpers {
133
133
typedef typename ctype_helper< sizeof (test(make())) >::type type;
134
134
};
135
135
136
+ template < typename T >
137
+ struct decays_to_ctype
138
+ {
139
+ static CTYPE_CHAR test (const char &);
140
+ static CTYPE_SHORT test (const short &);
141
+ static CTYPE_INT test (const int &);
142
+ static CTYPE_LONG test (const long &);
143
+ static CTYPE_LONG_LONG test (const long long &);
144
+ static CTYPE_FLOAT test (const float &);
145
+ static CTYPE_DOUBLE test (const double &);
146
+ static CTYPE_LONG_DOUBLE test (const long double &);
147
+ static CTYPE_STRING test (const std::string &);
148
+ static CTYPE_UNSIGNED_CHAR test (const unsigned char &);
149
+ static CTYPE_UNSIGNED_SHORT test (const unsigned short &);
150
+ static CTYPE_UNSIGNED_INT test (const unsigned int &);
151
+ static CTYPE_UNSIGNED_LONG test (const unsigned long &);
152
+ static CTYPE_UNSIGNED_LONG_LONG test (const unsigned long long &);
153
+ static CTYPE_UNKNOWN test (...);
154
+
155
+ static T make ();
156
+
157
+ static const bool value = ctype_helper< sizeof (test(make())) >::value;
158
+ };
159
+
136
160
struct log {
137
161
template < typename T >
138
162
inline double operator ()(T val) {
@@ -168,7 +192,9 @@ namespace helpers {
168
192
} // namespace helpers
169
193
170
194
template < typename InputIterator >
171
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type sum (InputIterator begin, InputIterator end) {
195
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
196
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
197
+ sum (InputIterator begin, InputIterator end) {
172
198
173
199
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
174
200
typedef typename helpers::rtype< value_type > rtype;
@@ -191,7 +217,9 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
191
217
}
192
218
193
219
template < typename InputIterator >
194
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type sum_nona (InputIterator begin, InputIterator end) {
220
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
221
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
222
+ sum_nona (InputIterator begin, InputIterator end) {
195
223
196
224
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
197
225
typedef typename helpers::rtype< value_type > rtype;
@@ -210,7 +238,9 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
210
238
}
211
239
212
240
template < typename InputIterator >
213
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type prod (InputIterator begin, InputIterator end) {
241
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
242
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
243
+ prod (InputIterator begin, InputIterator end) {
214
244
215
245
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
216
246
typedef typename helpers::rtype< value_type > rtype;
@@ -233,7 +263,9 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
233
263
}
234
264
235
265
template < typename InputIterator >
236
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type prod_nona (InputIterator begin, InputIterator end) {
266
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
267
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
268
+ prod_nona (InputIterator begin, InputIterator end) {
237
269
238
270
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
239
271
typedef typename helpers::rtype< value_type > rtype;
@@ -252,7 +284,10 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
252
284
}
253
285
254
286
template < typename InputIterator >
255
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type max (InputIterator begin, InputIterator end) {
287
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
288
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
289
+ max (InputIterator begin, InputIterator end) {
290
+
256
291
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
257
292
typedef typename helpers::rtype< value_type > rtype;
258
293
@@ -274,7 +309,10 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
274
309
}
275
310
276
311
template < typename InputIterator >
277
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type max_nona (InputIterator begin, InputIterator end) {
312
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
313
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
314
+ max_nona (InputIterator begin, InputIterator end) {
315
+
278
316
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
279
317
typedef typename helpers::rtype< value_type > rtype;
280
318
@@ -292,7 +330,10 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
292
330
}
293
331
294
332
template < typename InputIterator >
295
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type min (InputIterator begin, InputIterator end) {
333
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
334
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
335
+ min (InputIterator begin, InputIterator end) {
336
+
296
337
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
297
338
typedef typename helpers::rtype< value_type > rtype;
298
339
@@ -314,7 +355,10 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
314
355
}
315
356
316
357
template < typename InputIterator >
317
- typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type min_nona (InputIterator begin, InputIterator end) {
358
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value,
359
+ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type >::type
360
+ min_nona (InputIterator begin, InputIterator end) {
361
+
318
362
typedef typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type value_type;
319
363
typedef typename helpers::rtype< value_type > rtype;
320
364
@@ -333,8 +377,9 @@ typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_t
333
377
334
378
// for REALSXP
335
379
template < typename InputIterator >
336
- typename traits::enable_if< traits::same_type< typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type, double >::value, double >::type
337
- mean (InputIterator begin, InputIterator end)
380
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value
381
+ && traits::same_type< typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type, double >::value, double >::type
382
+ mean (InputIterator begin, InputIterator end)
338
383
{
339
384
if (begin != end)
340
385
{
@@ -359,8 +404,9 @@ mean(InputIterator begin, InputIterator end)
359
404
360
405
// for LGLSXP and INTSXP
361
406
template < typename InputIterator >
362
- typename traits::enable_if< traits::same_type< typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type, int >::value, double >::type
363
- mean (InputIterator begin, InputIterator end)
407
+ typename traits::enable_if< helpers::decays_to_ctype< typename std::iterator_traits< InputIterator >::value_type >::value
408
+ && traits::same_type< typename helpers::ctype< typename std::iterator_traits< InputIterator >::value_type >::type, int >::value, double >::type
409
+ mean (InputIterator begin, InputIterator end)
364
410
{
365
411
if (begin != end)
366
412
{
0 commit comments