rice 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Doxyfile +1 -1
- data/Makefile.in +130 -52
- data/README +45 -79
- data/Rakefile +1 -36
- data/aclocal.m4 +133 -61
- data/config.guess +43 -8
- data/config.sub +41 -13
- data/configure +1370 -1898
- data/configure.ac +2 -2
- data/doxygen.ac +1 -1
- data/extconf.rb +3 -1
- data/rice/Arg_impl.hpp +2 -2
- data/rice/Data_Type.cpp +34 -1
- data/rice/Data_Type.ipp +14 -5
- data/rice/Data_Type_defn.hpp +28 -1
- data/rice/Director.cpp +0 -6
- data/rice/Director.hpp +0 -8
- data/rice/Hash.hpp +1 -1
- data/rice/Makefile.am +2 -12
- data/rice/Makefile.in +111 -88
- data/rice/Object.cpp +8 -1
- data/rice/Object.ipp +1 -1
- data/rice/Object_defn.hpp +8 -0
- data/rice/config.hpp +3 -0
- data/rice/config.hpp.in +3 -0
- data/rice/detail/Auto_Function_Wrapper.ipp +1025 -512
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +545 -272
- data/rice/detail/cfp.hpp +24 -0
- data/rice/detail/cfp.ipp +51 -0
- data/rice/detail/method_data.cpp +107 -336
- data/rice/detail/node.hpp +13 -13
- data/rice/detail/ruby.hpp +4 -0
- data/rice/detail/rubysig.hpp +19 -19
- data/rice/detail/traits.hpp +43 -0
- data/rice/generate_code.rb +37 -16
- data/rice/protect.hpp +1 -1
- data/rice/protect.ipp +448 -192
- data/rice/to_from_ruby.ipp +4 -12
- data/rice/to_from_ruby_defn.hpp +2 -2
- data/ruby/Makefile.in +99 -32
- data/ruby/lib/Makefile.in +61 -21
- data/ruby/lib/mkmf-rice.rb.in +9 -2
- data/ruby/lib/version.rb +1 -1
- data/sample/Makefile.in +33 -10
- data/test/Makefile.am +27 -0
- data/test/Makefile.in +270 -59
- data/test/ext/Makefile.am +43 -0
- data/test/ext/Makefile.in +399 -0
- data/test/ext/t1/Foo.hpp +10 -0
- data/test/ext/t1/extconf.rb +2 -0
- data/test/ext/t1/t1.cpp +15 -0
- data/test/ext/t2/extconf.rb +2 -0
- data/test/ext/t2/t2.cpp +11 -0
- data/test/test_Allocation_Strategies.cpp +1 -1
- data/test/test_Class.cpp +79 -0
- data/test/test_Data_Type.cpp +2 -2
- data/test/test_Director.cpp +114 -38
- data/test/test_Module.cpp +27 -2
- data/test/test_To_From_Ruby.cpp +4 -4
- data/test/test_rice.rb +9 -1
- metadata +23 -8
- data/rice/detail/method_data.cpp.rpp +0 -301
- data/rice/detail/mininode.cpp.rpp +0 -62
- data/rice/detail/mininode.hpp.rpp +0 -119
- data/rice/detail/remove_const.hpp +0 -21
data/rice/detail/node.hpp
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
#ifndef Rice__detail__node__hpp_
|
2
|
-
#define Rice__detail__node__hpp_
|
3
|
-
|
4
|
-
/**
|
5
|
-
* Helper header for the node.h ruby include file, which does
|
6
|
-
* not have extern "C"
|
7
|
-
*/
|
8
|
-
|
9
|
-
extern "C" {
|
10
|
-
#include "node.h"
|
11
|
-
}
|
12
|
-
|
13
|
-
#endif
|
1
|
+
#ifndef Rice__detail__node__hpp_
|
2
|
+
#define Rice__detail__node__hpp_
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Helper header for the node.h ruby include file, which does
|
6
|
+
* not have extern "C"
|
7
|
+
*/
|
8
|
+
|
9
|
+
extern "C" {
|
10
|
+
#include "node.h"
|
11
|
+
}
|
12
|
+
|
13
|
+
#endif
|
data/rice/detail/ruby.hpp
CHANGED
@@ -65,6 +65,10 @@ extern "C" typedef VALUE (*RUBY_VALUE_FUNC)(VALUE);
|
|
65
65
|
#define RHASH_TBL(hsh) RHASH(hsh)->tbl
|
66
66
|
#endif
|
67
67
|
|
68
|
+
#ifndef RCLASS_M_TBL
|
69
|
+
#define RCLASS_M_TBL(c) RCLASS(c)->m_tbl
|
70
|
+
#endif
|
71
|
+
|
68
72
|
// ruby.h has a few defines that conflict with Visual Studio's STL
|
69
73
|
#if defined(_MSC_VER)
|
70
74
|
#undef write
|
data/rice/detail/rubysig.hpp
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
#ifndef Rice__detail__rubysig__hpp_
|
2
|
-
#define Rice__detail__rubysig__hpp_
|
3
|
-
|
4
|
-
#include "ruby_version_code.hpp"
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Helper header for the rubysig.h ruby include file, which does
|
8
|
-
* not have extern "C"
|
9
|
-
*/
|
10
|
-
|
11
|
-
#if RICE__RUBY_VERSION_CODE < 190
|
12
|
-
|
13
|
-
extern "C" {
|
14
|
-
#include "rubysig.h"
|
15
|
-
}
|
16
|
-
|
17
|
-
#endif
|
18
|
-
|
19
|
-
#endif
|
1
|
+
#ifndef Rice__detail__rubysig__hpp_
|
2
|
+
#define Rice__detail__rubysig__hpp_
|
3
|
+
|
4
|
+
#include "ruby_version_code.hpp"
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Helper header for the rubysig.h ruby include file, which does
|
8
|
+
* not have extern "C"
|
9
|
+
*/
|
10
|
+
|
11
|
+
#if RICE__RUBY_VERSION_CODE < 190
|
12
|
+
|
13
|
+
extern "C" {
|
14
|
+
#include "rubysig.h"
|
15
|
+
}
|
16
|
+
|
17
|
+
#endif
|
18
|
+
|
19
|
+
#endif
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#ifndef Rice__detail__traits__hpp_
|
2
|
+
#define Rice__detail__traits__hpp_
|
3
|
+
|
4
|
+
namespace Rice
|
5
|
+
{
|
6
|
+
namespace detail
|
7
|
+
{
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Remove const from a type
|
11
|
+
*/
|
12
|
+
template<typename T>
|
13
|
+
struct remove_const { typedef T Type; };
|
14
|
+
|
15
|
+
template<typename T>
|
16
|
+
struct remove_const<const T> { typedef T Type; };
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Remove a reference from a type
|
20
|
+
*/
|
21
|
+
template<typename T>
|
22
|
+
struct remove_ref { typedef T Type; };
|
23
|
+
|
24
|
+
template<typename T>
|
25
|
+
struct remove_ref<T &> { typedef T Type; };
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Do both of the above in one easy step
|
29
|
+
*/
|
30
|
+
template<typename T>
|
31
|
+
struct sanitize
|
32
|
+
{
|
33
|
+
typedef T Type;
|
34
|
+
//typedef typename remove_const<
|
35
|
+
//typename remove_ref<T>::Type
|
36
|
+
//>::Type Type;
|
37
|
+
};
|
38
|
+
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
|
43
|
+
#endif // Rice__detail__traits__hpp_
|
data/rice/generate_code.rb
CHANGED
@@ -124,7 +124,7 @@ docstring = <<END
|
|
124
124
|
/*! E.g.:
|
125
125
|
* \\code
|
126
126
|
* VALUE x = protect(rb_ary_new);
|
127
|
-
* protect(rb_ary_push
|
127
|
+
* protect(rb_ary_push, x, INT2NUM(42));
|
128
128
|
* \\endcode
|
129
129
|
*
|
130
130
|
* Note that this function makes copies of all of its arguments; it
|
@@ -139,48 +139,64 @@ ipp_template = <<END
|
|
139
139
|
namespace detail
|
140
140
|
{
|
141
141
|
|
142
|
-
template<typename Fun%(typenames)>
|
142
|
+
template<typename Ret_T, typename Fun%(typenames)>
|
143
143
|
class Ruby_Function_%(j)
|
144
144
|
{
|
145
145
|
public:
|
146
146
|
Ruby_Function_%(j)(Fun f%(member_args));
|
147
|
-
inline
|
147
|
+
inline void operator()();
|
148
148
|
static inline VALUE call(Ruby_Function_%(j) * f);
|
149
|
+
Ret_T const & result() const { return result_; }
|
150
|
+
|
149
151
|
private:
|
150
152
|
Fun f_;
|
151
153
|
%(member_decls)
|
154
|
+
Ret_T result_; // TODO: use placement new
|
152
155
|
};
|
153
156
|
|
154
|
-
template<typename Fun%(typenames)>
|
155
|
-
inline Ruby_Function_%(j)<Fun%(types)>::
|
157
|
+
template<typename Ret_T, typename Fun%(typenames)>
|
158
|
+
inline Ruby_Function_%(j)<Ret_T, Fun%(types)>::
|
156
159
|
Ruby_Function_%(j)(Fun f%(member_args))
|
157
160
|
: f_(f)%(initializers)
|
158
161
|
{ }
|
159
162
|
|
160
|
-
template<typename Fun%(typenames)>
|
161
|
-
inline
|
163
|
+
template<typename Ret_T, typename Fun%(typenames)>
|
164
|
+
inline void Ruby_Function_%(j)<Ret_T, Fun%(types)>::
|
162
165
|
operator()()
|
163
166
|
{
|
164
|
-
|
167
|
+
result_ = f_(%(member_params));
|
165
168
|
}
|
166
169
|
|
167
|
-
template<typename Fun%(typenames)>
|
168
|
-
inline VALUE Ruby_Function_%(j)<Fun%(types)>::
|
170
|
+
template<typename Ret_T, typename Fun%(typenames)>
|
171
|
+
inline VALUE Ruby_Function_%(j)<Ret_T, Fun%(types)>::
|
169
172
|
call(Ruby_Function_%(j) * f)
|
170
173
|
{
|
171
|
-
|
174
|
+
(*f)();
|
175
|
+
return Qnil;
|
172
176
|
}
|
173
177
|
|
174
178
|
} // namespace detail
|
175
179
|
|
180
|
+
template<typename Ret_T, typename Fun%(typenames)>
|
181
|
+
inline Ret_T protect(Fun fun%(args))
|
182
|
+
{
|
183
|
+
typedef detail::Ruby_Function_%(j)<Ret_T, Fun%(types)> RF;
|
184
|
+
RF f(fun%(params));
|
185
|
+
detail::protect(
|
186
|
+
RUBY_VALUE_FUNC(RF::call),
|
187
|
+
reinterpret_cast<VALUE>(&f));
|
188
|
+
return f.result();
|
189
|
+
}
|
190
|
+
|
176
191
|
template<typename Fun%(typenames)>
|
177
192
|
inline VALUE protect(Fun fun%(args))
|
178
193
|
{
|
179
|
-
typedef detail::Ruby_Function_%(j)<Fun%(types)> RF;
|
194
|
+
typedef detail::Ruby_Function_%(j)<VALUE, Fun%(types)> RF;
|
180
195
|
RF f(fun%(params));
|
181
|
-
|
196
|
+
detail::protect(
|
182
197
|
RUBY_VALUE_FUNC(RF::call),
|
183
198
|
reinterpret_cast<VALUE>(&f));
|
199
|
+
return f.result();
|
184
200
|
}
|
185
201
|
|
186
202
|
// ---------------------------------------------------------------------
|
@@ -521,6 +537,7 @@ ipp_head = <<END
|
|
521
537
|
#include "method_data.hpp"
|
522
538
|
#include "../ruby_try_catch.hpp"
|
523
539
|
#include "../to_from_ruby.hpp"
|
540
|
+
#include "traits.hpp"
|
524
541
|
END
|
525
542
|
ipp_tail = <<END
|
526
543
|
template<typename Func_T, typename Ret_T>
|
@@ -669,11 +686,13 @@ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
|
|
669
686
|
scan_args_list = t_array.map { |x| ", &varg#{x}"}
|
670
687
|
typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
|
671
688
|
arg_convert_list = t_array.map do |x|
|
672
|
-
"
|
689
|
+
"typedef typename sanitize< Arg#{x}_T >::Type Arg#{x}_Type;\n\t\t" +
|
690
|
+
"Arg#{x}_Type arg#{x} = args->getArgumentOrDefault<Arg#{x}_Type>(#{x}, varg#{x});"
|
673
691
|
end.join("\n\t\t\t")
|
674
692
|
self_arg_convert_list = (0...j).to_a.map do |x|
|
675
693
|
n = x + 1
|
676
|
-
"Arg#{n}_T
|
694
|
+
"typedef typename sanitize< Arg#{n}_T >::Type Arg#{n}_Type;\n\t\t" +
|
695
|
+
"Arg#{n}_Type arg#{n} = args->getArgumentOrDefault<Arg#{n}_Type>(#{x}, varg#{x});"
|
677
696
|
end.join("\n\t\t\t")
|
678
697
|
if j == MAX_ARGS then
|
679
698
|
typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
|
@@ -1045,6 +1064,7 @@ ipp_head = <<END
|
|
1045
1064
|
#include "method_data.hpp"
|
1046
1065
|
#include "../ruby_try_catch.hpp"
|
1047
1066
|
#include "../to_from_ruby.hpp"
|
1067
|
+
#include "traits.hpp"
|
1048
1068
|
#include <typeinfo>
|
1049
1069
|
END
|
1050
1070
|
ipp_filename = 'detail/Auto_Member_Function_Wrapper.ipp'
|
@@ -1059,7 +1079,8 @@ wrap_header(hpp_filename, 'Rice::detail', docstring, true) do |hpp|
|
|
1059
1079
|
typenames = t_array.map { |x| ", Arg#{x}_T" }
|
1060
1080
|
typenames_n = t_array.map { |x| "Arg#{x}_T" }.join(', ')
|
1061
1081
|
arg_convert_list = t_array.map do |x|
|
1062
|
-
"
|
1082
|
+
"typedef typename sanitize< Arg#{x}_T >::Type Arg#{x}_Type;\n\t\t" +
|
1083
|
+
"Arg#{x}_Type arg#{x} = args->getArgumentOrDefault<Arg#{x}_Type>(#{x}, varg#{x});"
|
1063
1084
|
end.join("\n\t\t")
|
1064
1085
|
if j == MAX_ARGS then
|
1065
1086
|
typename_list = t_array.map { |x| ", typename Arg#{x}_T" }.join
|
data/rice/protect.hpp
CHANGED
data/rice/protect.ipp
CHANGED
@@ -14,48 +14,64 @@ namespace Rice
|
|
14
14
|
namespace detail
|
15
15
|
{
|
16
16
|
|
17
|
-
template<typename Fun>
|
17
|
+
template<typename Ret_T, typename Fun>
|
18
18
|
class Ruby_Function_0
|
19
19
|
{
|
20
20
|
public:
|
21
21
|
Ruby_Function_0(Fun f);
|
22
|
-
inline
|
22
|
+
inline void operator()();
|
23
23
|
static inline VALUE call(Ruby_Function_0 * f);
|
24
|
+
Ret_T const & result() const { return result_; }
|
25
|
+
|
24
26
|
private:
|
25
27
|
Fun f_;
|
26
28
|
|
29
|
+
Ret_T result_; // TODO: use placement new
|
27
30
|
};
|
28
31
|
|
29
|
-
template<typename Fun>
|
30
|
-
inline Ruby_Function_0<Fun>::
|
32
|
+
template<typename Ret_T, typename Fun>
|
33
|
+
inline Ruby_Function_0<Ret_T, Fun>::
|
31
34
|
Ruby_Function_0(Fun f)
|
32
35
|
: f_(f)
|
33
36
|
{ }
|
34
37
|
|
35
|
-
template<typename Fun>
|
36
|
-
inline
|
38
|
+
template<typename Ret_T, typename Fun>
|
39
|
+
inline void Ruby_Function_0<Ret_T, Fun>::
|
37
40
|
operator()()
|
38
41
|
{
|
39
|
-
|
42
|
+
result_ = f_();
|
40
43
|
}
|
41
44
|
|
42
|
-
template<typename Fun>
|
43
|
-
inline VALUE Ruby_Function_0<Fun>::
|
45
|
+
template<typename Ret_T, typename Fun>
|
46
|
+
inline VALUE Ruby_Function_0<Ret_T, Fun>::
|
44
47
|
call(Ruby_Function_0 * f)
|
45
48
|
{
|
46
|
-
|
49
|
+
(*f)();
|
50
|
+
return Qnil;
|
47
51
|
}
|
48
52
|
|
49
53
|
} // namespace detail
|
50
54
|
|
55
|
+
template<typename Ret_T, typename Fun>
|
56
|
+
inline Ret_T protect(Fun fun)
|
57
|
+
{
|
58
|
+
typedef detail::Ruby_Function_0<Ret_T, Fun> RF;
|
59
|
+
RF f(fun);
|
60
|
+
detail::protect(
|
61
|
+
RUBY_VALUE_FUNC(RF::call),
|
62
|
+
reinterpret_cast<VALUE>(&f));
|
63
|
+
return f.result();
|
64
|
+
}
|
65
|
+
|
51
66
|
template<typename Fun>
|
52
67
|
inline VALUE protect(Fun fun)
|
53
68
|
{
|
54
|
-
typedef detail::Ruby_Function_0<Fun> RF;
|
69
|
+
typedef detail::Ruby_Function_0<VALUE, Fun> RF;
|
55
70
|
RF f(fun);
|
56
|
-
|
71
|
+
detail::protect(
|
57
72
|
RUBY_VALUE_FUNC(RF::call),
|
58
73
|
reinterpret_cast<VALUE>(&f));
|
74
|
+
return f.result();
|
59
75
|
}
|
60
76
|
|
61
77
|
// ---------------------------------------------------------------------
|
@@ -63,48 +79,64 @@ inline VALUE protect(Fun fun)
|
|
63
79
|
namespace detail
|
64
80
|
{
|
65
81
|
|
66
|
-
template<typename Fun, typename T1>
|
82
|
+
template<typename Ret_T, typename Fun, typename T1>
|
67
83
|
class Ruby_Function_1
|
68
84
|
{
|
69
85
|
public:
|
70
86
|
Ruby_Function_1(Fun f, T1 const & t1);
|
71
|
-
inline
|
87
|
+
inline void operator()();
|
72
88
|
static inline VALUE call(Ruby_Function_1 * f);
|
89
|
+
Ret_T const & result() const { return result_; }
|
90
|
+
|
73
91
|
private:
|
74
92
|
Fun f_;
|
75
93
|
T1 const & t1_;
|
94
|
+
Ret_T result_; // TODO: use placement new
|
76
95
|
};
|
77
96
|
|
78
|
-
template<typename Fun, typename T1>
|
79
|
-
inline Ruby_Function_1<Fun, T1>::
|
97
|
+
template<typename Ret_T, typename Fun, typename T1>
|
98
|
+
inline Ruby_Function_1<Ret_T, Fun, T1>::
|
80
99
|
Ruby_Function_1(Fun f, T1 const & t1)
|
81
100
|
: f_(f), t1_(t1)
|
82
101
|
{ }
|
83
102
|
|
84
|
-
template<typename Fun, typename T1>
|
85
|
-
inline
|
103
|
+
template<typename Ret_T, typename Fun, typename T1>
|
104
|
+
inline void Ruby_Function_1<Ret_T, Fun, T1>::
|
86
105
|
operator()()
|
87
106
|
{
|
88
|
-
|
107
|
+
result_ = f_(t1_);
|
89
108
|
}
|
90
109
|
|
91
|
-
template<typename Fun, typename T1>
|
92
|
-
inline VALUE Ruby_Function_1<Fun, T1>::
|
110
|
+
template<typename Ret_T, typename Fun, typename T1>
|
111
|
+
inline VALUE Ruby_Function_1<Ret_T, Fun, T1>::
|
93
112
|
call(Ruby_Function_1 * f)
|
94
113
|
{
|
95
|
-
|
114
|
+
(*f)();
|
115
|
+
return Qnil;
|
96
116
|
}
|
97
117
|
|
98
118
|
} // namespace detail
|
99
119
|
|
120
|
+
template<typename Ret_T, typename Fun, typename T1>
|
121
|
+
inline Ret_T protect(Fun fun, T1 const & t1)
|
122
|
+
{
|
123
|
+
typedef detail::Ruby_Function_1<Ret_T, Fun, T1> RF;
|
124
|
+
RF f(fun, t1);
|
125
|
+
detail::protect(
|
126
|
+
RUBY_VALUE_FUNC(RF::call),
|
127
|
+
reinterpret_cast<VALUE>(&f));
|
128
|
+
return f.result();
|
129
|
+
}
|
130
|
+
|
100
131
|
template<typename Fun, typename T1>
|
101
132
|
inline VALUE protect(Fun fun, T1 const & t1)
|
102
133
|
{
|
103
|
-
typedef detail::Ruby_Function_1<Fun, T1> RF;
|
134
|
+
typedef detail::Ruby_Function_1<VALUE, Fun, T1> RF;
|
104
135
|
RF f(fun, t1);
|
105
|
-
|
136
|
+
detail::protect(
|
106
137
|
RUBY_VALUE_FUNC(RF::call),
|
107
138
|
reinterpret_cast<VALUE>(&f));
|
139
|
+
return f.result();
|
108
140
|
}
|
109
141
|
|
110
142
|
// ---------------------------------------------------------------------
|
@@ -112,48 +144,64 @@ inline VALUE protect(Fun fun, T1 const & t1)
|
|
112
144
|
namespace detail
|
113
145
|
{
|
114
146
|
|
115
|
-
template<typename Fun, typename T1, typename T2>
|
147
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2>
|
116
148
|
class Ruby_Function_2
|
117
149
|
{
|
118
150
|
public:
|
119
151
|
Ruby_Function_2(Fun f, T1 const & t1, T2 const & t2);
|
120
|
-
inline
|
152
|
+
inline void operator()();
|
121
153
|
static inline VALUE call(Ruby_Function_2 * f);
|
154
|
+
Ret_T const & result() const { return result_; }
|
155
|
+
|
122
156
|
private:
|
123
157
|
Fun f_;
|
124
158
|
T1 const & t1_; T2 const & t2_;
|
159
|
+
Ret_T result_; // TODO: use placement new
|
125
160
|
};
|
126
161
|
|
127
|
-
template<typename Fun, typename T1, typename T2>
|
128
|
-
inline Ruby_Function_2<Fun, T1, T2>::
|
162
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2>
|
163
|
+
inline Ruby_Function_2<Ret_T, Fun, T1, T2>::
|
129
164
|
Ruby_Function_2(Fun f, T1 const & t1, T2 const & t2)
|
130
165
|
: f_(f), t1_(t1), t2_(t2)
|
131
166
|
{ }
|
132
167
|
|
133
|
-
template<typename Fun, typename T1, typename T2>
|
134
|
-
inline
|
168
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2>
|
169
|
+
inline void Ruby_Function_2<Ret_T, Fun, T1, T2>::
|
135
170
|
operator()()
|
136
171
|
{
|
137
|
-
|
172
|
+
result_ = f_(t1_, t2_);
|
138
173
|
}
|
139
174
|
|
140
|
-
template<typename Fun, typename T1, typename T2>
|
141
|
-
inline VALUE Ruby_Function_2<Fun, T1, T2>::
|
175
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2>
|
176
|
+
inline VALUE Ruby_Function_2<Ret_T, Fun, T1, T2>::
|
142
177
|
call(Ruby_Function_2 * f)
|
143
178
|
{
|
144
|
-
|
179
|
+
(*f)();
|
180
|
+
return Qnil;
|
145
181
|
}
|
146
182
|
|
147
183
|
} // namespace detail
|
148
184
|
|
185
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2>
|
186
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2)
|
187
|
+
{
|
188
|
+
typedef detail::Ruby_Function_2<Ret_T, Fun, T1, T2> RF;
|
189
|
+
RF f(fun, t1, t2);
|
190
|
+
detail::protect(
|
191
|
+
RUBY_VALUE_FUNC(RF::call),
|
192
|
+
reinterpret_cast<VALUE>(&f));
|
193
|
+
return f.result();
|
194
|
+
}
|
195
|
+
|
149
196
|
template<typename Fun, typename T1, typename T2>
|
150
197
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2)
|
151
198
|
{
|
152
|
-
typedef detail::Ruby_Function_2<Fun, T1, T2> RF;
|
199
|
+
typedef detail::Ruby_Function_2<VALUE, Fun, T1, T2> RF;
|
153
200
|
RF f(fun, t1, t2);
|
154
|
-
|
201
|
+
detail::protect(
|
155
202
|
RUBY_VALUE_FUNC(RF::call),
|
156
203
|
reinterpret_cast<VALUE>(&f));
|
204
|
+
return f.result();
|
157
205
|
}
|
158
206
|
|
159
207
|
// ---------------------------------------------------------------------
|
@@ -161,48 +209,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2)
|
|
161
209
|
namespace detail
|
162
210
|
{
|
163
211
|
|
164
|
-
template<typename Fun, typename T1, typename T2, typename T3>
|
212
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
|
165
213
|
class Ruby_Function_3
|
166
214
|
{
|
167
215
|
public:
|
168
216
|
Ruby_Function_3(Fun f, T1 const & t1, T2 const & t2, T3 const & t3);
|
169
|
-
inline
|
217
|
+
inline void operator()();
|
170
218
|
static inline VALUE call(Ruby_Function_3 * f);
|
219
|
+
Ret_T const & result() const { return result_; }
|
220
|
+
|
171
221
|
private:
|
172
222
|
Fun f_;
|
173
223
|
T1 const & t1_; T2 const & t2_; T3 const & t3_;
|
224
|
+
Ret_T result_; // TODO: use placement new
|
174
225
|
};
|
175
226
|
|
176
|
-
template<typename Fun, typename T1, typename T2, typename T3>
|
177
|
-
inline Ruby_Function_3<Fun, T1, T2, T3>::
|
227
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
|
228
|
+
inline Ruby_Function_3<Ret_T, Fun, T1, T2, T3>::
|
178
229
|
Ruby_Function_3(Fun f, T1 const & t1, T2 const & t2, T3 const & t3)
|
179
230
|
: f_(f), t1_(t1), t2_(t2), t3_(t3)
|
180
231
|
{ }
|
181
232
|
|
182
|
-
template<typename Fun, typename T1, typename T2, typename T3>
|
183
|
-
inline
|
233
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
|
234
|
+
inline void Ruby_Function_3<Ret_T, Fun, T1, T2, T3>::
|
184
235
|
operator()()
|
185
236
|
{
|
186
|
-
|
237
|
+
result_ = f_(t1_, t2_, t3_);
|
187
238
|
}
|
188
239
|
|
189
|
-
template<typename Fun, typename T1, typename T2, typename T3>
|
190
|
-
inline VALUE Ruby_Function_3<Fun, T1, T2, T3>::
|
240
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
|
241
|
+
inline VALUE Ruby_Function_3<Ret_T, Fun, T1, T2, T3>::
|
191
242
|
call(Ruby_Function_3 * f)
|
192
243
|
{
|
193
|
-
|
244
|
+
(*f)();
|
245
|
+
return Qnil;
|
194
246
|
}
|
195
247
|
|
196
248
|
} // namespace detail
|
197
249
|
|
250
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
|
251
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3)
|
252
|
+
{
|
253
|
+
typedef detail::Ruby_Function_3<Ret_T, Fun, T1, T2, T3> RF;
|
254
|
+
RF f(fun, t1, t2, t3);
|
255
|
+
detail::protect(
|
256
|
+
RUBY_VALUE_FUNC(RF::call),
|
257
|
+
reinterpret_cast<VALUE>(&f));
|
258
|
+
return f.result();
|
259
|
+
}
|
260
|
+
|
198
261
|
template<typename Fun, typename T1, typename T2, typename T3>
|
199
262
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3)
|
200
263
|
{
|
201
|
-
typedef detail::Ruby_Function_3<Fun, T1, T2, T3> RF;
|
264
|
+
typedef detail::Ruby_Function_3<VALUE, Fun, T1, T2, T3> RF;
|
202
265
|
RF f(fun, t1, t2, t3);
|
203
|
-
|
266
|
+
detail::protect(
|
204
267
|
RUBY_VALUE_FUNC(RF::call),
|
205
268
|
reinterpret_cast<VALUE>(&f));
|
269
|
+
return f.result();
|
206
270
|
}
|
207
271
|
|
208
272
|
// ---------------------------------------------------------------------
|
@@ -210,48 +274,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3)
|
|
210
274
|
namespace detail
|
211
275
|
{
|
212
276
|
|
213
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4>
|
277
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
|
214
278
|
class Ruby_Function_4
|
215
279
|
{
|
216
280
|
public:
|
217
281
|
Ruby_Function_4(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4);
|
218
|
-
inline
|
282
|
+
inline void operator()();
|
219
283
|
static inline VALUE call(Ruby_Function_4 * f);
|
284
|
+
Ret_T const & result() const { return result_; }
|
285
|
+
|
220
286
|
private:
|
221
287
|
Fun f_;
|
222
288
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_;
|
289
|
+
Ret_T result_; // TODO: use placement new
|
223
290
|
};
|
224
291
|
|
225
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4>
|
226
|
-
inline Ruby_Function_4<Fun, T1, T2, T3, T4>::
|
292
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
|
293
|
+
inline Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4>::
|
227
294
|
Ruby_Function_4(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
|
228
295
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4)
|
229
296
|
{ }
|
230
297
|
|
231
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4>
|
232
|
-
inline
|
298
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
|
299
|
+
inline void Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4>::
|
233
300
|
operator()()
|
234
301
|
{
|
235
|
-
|
302
|
+
result_ = f_(t1_, t2_, t3_, t4_);
|
236
303
|
}
|
237
304
|
|
238
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4>
|
239
|
-
inline VALUE Ruby_Function_4<Fun, T1, T2, T3, T4>::
|
305
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
|
306
|
+
inline VALUE Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4>::
|
240
307
|
call(Ruby_Function_4 * f)
|
241
308
|
{
|
242
|
-
|
309
|
+
(*f)();
|
310
|
+
return Qnil;
|
243
311
|
}
|
244
312
|
|
245
313
|
} // namespace detail
|
246
314
|
|
315
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
|
316
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
|
317
|
+
{
|
318
|
+
typedef detail::Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4> RF;
|
319
|
+
RF f(fun, t1, t2, t3, t4);
|
320
|
+
detail::protect(
|
321
|
+
RUBY_VALUE_FUNC(RF::call),
|
322
|
+
reinterpret_cast<VALUE>(&f));
|
323
|
+
return f.result();
|
324
|
+
}
|
325
|
+
|
247
326
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4>
|
248
327
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
|
249
328
|
{
|
250
|
-
typedef detail::Ruby_Function_4<Fun, T1, T2, T3, T4> RF;
|
329
|
+
typedef detail::Ruby_Function_4<VALUE, Fun, T1, T2, T3, T4> RF;
|
251
330
|
RF f(fun, t1, t2, t3, t4);
|
252
|
-
|
331
|
+
detail::protect(
|
253
332
|
RUBY_VALUE_FUNC(RF::call),
|
254
333
|
reinterpret_cast<VALUE>(&f));
|
334
|
+
return f.result();
|
255
335
|
}
|
256
336
|
|
257
337
|
// ---------------------------------------------------------------------
|
@@ -259,48 +339,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
259
339
|
namespace detail
|
260
340
|
{
|
261
341
|
|
262
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
342
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
263
343
|
class Ruby_Function_5
|
264
344
|
{
|
265
345
|
public:
|
266
346
|
Ruby_Function_5(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5);
|
267
|
-
inline
|
347
|
+
inline void operator()();
|
268
348
|
static inline VALUE call(Ruby_Function_5 * f);
|
349
|
+
Ret_T const & result() const { return result_; }
|
350
|
+
|
269
351
|
private:
|
270
352
|
Fun f_;
|
271
353
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_;
|
354
|
+
Ret_T result_; // TODO: use placement new
|
272
355
|
};
|
273
356
|
|
274
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
275
|
-
inline Ruby_Function_5<Fun, T1, T2, T3, T4, T5>::
|
357
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
358
|
+
inline Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5>::
|
276
359
|
Ruby_Function_5(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
|
277
360
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5)
|
278
361
|
{ }
|
279
362
|
|
280
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
281
|
-
inline
|
363
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
364
|
+
inline void Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5>::
|
282
365
|
operator()()
|
283
366
|
{
|
284
|
-
|
367
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_);
|
285
368
|
}
|
286
369
|
|
287
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
288
|
-
inline VALUE Ruby_Function_5<Fun, T1, T2, T3, T4, T5>::
|
370
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
371
|
+
inline VALUE Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5>::
|
289
372
|
call(Ruby_Function_5 * f)
|
290
373
|
{
|
291
|
-
|
374
|
+
(*f)();
|
375
|
+
return Qnil;
|
292
376
|
}
|
293
377
|
|
294
378
|
} // namespace detail
|
295
379
|
|
380
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
381
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
|
382
|
+
{
|
383
|
+
typedef detail::Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5> RF;
|
384
|
+
RF f(fun, t1, t2, t3, t4, t5);
|
385
|
+
detail::protect(
|
386
|
+
RUBY_VALUE_FUNC(RF::call),
|
387
|
+
reinterpret_cast<VALUE>(&f));
|
388
|
+
return f.result();
|
389
|
+
}
|
390
|
+
|
296
391
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
|
297
392
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
|
298
393
|
{
|
299
|
-
typedef detail::Ruby_Function_5<Fun, T1, T2, T3, T4, T5> RF;
|
394
|
+
typedef detail::Ruby_Function_5<VALUE, Fun, T1, T2, T3, T4, T5> RF;
|
300
395
|
RF f(fun, t1, t2, t3, t4, t5);
|
301
|
-
|
396
|
+
detail::protect(
|
302
397
|
RUBY_VALUE_FUNC(RF::call),
|
303
398
|
reinterpret_cast<VALUE>(&f));
|
399
|
+
return f.result();
|
304
400
|
}
|
305
401
|
|
306
402
|
// ---------------------------------------------------------------------
|
@@ -308,48 +404,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
308
404
|
namespace detail
|
309
405
|
{
|
310
406
|
|
311
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
407
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
312
408
|
class Ruby_Function_6
|
313
409
|
{
|
314
410
|
public:
|
315
411
|
Ruby_Function_6(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6);
|
316
|
-
inline
|
412
|
+
inline void operator()();
|
317
413
|
static inline VALUE call(Ruby_Function_6 * f);
|
414
|
+
Ret_T const & result() const { return result_; }
|
415
|
+
|
318
416
|
private:
|
319
417
|
Fun f_;
|
320
418
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_;
|
419
|
+
Ret_T result_; // TODO: use placement new
|
321
420
|
};
|
322
421
|
|
323
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
324
|
-
inline Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6>::
|
422
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
423
|
+
inline Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6>::
|
325
424
|
Ruby_Function_6(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
|
326
425
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6)
|
327
426
|
{ }
|
328
427
|
|
329
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
330
|
-
inline
|
428
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
429
|
+
inline void Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6>::
|
331
430
|
operator()()
|
332
431
|
{
|
333
|
-
|
432
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_);
|
334
433
|
}
|
335
434
|
|
336
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
337
|
-
inline VALUE Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6>::
|
435
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
436
|
+
inline VALUE Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6>::
|
338
437
|
call(Ruby_Function_6 * f)
|
339
438
|
{
|
340
|
-
|
439
|
+
(*f)();
|
440
|
+
return Qnil;
|
341
441
|
}
|
342
442
|
|
343
443
|
} // namespace detail
|
344
444
|
|
445
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
446
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
|
447
|
+
{
|
448
|
+
typedef detail::Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6> RF;
|
449
|
+
RF f(fun, t1, t2, t3, t4, t5, t6);
|
450
|
+
detail::protect(
|
451
|
+
RUBY_VALUE_FUNC(RF::call),
|
452
|
+
reinterpret_cast<VALUE>(&f));
|
453
|
+
return f.result();
|
454
|
+
}
|
455
|
+
|
345
456
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
346
457
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
|
347
458
|
{
|
348
|
-
typedef detail::Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6> RF;
|
459
|
+
typedef detail::Ruby_Function_6<VALUE, Fun, T1, T2, T3, T4, T5, T6> RF;
|
349
460
|
RF f(fun, t1, t2, t3, t4, t5, t6);
|
350
|
-
|
461
|
+
detail::protect(
|
351
462
|
RUBY_VALUE_FUNC(RF::call),
|
352
463
|
reinterpret_cast<VALUE>(&f));
|
464
|
+
return f.result();
|
353
465
|
}
|
354
466
|
|
355
467
|
// ---------------------------------------------------------------------
|
@@ -357,48 +469,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
357
469
|
namespace detail
|
358
470
|
{
|
359
471
|
|
360
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
472
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
361
473
|
class Ruby_Function_7
|
362
474
|
{
|
363
475
|
public:
|
364
476
|
Ruby_Function_7(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7);
|
365
|
-
inline
|
477
|
+
inline void operator()();
|
366
478
|
static inline VALUE call(Ruby_Function_7 * f);
|
479
|
+
Ret_T const & result() const { return result_; }
|
480
|
+
|
367
481
|
private:
|
368
482
|
Fun f_;
|
369
483
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_;
|
484
|
+
Ret_T result_; // TODO: use placement new
|
370
485
|
};
|
371
486
|
|
372
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
373
|
-
inline Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7>::
|
487
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
488
|
+
inline Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7>::
|
374
489
|
Ruby_Function_7(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
|
375
490
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7)
|
376
491
|
{ }
|
377
492
|
|
378
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
379
|
-
inline
|
493
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
494
|
+
inline void Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7>::
|
380
495
|
operator()()
|
381
496
|
{
|
382
|
-
|
497
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_);
|
383
498
|
}
|
384
499
|
|
385
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
386
|
-
inline VALUE Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7>::
|
500
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
501
|
+
inline VALUE Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7>::
|
387
502
|
call(Ruby_Function_7 * f)
|
388
503
|
{
|
389
|
-
|
504
|
+
(*f)();
|
505
|
+
return Qnil;
|
390
506
|
}
|
391
507
|
|
392
508
|
} // namespace detail
|
393
509
|
|
510
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
511
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
|
512
|
+
{
|
513
|
+
typedef detail::Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7> RF;
|
514
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7);
|
515
|
+
detail::protect(
|
516
|
+
RUBY_VALUE_FUNC(RF::call),
|
517
|
+
reinterpret_cast<VALUE>(&f));
|
518
|
+
return f.result();
|
519
|
+
}
|
520
|
+
|
394
521
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
395
522
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
|
396
523
|
{
|
397
|
-
typedef detail::Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7> RF;
|
524
|
+
typedef detail::Ruby_Function_7<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7> RF;
|
398
525
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7);
|
399
|
-
|
526
|
+
detail::protect(
|
400
527
|
RUBY_VALUE_FUNC(RF::call),
|
401
528
|
reinterpret_cast<VALUE>(&f));
|
529
|
+
return f.result();
|
402
530
|
}
|
403
531
|
|
404
532
|
// ---------------------------------------------------------------------
|
@@ -406,48 +534,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
406
534
|
namespace detail
|
407
535
|
{
|
408
536
|
|
409
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
537
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
410
538
|
class Ruby_Function_8
|
411
539
|
{
|
412
540
|
public:
|
413
541
|
Ruby_Function_8(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8);
|
414
|
-
inline
|
542
|
+
inline void operator()();
|
415
543
|
static inline VALUE call(Ruby_Function_8 * f);
|
544
|
+
Ret_T const & result() const { return result_; }
|
545
|
+
|
416
546
|
private:
|
417
547
|
Fun f_;
|
418
548
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_;
|
549
|
+
Ret_T result_; // TODO: use placement new
|
419
550
|
};
|
420
551
|
|
421
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
422
|
-
inline Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
|
552
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
553
|
+
inline Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
|
423
554
|
Ruby_Function_8(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
|
424
555
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8)
|
425
556
|
{ }
|
426
557
|
|
427
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
428
|
-
inline
|
558
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
559
|
+
inline void Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
|
429
560
|
operator()()
|
430
561
|
{
|
431
|
-
|
562
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_);
|
432
563
|
}
|
433
564
|
|
434
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
435
|
-
inline VALUE Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
|
565
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
566
|
+
inline VALUE Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
|
436
567
|
call(Ruby_Function_8 * f)
|
437
568
|
{
|
438
|
-
|
569
|
+
(*f)();
|
570
|
+
return Qnil;
|
439
571
|
}
|
440
572
|
|
441
573
|
} // namespace detail
|
442
574
|
|
575
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
576
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
|
577
|
+
{
|
578
|
+
typedef detail::Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8> RF;
|
579
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8);
|
580
|
+
detail::protect(
|
581
|
+
RUBY_VALUE_FUNC(RF::call),
|
582
|
+
reinterpret_cast<VALUE>(&f));
|
583
|
+
return f.result();
|
584
|
+
}
|
585
|
+
|
443
586
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
444
587
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
|
445
588
|
{
|
446
|
-
typedef detail::Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8> RF;
|
589
|
+
typedef detail::Ruby_Function_8<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8> RF;
|
447
590
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8);
|
448
|
-
|
591
|
+
detail::protect(
|
449
592
|
RUBY_VALUE_FUNC(RF::call),
|
450
593
|
reinterpret_cast<VALUE>(&f));
|
594
|
+
return f.result();
|
451
595
|
}
|
452
596
|
|
453
597
|
// ---------------------------------------------------------------------
|
@@ -455,48 +599,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
455
599
|
namespace detail
|
456
600
|
{
|
457
601
|
|
458
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
602
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
459
603
|
class Ruby_Function_9
|
460
604
|
{
|
461
605
|
public:
|
462
606
|
Ruby_Function_9(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9);
|
463
|
-
inline
|
607
|
+
inline void operator()();
|
464
608
|
static inline VALUE call(Ruby_Function_9 * f);
|
609
|
+
Ret_T const & result() const { return result_; }
|
610
|
+
|
465
611
|
private:
|
466
612
|
Fun f_;
|
467
613
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_;
|
614
|
+
Ret_T result_; // TODO: use placement new
|
468
615
|
};
|
469
616
|
|
470
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
471
|
-
inline Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
|
617
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
618
|
+
inline Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
|
472
619
|
Ruby_Function_9(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
|
473
620
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9)
|
474
621
|
{ }
|
475
622
|
|
476
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
477
|
-
inline
|
623
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
624
|
+
inline void Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
|
478
625
|
operator()()
|
479
626
|
{
|
480
|
-
|
627
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_);
|
481
628
|
}
|
482
629
|
|
483
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
484
|
-
inline VALUE Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
|
630
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
631
|
+
inline VALUE Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
|
485
632
|
call(Ruby_Function_9 * f)
|
486
633
|
{
|
487
|
-
|
634
|
+
(*f)();
|
635
|
+
return Qnil;
|
488
636
|
}
|
489
637
|
|
490
638
|
} // namespace detail
|
491
639
|
|
640
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
641
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
|
642
|
+
{
|
643
|
+
typedef detail::Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9> RF;
|
644
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9);
|
645
|
+
detail::protect(
|
646
|
+
RUBY_VALUE_FUNC(RF::call),
|
647
|
+
reinterpret_cast<VALUE>(&f));
|
648
|
+
return f.result();
|
649
|
+
}
|
650
|
+
|
492
651
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
|
493
652
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
|
494
653
|
{
|
495
|
-
typedef detail::Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9> RF;
|
654
|
+
typedef detail::Ruby_Function_9<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9> RF;
|
496
655
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9);
|
497
|
-
|
656
|
+
detail::protect(
|
498
657
|
RUBY_VALUE_FUNC(RF::call),
|
499
658
|
reinterpret_cast<VALUE>(&f));
|
659
|
+
return f.result();
|
500
660
|
}
|
501
661
|
|
502
662
|
// ---------------------------------------------------------------------
|
@@ -504,48 +664,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
504
664
|
namespace detail
|
505
665
|
{
|
506
666
|
|
507
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
667
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
508
668
|
class Ruby_Function_10
|
509
669
|
{
|
510
670
|
public:
|
511
671
|
Ruby_Function_10(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10);
|
512
|
-
inline
|
672
|
+
inline void operator()();
|
513
673
|
static inline VALUE call(Ruby_Function_10 * f);
|
674
|
+
Ret_T const & result() const { return result_; }
|
675
|
+
|
514
676
|
private:
|
515
677
|
Fun f_;
|
516
678
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_;
|
679
|
+
Ret_T result_; // TODO: use placement new
|
517
680
|
};
|
518
681
|
|
519
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
520
|
-
inline Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
|
682
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
683
|
+
inline Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
|
521
684
|
Ruby_Function_10(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
|
522
685
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10)
|
523
686
|
{ }
|
524
687
|
|
525
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
526
|
-
inline
|
688
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
689
|
+
inline void Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
|
527
690
|
operator()()
|
528
691
|
{
|
529
|
-
|
692
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_);
|
530
693
|
}
|
531
694
|
|
532
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
533
|
-
inline VALUE Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
|
695
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
696
|
+
inline VALUE Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
|
534
697
|
call(Ruby_Function_10 * f)
|
535
698
|
{
|
536
|
-
|
699
|
+
(*f)();
|
700
|
+
return Qnil;
|
537
701
|
}
|
538
702
|
|
539
703
|
} // namespace detail
|
540
704
|
|
705
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
706
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
|
707
|
+
{
|
708
|
+
typedef detail::Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> RF;
|
709
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
|
710
|
+
detail::protect(
|
711
|
+
RUBY_VALUE_FUNC(RF::call),
|
712
|
+
reinterpret_cast<VALUE>(&f));
|
713
|
+
return f.result();
|
714
|
+
}
|
715
|
+
|
541
716
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
|
542
717
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
|
543
718
|
{
|
544
|
-
typedef detail::Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> RF;
|
719
|
+
typedef detail::Ruby_Function_10<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> RF;
|
545
720
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
|
546
|
-
|
721
|
+
detail::protect(
|
547
722
|
RUBY_VALUE_FUNC(RF::call),
|
548
723
|
reinterpret_cast<VALUE>(&f));
|
724
|
+
return f.result();
|
549
725
|
}
|
550
726
|
|
551
727
|
// ---------------------------------------------------------------------
|
@@ -553,48 +729,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
553
729
|
namespace detail
|
554
730
|
{
|
555
731
|
|
556
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
732
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
557
733
|
class Ruby_Function_11
|
558
734
|
{
|
559
735
|
public:
|
560
736
|
Ruby_Function_11(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11);
|
561
|
-
inline
|
737
|
+
inline void operator()();
|
562
738
|
static inline VALUE call(Ruby_Function_11 * f);
|
739
|
+
Ret_T const & result() const { return result_; }
|
740
|
+
|
563
741
|
private:
|
564
742
|
Fun f_;
|
565
743
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_;
|
744
|
+
Ret_T result_; // TODO: use placement new
|
566
745
|
};
|
567
746
|
|
568
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
569
|
-
inline Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
|
747
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
748
|
+
inline Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
|
570
749
|
Ruby_Function_11(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
|
571
750
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11)
|
572
751
|
{ }
|
573
752
|
|
574
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
575
|
-
inline
|
753
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
754
|
+
inline void Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
|
576
755
|
operator()()
|
577
756
|
{
|
578
|
-
|
757
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_);
|
579
758
|
}
|
580
759
|
|
581
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
582
|
-
inline VALUE Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
|
760
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
761
|
+
inline VALUE Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
|
583
762
|
call(Ruby_Function_11 * f)
|
584
763
|
{
|
585
|
-
|
764
|
+
(*f)();
|
765
|
+
return Qnil;
|
586
766
|
}
|
587
767
|
|
588
768
|
} // namespace detail
|
589
769
|
|
770
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
771
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
|
772
|
+
{
|
773
|
+
typedef detail::Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> RF;
|
774
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);
|
775
|
+
detail::protect(
|
776
|
+
RUBY_VALUE_FUNC(RF::call),
|
777
|
+
reinterpret_cast<VALUE>(&f));
|
778
|
+
return f.result();
|
779
|
+
}
|
780
|
+
|
590
781
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
|
591
782
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
|
592
783
|
{
|
593
|
-
typedef detail::Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> RF;
|
784
|
+
typedef detail::Ruby_Function_11<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> RF;
|
594
785
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);
|
595
|
-
|
786
|
+
detail::protect(
|
596
787
|
RUBY_VALUE_FUNC(RF::call),
|
597
788
|
reinterpret_cast<VALUE>(&f));
|
789
|
+
return f.result();
|
598
790
|
}
|
599
791
|
|
600
792
|
// ---------------------------------------------------------------------
|
@@ -602,48 +794,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
602
794
|
namespace detail
|
603
795
|
{
|
604
796
|
|
605
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
797
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
606
798
|
class Ruby_Function_12
|
607
799
|
{
|
608
800
|
public:
|
609
801
|
Ruby_Function_12(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12);
|
610
|
-
inline
|
802
|
+
inline void operator()();
|
611
803
|
static inline VALUE call(Ruby_Function_12 * f);
|
804
|
+
Ret_T const & result() const { return result_; }
|
805
|
+
|
612
806
|
private:
|
613
807
|
Fun f_;
|
614
808
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_;
|
809
|
+
Ret_T result_; // TODO: use placement new
|
615
810
|
};
|
616
811
|
|
617
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
618
|
-
inline Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
|
812
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
813
|
+
inline Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
|
619
814
|
Ruby_Function_12(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
|
620
815
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12)
|
621
816
|
{ }
|
622
817
|
|
623
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
624
|
-
inline
|
818
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
819
|
+
inline void Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
|
625
820
|
operator()()
|
626
821
|
{
|
627
|
-
|
822
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_);
|
628
823
|
}
|
629
824
|
|
630
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
631
|
-
inline VALUE Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
|
825
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
826
|
+
inline VALUE Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
|
632
827
|
call(Ruby_Function_12 * f)
|
633
828
|
{
|
634
|
-
|
829
|
+
(*f)();
|
830
|
+
return Qnil;
|
635
831
|
}
|
636
832
|
|
637
833
|
} // namespace detail
|
638
834
|
|
835
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
836
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
|
837
|
+
{
|
838
|
+
typedef detail::Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> RF;
|
839
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);
|
840
|
+
detail::protect(
|
841
|
+
RUBY_VALUE_FUNC(RF::call),
|
842
|
+
reinterpret_cast<VALUE>(&f));
|
843
|
+
return f.result();
|
844
|
+
}
|
845
|
+
|
639
846
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
|
640
847
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
|
641
848
|
{
|
642
|
-
typedef detail::Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> RF;
|
849
|
+
typedef detail::Ruby_Function_12<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> RF;
|
643
850
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);
|
644
|
-
|
851
|
+
detail::protect(
|
645
852
|
RUBY_VALUE_FUNC(RF::call),
|
646
853
|
reinterpret_cast<VALUE>(&f));
|
854
|
+
return f.result();
|
647
855
|
}
|
648
856
|
|
649
857
|
// ---------------------------------------------------------------------
|
@@ -651,48 +859,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
651
859
|
namespace detail
|
652
860
|
{
|
653
861
|
|
654
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
862
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
655
863
|
class Ruby_Function_13
|
656
864
|
{
|
657
865
|
public:
|
658
866
|
Ruby_Function_13(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13);
|
659
|
-
inline
|
867
|
+
inline void operator()();
|
660
868
|
static inline VALUE call(Ruby_Function_13 * f);
|
869
|
+
Ret_T const & result() const { return result_; }
|
870
|
+
|
661
871
|
private:
|
662
872
|
Fun f_;
|
663
873
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_; T13 const & t13_;
|
874
|
+
Ret_T result_; // TODO: use placement new
|
664
875
|
};
|
665
876
|
|
666
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
667
|
-
inline Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
|
877
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
878
|
+
inline Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
|
668
879
|
Ruby_Function_13(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13)
|
669
880
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12), t13_(t13)
|
670
881
|
{ }
|
671
882
|
|
672
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
673
|
-
inline
|
883
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
884
|
+
inline void Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
|
674
885
|
operator()()
|
675
886
|
{
|
676
|
-
|
887
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_);
|
677
888
|
}
|
678
889
|
|
679
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
680
|
-
inline VALUE Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
|
890
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
891
|
+
inline VALUE Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
|
681
892
|
call(Ruby_Function_13 * f)
|
682
893
|
{
|
683
|
-
|
894
|
+
(*f)();
|
895
|
+
return Qnil;
|
684
896
|
}
|
685
897
|
|
686
898
|
} // namespace detail
|
687
899
|
|
900
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
901
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13)
|
902
|
+
{
|
903
|
+
typedef detail::Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> RF;
|
904
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13);
|
905
|
+
detail::protect(
|
906
|
+
RUBY_VALUE_FUNC(RF::call),
|
907
|
+
reinterpret_cast<VALUE>(&f));
|
908
|
+
return f.result();
|
909
|
+
}
|
910
|
+
|
688
911
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
|
689
912
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13)
|
690
913
|
{
|
691
|
-
typedef detail::Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> RF;
|
914
|
+
typedef detail::Ruby_Function_13<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> RF;
|
692
915
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13);
|
693
|
-
|
916
|
+
detail::protect(
|
694
917
|
RUBY_VALUE_FUNC(RF::call),
|
695
918
|
reinterpret_cast<VALUE>(&f));
|
919
|
+
return f.result();
|
696
920
|
}
|
697
921
|
|
698
922
|
// ---------------------------------------------------------------------
|
@@ -700,48 +924,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
700
924
|
namespace detail
|
701
925
|
{
|
702
926
|
|
703
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
927
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
704
928
|
class Ruby_Function_14
|
705
929
|
{
|
706
930
|
public:
|
707
931
|
Ruby_Function_14(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14);
|
708
|
-
inline
|
932
|
+
inline void operator()();
|
709
933
|
static inline VALUE call(Ruby_Function_14 * f);
|
934
|
+
Ret_T const & result() const { return result_; }
|
935
|
+
|
710
936
|
private:
|
711
937
|
Fun f_;
|
712
938
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_; T13 const & t13_; T14 const & t14_;
|
939
|
+
Ret_T result_; // TODO: use placement new
|
713
940
|
};
|
714
941
|
|
715
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
716
|
-
inline Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
|
942
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
943
|
+
inline Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
|
717
944
|
Ruby_Function_14(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14)
|
718
945
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12), t13_(t13), t14_(t14)
|
719
946
|
{ }
|
720
947
|
|
721
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
722
|
-
inline
|
948
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
949
|
+
inline void Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
|
723
950
|
operator()()
|
724
951
|
{
|
725
|
-
|
952
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_, t14_);
|
726
953
|
}
|
727
954
|
|
728
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
729
|
-
inline VALUE Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
|
955
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
956
|
+
inline VALUE Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
|
730
957
|
call(Ruby_Function_14 * f)
|
731
958
|
{
|
732
|
-
|
959
|
+
(*f)();
|
960
|
+
return Qnil;
|
733
961
|
}
|
734
962
|
|
735
963
|
} // namespace detail
|
736
964
|
|
965
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
966
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14)
|
967
|
+
{
|
968
|
+
typedef detail::Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> RF;
|
969
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14);
|
970
|
+
detail::protect(
|
971
|
+
RUBY_VALUE_FUNC(RF::call),
|
972
|
+
reinterpret_cast<VALUE>(&f));
|
973
|
+
return f.result();
|
974
|
+
}
|
975
|
+
|
737
976
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
|
738
977
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14)
|
739
978
|
{
|
740
|
-
typedef detail::Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> RF;
|
979
|
+
typedef detail::Ruby_Function_14<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> RF;
|
741
980
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14);
|
742
|
-
|
981
|
+
detail::protect(
|
743
982
|
RUBY_VALUE_FUNC(RF::call),
|
744
983
|
reinterpret_cast<VALUE>(&f));
|
984
|
+
return f.result();
|
745
985
|
}
|
746
986
|
|
747
987
|
// ---------------------------------------------------------------------
|
@@ -749,48 +989,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
|
|
749
989
|
namespace detail
|
750
990
|
{
|
751
991
|
|
752
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
992
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
753
993
|
class Ruby_Function_15
|
754
994
|
{
|
755
995
|
public:
|
756
996
|
Ruby_Function_15(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15);
|
757
|
-
inline
|
997
|
+
inline void operator()();
|
758
998
|
static inline VALUE call(Ruby_Function_15 * f);
|
999
|
+
Ret_T const & result() const { return result_; }
|
1000
|
+
|
759
1001
|
private:
|
760
1002
|
Fun f_;
|
761
1003
|
T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_; T13 const & t13_; T14 const & t14_; T15 const & t15_;
|
1004
|
+
Ret_T result_; // TODO: use placement new
|
762
1005
|
};
|
763
1006
|
|
764
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
765
|
-
inline Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
|
1007
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
1008
|
+
inline Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
|
766
1009
|
Ruby_Function_15(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
|
767
1010
|
: f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12), t13_(t13), t14_(t14), t15_(t15)
|
768
1011
|
{ }
|
769
1012
|
|
770
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
771
|
-
inline
|
1013
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
1014
|
+
inline void Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
|
772
1015
|
operator()()
|
773
1016
|
{
|
774
|
-
|
1017
|
+
result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_, t14_, t15_);
|
775
1018
|
}
|
776
1019
|
|
777
|
-
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
778
|
-
inline VALUE Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
|
1020
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
1021
|
+
inline VALUE Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
|
779
1022
|
call(Ruby_Function_15 * f)
|
780
1023
|
{
|
781
|
-
|
1024
|
+
(*f)();
|
1025
|
+
return Qnil;
|
782
1026
|
}
|
783
1027
|
|
784
1028
|
} // namespace detail
|
785
1029
|
|
1030
|
+
template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
1031
|
+
inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
|
1032
|
+
{
|
1033
|
+
typedef detail::Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> RF;
|
1034
|
+
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15);
|
1035
|
+
detail::protect(
|
1036
|
+
RUBY_VALUE_FUNC(RF::call),
|
1037
|
+
reinterpret_cast<VALUE>(&f));
|
1038
|
+
return f.result();
|
1039
|
+
}
|
1040
|
+
|
786
1041
|
template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
|
787
1042
|
inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
|
788
1043
|
{
|
789
|
-
typedef detail::Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> RF;
|
1044
|
+
typedef detail::Ruby_Function_15<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> RF;
|
790
1045
|
RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15);
|
791
|
-
|
1046
|
+
detail::protect(
|
792
1047
|
RUBY_VALUE_FUNC(RF::call),
|
793
1048
|
reinterpret_cast<VALUE>(&f));
|
1049
|
+
return f.result();
|
794
1050
|
}
|
795
1051
|
|
796
1052
|
// ---------------------------------------------------------------------
|