rice 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/COPYING +23 -0
  2. data/Doxyfile +1253 -0
  3. data/Makefile.am +26 -0
  4. data/Makefile.in +736 -0
  5. data/README +881 -0
  6. data/README.mingw +8 -0
  7. data/bootstrap +8 -0
  8. data/config.guess +1535 -0
  9. data/config.sub +1644 -0
  10. data/configure +7310 -0
  11. data/configure.ac +48 -0
  12. data/depcomp +584 -0
  13. data/doxygen.ac +314 -0
  14. data/doxygen.am +186 -0
  15. data/install-sh +507 -0
  16. data/missing +367 -0
  17. data/post-autoconf.rb +22 -0
  18. data/post-automake.rb +28 -0
  19. data/rice/Address_Registration_Guard.hpp +7 -0
  20. data/rice/Address_Registration_Guard.ipp +34 -0
  21. data/rice/Address_Registration_Guard_defn.hpp +65 -0
  22. data/rice/Allocation_Strategies.hpp +37 -0
  23. data/rice/Array.hpp +220 -0
  24. data/rice/Array.ipp +262 -0
  25. data/rice/Builtin_Object.hpp +8 -0
  26. data/rice/Builtin_Object.ipp +50 -0
  27. data/rice/Builtin_Object_defn.hpp +51 -0
  28. data/rice/Class.cpp +57 -0
  29. data/rice/Class.hpp +8 -0
  30. data/rice/Class.ipp +4 -0
  31. data/rice/Class_defn.hpp +83 -0
  32. data/rice/Constructor.hpp +189 -0
  33. data/rice/Critical_Guard.hpp +34 -0
  34. data/rice/Critical_Guard.ipp +20 -0
  35. data/rice/Data_Object.hpp +127 -0
  36. data/rice/Data_Object.ipp +129 -0
  37. data/rice/Data_Type.cpp +21 -0
  38. data/rice/Data_Type.hpp +8 -0
  39. data/rice/Data_Type.ipp +227 -0
  40. data/rice/Data_Type_defn.hpp +219 -0
  41. data/rice/Data_Type_fwd.hpp +12 -0
  42. data/rice/Enum.hpp +118 -0
  43. data/rice/Enum.ipp +246 -0
  44. data/rice/Exception.cpp +59 -0
  45. data/rice/Exception.hpp +69 -0
  46. data/rice/Exception_Base.hpp +30 -0
  47. data/rice/Exception_Base.ipp +11 -0
  48. data/rice/Hash.hpp +206 -0
  49. data/rice/Hash.ipp +336 -0
  50. data/rice/Identifier.cpp +8 -0
  51. data/rice/Identifier.hpp +50 -0
  52. data/rice/Identifier.ipp +33 -0
  53. data/rice/Jump_Tag.hpp +24 -0
  54. data/rice/Makefile.am +112 -0
  55. data/rice/Makefile.in +675 -0
  56. data/rice/Module.cpp +75 -0
  57. data/rice/Module.hpp +8 -0
  58. data/rice/Module.ipp +6 -0
  59. data/rice/Module_defn.hpp +87 -0
  60. data/rice/Module_impl.hpp +237 -0
  61. data/rice/Module_impl.ipp +302 -0
  62. data/rice/Object.cpp +153 -0
  63. data/rice/Object.hpp +8 -0
  64. data/rice/Object.ipp +19 -0
  65. data/rice/Object_defn.hpp +183 -0
  66. data/rice/Require_Guard.hpp +21 -0
  67. data/rice/String.cpp +93 -0
  68. data/rice/String.hpp +88 -0
  69. data/rice/Struct.cpp +117 -0
  70. data/rice/Struct.hpp +162 -0
  71. data/rice/Struct.ipp +26 -0
  72. data/rice/Symbol.cpp +25 -0
  73. data/rice/Symbol.hpp +66 -0
  74. data/rice/Symbol.ipp +44 -0
  75. data/rice/VM.cpp +79 -0
  76. data/rice/VM.hpp +27 -0
  77. data/rice/config.hpp +23 -0
  78. data/rice/config.hpp.in +22 -0
  79. data/rice/detail/Auto_Function_Wrapper.hpp +719 -0
  80. data/rice/detail/Auto_Function_Wrapper.ipp +1354 -0
  81. data/rice/detail/Auto_Member_Function_Wrapper.hpp +685 -0
  82. data/rice/detail/Auto_Member_Function_Wrapper.ipp +1435 -0
  83. data/rice/detail/Caster.hpp +61 -0
  84. data/rice/detail/Exception_Handler.hpp +118 -0
  85. data/rice/detail/Iterator_Definer.hpp +98 -0
  86. data/rice/detail/Not_Copyable.hpp +25 -0
  87. data/rice/detail/Wrapped_Function.hpp +33 -0
  88. data/rice/detail/check_ruby_type.cpp +21 -0
  89. data/rice/detail/check_ruby_type.hpp +23 -0
  90. data/rice/detail/creation_funcs.hpp +45 -0
  91. data/rice/detail/creation_funcs.ipp +62 -0
  92. data/rice/detail/default_allocation_func.hpp +23 -0
  93. data/rice/detail/default_allocation_func.ipp +11 -0
  94. data/rice/detail/define_method_and_auto_wrap.hpp +27 -0
  95. data/rice/detail/define_method_and_auto_wrap.ipp +20 -0
  96. data/rice/detail/env.hpp +13 -0
  97. data/rice/detail/from_ruby.hpp +43 -0
  98. data/rice/detail/from_ruby.ipp +74 -0
  99. data/rice/detail/method_data.cpp +105 -0
  100. data/rice/detail/method_data.hpp +33 -0
  101. data/rice/detail/node.hpp +13 -0
  102. data/rice/detail/object_call.hpp +85 -0
  103. data/rice/detail/object_call.ipp +147 -0
  104. data/rice/detail/protect.cpp +27 -0
  105. data/rice/detail/protect.hpp +34 -0
  106. data/rice/detail/remove_const.hpp +21 -0
  107. data/rice/detail/ruby.hpp +85 -0
  108. data/rice/detail/rubysig.hpp +13 -0
  109. data/rice/detail/st.hpp +56 -0
  110. data/rice/detail/to_ruby.hpp +16 -0
  111. data/rice/detail/to_ruby.ipp +10 -0
  112. data/rice/detail/win32.hpp +16 -0
  113. data/rice/detail/wrap_function.hpp +288 -0
  114. data/rice/detail/wrap_function.ipp +473 -0
  115. data/rice/generate_code.rb +1092 -0
  116. data/rice/global_function.hpp +16 -0
  117. data/rice/global_function.ipp +11 -0
  118. data/rice/protect.hpp +91 -0
  119. data/rice/protect.ipp +803 -0
  120. data/rice/ruby_try_catch.hpp +86 -0
  121. data/rice/to_from_ruby.hpp +8 -0
  122. data/rice/to_from_ruby.ipp +299 -0
  123. data/rice/to_from_ruby_defn.hpp +71 -0
  124. data/ruby.ac +105 -0
  125. data/ruby/Makefile.am +1 -0
  126. data/ruby/Makefile.in +493 -0
  127. data/ruby/lib/Makefile.am +3 -0
  128. data/ruby/lib/Makefile.in +369 -0
  129. data/ruby/lib/mkmf-rice.rb.in +199 -0
  130. data/sample/Makefile.am +47 -0
  131. data/sample/Makefile.in +375 -0
  132. data/sample/enum/extconf.rb +3 -0
  133. data/sample/enum/sample_enum.cpp +54 -0
  134. data/sample/enum/test.rb +8 -0
  135. data/sample/inheritance/animals.cpp +98 -0
  136. data/sample/inheritance/extconf.rb +3 -0
  137. data/sample/inheritance/test.rb +7 -0
  138. data/sample/map/extconf.rb +3 -0
  139. data/sample/map/map.cpp +81 -0
  140. data/sample/map/test.rb +7 -0
  141. data/test/Makefile.am +44 -0
  142. data/test/Makefile.in +575 -0
  143. data/test/test_Address_Registration_Guard.cpp +43 -0
  144. data/test/test_Allocation_Strategies.cpp +77 -0
  145. data/test/test_Array.cpp +241 -0
  146. data/test/test_Builtin_Object.cpp +72 -0
  147. data/test/test_Class.cpp +350 -0
  148. data/test/test_Constructor.cpp +30 -0
  149. data/test/test_Critical_Guard.cpp +47 -0
  150. data/test/test_Data_Object.cpp +235 -0
  151. data/test/test_Enum.cpp +162 -0
  152. data/test/test_Exception.cpp +46 -0
  153. data/test/test_Hash.cpp +195 -0
  154. data/test/test_Identifier.cpp +70 -0
  155. data/test/test_Jump_Tag.cpp +17 -0
  156. data/test/test_Module.cpp +253 -0
  157. data/test/test_Object.cpp +148 -0
  158. data/test/test_String.cpp +94 -0
  159. data/test/test_Struct.cpp +192 -0
  160. data/test/test_Symbol.cpp +63 -0
  161. data/test/test_To_From_Ruby.cpp +281 -0
  162. data/test/test_VM.cpp +26 -0
  163. data/test/test_rice.rb +30 -0
  164. data/test/unittest.cpp +136 -0
  165. data/test/unittest.hpp +292 -0
  166. metadata +209 -0
@@ -0,0 +1,1092 @@
1
+ require 'ftools'
2
+
3
+ MAX_ARGS = 15
4
+
5
+ # ======================================================================
6
+ # TODO: This doesn't properly handle escaped %'s
7
+ def fill_template(template_str, args)
8
+ result = template_str.dup
9
+ args_not_found = args.dup
10
+ result.gsub!(/%\(-(\w+)\)/) do |match|
11
+ args_not_found.delete($1.intern)
12
+ ''
13
+ end
14
+ result.gsub!(/%\((\w+)\)/) do |match|
15
+ value = args[$1.intern]
16
+ raise ArgumentError, "#{match} not found in argument hash" if value.nil?
17
+ args_not_found.delete($1.intern)
18
+ value
19
+ end
20
+ if args_not_found.size != 0 then
21
+ args_not_found.each do |name, value|
22
+ raise "#{name} not found in template"
23
+ end
24
+ end
25
+ return result
26
+ end
27
+
28
+ GENERATED_FILE_WARNING = <<END
29
+ // This is a generated file. DO NOT EDIT!!%(-macro_name)
30
+ END
31
+
32
+ # TODO: shouldn't include ruby.h directly
33
+ HEADER_TOP = <<END
34
+ #ifndef %(macro_name)
35
+ #define %(macro_name)
36
+
37
+ #{GENERATED_FILE_WARNING}
38
+
39
+ // This causes problems with certain C++ libraries
40
+ #undef TYPE
41
+
42
+ END
43
+ HEADER_BOTTOM = <<END
44
+
45
+ #endif // %(macro_name)
46
+
47
+ END
48
+
49
+ $filenames = []
50
+
51
+ def wrap_header(
52
+ filename,
53
+ namespace=nil,
54
+ docstring=nil,
55
+ include_ipp=false,
56
+ head=nil,
57
+ tail=nil,
58
+ header_top=HEADER_TOP,
59
+ header_bottom=HEADER_BOTTOM,
60
+ &block)
61
+ $filenames << filename
62
+ File.open(filename, 'w') do |out|
63
+ namespace_str = namespace.nil? ? '' : "#{namespace}__"
64
+ trailer = File.basename(filename)
65
+ macro_name = namespace_str + trailer + '_'
66
+ macro_name.gsub!(/[.]/, '__')
67
+ macro_name.tr!(':', '_')
68
+ if header_top then
69
+ out.puts fill_template(header_top, { :macro_name => macro_name })
70
+ end
71
+ out.puts head if head
72
+ namespace_wrapper = namespace ? method(:wrap_namespace) : method(:null_wrap)
73
+ docstring_wrapper = docstring ? method(:wrap_docstring) : method(:null_wrap)
74
+ namespace_wrapper.call(out, namespace) do
75
+ docstring_wrapper.call(out, docstring) do
76
+ yield out
77
+ end
78
+ end
79
+ out.puts tail if tail
80
+ out.puts "#include \"#{File.basename(filename, '.hpp')}.ipp\"" if include_ipp
81
+ if header_bottom then
82
+ out.puts fill_template(header_bottom, { :macro_name => macro_name })
83
+ end
84
+ end
85
+ end
86
+
87
+ def null_wrap(*args)
88
+ yield *args
89
+ end
90
+
91
+ def wrap_docstring(out, docstring)
92
+ out.puts "#ifdef DOXYGEN"
93
+ out.puts docstring
94
+ out.puts "#else"
95
+ out.puts ""
96
+ yield out
97
+ out.puts "#endif // DOXYGEN"
98
+ end
99
+
100
+ def wrap_namespace(out, namespace)
101
+ namespaces = namespace.split('::')
102
+ namespaces.each do |namespace|
103
+ out.print "namespace #{namespace}\n{\n\n"
104
+ end
105
+ yield out
106
+ namespaces.reverse.each do |namespace|
107
+ out.print "\n} // namespace #{namespace}\n"
108
+ end
109
+ out.print "\n"
110
+ end
111
+
112
+ if __FILE__ == $0 then
113
+
114
+ # ======================================================================
115
+ # TODO: Can I make protect accept a function or functor that
116
+ # doesn't return a VALUE?
117
+ docstring = <<END
118
+ /*! \\file
119
+ * \\brief A collection of functions (overloaded on number of
120
+ * arguments) for calling C functions that might raise Ruby exceptions.
121
+ */
122
+
123
+ //! Call the C function f with arguments (arg1, arg2, ...).
124
+ /*! E.g.:
125
+ * \\code
126
+ * VALUE x = protect(rb_ary_new);
127
+ * protect(rb_ary_push(x, INT2NUM(42));
128
+ * \\endcode
129
+ *
130
+ * Note that this function makes copies of all of its arguments; it
131
+ * does not take anything by reference. All of the copies are const so
132
+ * that protect will not work if f takes a non-const
133
+ * reference to any of its arguments (though you can use non-const
134
+ * pointers).
135
+ */
136
+ VALUE protect(Function f, T1 arg1, T2 arg2, ...);
137
+ END
138
+ ipp_template = <<END
139
+ namespace detail
140
+ {
141
+
142
+ template<typename Fun%(typenames)>
143
+ class Ruby_Function_%(j)
144
+ {
145
+ public:
146
+ Ruby_Function_%(j)(Fun f%(member_args));
147
+ inline VALUE operator()();
148
+ static inline VALUE call(Ruby_Function_%(j) * f);
149
+ private:
150
+ Fun f_;
151
+ %(member_decls)
152
+ };
153
+
154
+ template<typename Fun%(typenames)>
155
+ inline Ruby_Function_%(j)<Fun%(types)>::
156
+ Ruby_Function_%(j)(Fun f%(member_args))
157
+ : f_(f)%(initializers)
158
+ { }
159
+
160
+ template<typename Fun%(typenames)>
161
+ inline VALUE Ruby_Function_%(j)<Fun%(types)>::
162
+ operator()()
163
+ {
164
+ return f_(%(member_params));
165
+ }
166
+
167
+ template<typename Fun%(typenames)>
168
+ inline VALUE Ruby_Function_%(j)<Fun%(types)>::
169
+ call(Ruby_Function_%(j) * f)
170
+ {
171
+ return (*f)();
172
+ }
173
+
174
+ } // namespace detail
175
+
176
+ template<typename Fun%(typenames)>
177
+ inline VALUE protect(Fun fun%(args))
178
+ {
179
+ typedef detail::Ruby_Function_%(j)<Fun%(types)> RF;
180
+ RF f(fun%(params));
181
+ return detail::protect(
182
+ RUBY_VALUE_FUNC(RF::call),
183
+ reinterpret_cast<VALUE>(&f));
184
+ }
185
+
186
+ // ---------------------------------------------------------------------
187
+ END
188
+ hpp_template = <<END
189
+ template<typename Fun%(typenames)>
190
+ VALUE protect(Fun fun%(args));
191
+ END
192
+ ipp_head = <<END
193
+ #include "detail/protect.hpp"
194
+ END
195
+ hpp_head = <<END
196
+ #include "Object_defn.hpp"
197
+ END
198
+ ipp_filename = 'protect.ipp'
199
+ hpp_filename = 'protect.hpp'
200
+ wrap_header(ipp_filename, 'Rice', nil, false, ipp_head) do |ipp|
201
+ wrap_header(hpp_filename, 'Rice', docstring, true, hpp_head) do |hpp|
202
+ for j in 0..MAX_ARGS do
203
+ t_array = (1..j).to_a
204
+ type_list = t_array.map { |x| "T#{x}" }.join(', ')
205
+ init_list = t_array.map { |x| "t#{x}_(t#{x})" }.join(', ')
206
+ param_list = t_array.map { |x| "t#{x}" }.join(', ')
207
+ # arg_list = t_array.map { |x| "T#{x} t#{x}" }.join(', ')
208
+ arg_list = t_array.map { |x| "T#{x} const & t#{x}" }.join(', ')
209
+ member_param_list = t_array.map { |x| "t#{x}_" }.join(', ')
210
+ member_decl_list =
211
+ # t_array.map { |x| "typename detail::Copy_Type<T#{x}>::Type const t#{x}_; " }
212
+ t_array.map { |x| "T#{x} const & t#{x}_; " }
213
+ add_comma = (j == 0) ? '' : ', '
214
+ typename_list =
215
+ (j == 0) ? '' : t_array.map { |x| "typename T#{x}" }.join(', ')
216
+ member_arg_list =
217
+ # t_array.map { |x| "typename detail::Copy_Type<T#{x}>::Type t#{x}" }.join(', ')
218
+ t_array.map { |x| "T#{x} const & t#{x}" }.join(', ')
219
+ ipp.puts fill_template(ipp_template, {
220
+ :j => j,
221
+ :typenames => add_comma + typename_list,
222
+ :args => add_comma + arg_list,
223
+ :member_args => add_comma + member_arg_list,
224
+ :initializers => add_comma + init_list,
225
+ :member_params => member_param_list,
226
+ :member_decls => member_decl_list,
227
+ :types => add_comma + type_list,
228
+ :params => add_comma + param_list
229
+ })
230
+ ipp.puts ''
231
+ hpp.puts fill_template(hpp_template, {
232
+ :typenames => add_comma + typename_list,
233
+ :args => add_comma + arg_list,
234
+ })
235
+ hpp.puts ''
236
+ end
237
+ end
238
+ end
239
+
240
+ # ======================================================================
241
+ docstring = <<END
242
+
243
+ //! Call the Ruby method specified by 'id' on object 'obj'.
244
+ /*! Pass in arguments (arg1, arg2, ...). The arguments will be converted to
245
+ * Ruby objects with to_ruby<>. The return value will automatically be
246
+ * converted to type Retval_T with from_ruby<>.
247
+ *
248
+ * E.g.:
249
+ * \\code
250
+ * float y = x.call<float>("foo", z, 42);
251
+ * \\endcode
252
+ */
253
+ template<typename Retval_T>
254
+ Retval_T call(Identifier id, T1 arg1, T2 arg2, ...) const;
255
+
256
+ //! Version of call which defaults to Object return type.
257
+ Object call(Identifier id, T1 arg1, T2 arg2, ...) const;
258
+ END
259
+ ipp_template = <<END
260
+
261
+ %(template)
262
+ inline Rice::Object Rice::Object::
263
+ call(Identifier id%(args)) const
264
+ {
265
+ VALUE args[] = { %(convert_list) };
266
+ return protect(rb_funcall2, value(), id, %(j), args);
267
+ }
268
+ END
269
+ hpp_template = <<END
270
+ %(template)
271
+ Object call(Identifier id%(args)) const;
272
+
273
+ END
274
+ ipp_head = <<END
275
+ #include "../protect.hpp"
276
+ #include "../to_from_ruby.hpp"
277
+ END
278
+ ipp_filename = 'detail/object_call.ipp'
279
+ hpp_filename = 'detail/object_call.hpp'
280
+ wrap_header(hpp_filename, nil, docstring, false, nil, nil, GENERATED_FILE_WARNING, nil) do |hpp|
281
+ wrap_header(ipp_filename, nil, nil, false, ipp_head, nil, GENERATED_FILE_WARNING, nil) do |ipp|
282
+ for j in 0..MAX_ARGS do
283
+ t_array = (1..j).to_a
284
+ arg_list = t_array.map { |x| ", T#{x} arg#{x}" }
285
+ if j == 0 then
286
+ template = ''
287
+ convert_list = 'Qnil';
288
+ else
289
+ template = 'template<' + t_array.map { |x| "typename T#{x}" }.join(', ') + '>'
290
+ convert_list = t_array.map { |x| "to_ruby(arg#{x})" }.join(', ')
291
+ end
292
+ ipp.puts fill_template(ipp_template, {
293
+ :args => arg_list,
294
+ :convert_list => convert_list,
295
+ :j => j,
296
+ :template => template,
297
+ })
298
+ ipp.puts
299
+ hpp.puts fill_template(hpp_template, {
300
+ :args => arg_list,
301
+ :template => template,
302
+ })
303
+ hpp.puts
304
+ end
305
+ end
306
+ end
307
+ #
308
+ # # ======================================================================
309
+ # method_types = [
310
+ # 'method', 'module_function', 'protected_method',
311
+ # 'private_method', 'singleton_method'
312
+ # ]
313
+ # method_docstring = <<END
314
+ # //! Define a %s method. Like rb_define_%s, but automatically calculates
315
+ # //! the number of arguments based on the prototype of the supplied
316
+ # //! function f.
317
+ # VALUE define_%s(
318
+ # VALUE klass,
319
+ # char const * name,
320
+ # VALUE (*f)(VALUE arg1, VALUE arg2, ...));
321
+ # END
322
+ # docstring = <<END
323
+ # /*! \\file
324
+ # * \\brief Helpers for defining ruby methods, overloaded on the
325
+ # * signature of the function being wrapped.
326
+ # */
327
+ # #{method_types.map do |t| method_docstring % [ t, t, t ] end}
328
+ # //! Define a global function. Like rb_define_global_function, but
329
+ # //! automatically calculates the number of arguments based on the
330
+ # //! prototype of the supplied function f.
331
+ # void define_global_function(
332
+ # char const * name,
333
+ # VALUE (*f)(VALUE arg1, VALUE arg2, ...));
334
+ # END
335
+ # method_def = <<END
336
+ # inline void define_%s(
337
+ # VALUE klass,
338
+ # char const * name,
339
+ # VALUE(*f)(%%(args)))
340
+ # {
341
+ # rb_define_%s(klass, name, RUBY_METHOD_FUNC(f), %%(j));
342
+ # }
343
+ # END
344
+ # method_decl = <<END
345
+ # void define_%s(
346
+ # VALUE klass,
347
+ # char const * name,
348
+ # VALUE(*f)(%%(args)));
349
+ # END
350
+ # ipp_template = <<END
351
+ # #{method_types.map do |t| method_def % [ t, t ] end }\
352
+ # inline void define_global_function(
353
+ # char const * name,
354
+ # VALUE(*f)(%(args)))
355
+ # {
356
+ # rb_define_global_function(name, RUBY_METHOD_FUNC(f), %(j));
357
+ # }
358
+ #
359
+ # // ---------------------------------------------------------------------
360
+ # END
361
+ # hpp_template = <<END
362
+ # #{method_types.map do |t| method_decl % t end }\
363
+ # void define_global_function(
364
+ # char const * name,
365
+ # VALUE(*f)(%(args)));
366
+ #
367
+ # // ---------------------------------------------------------------------
368
+ # END
369
+ # ipp_filename = 'define_method.ipp'
370
+ # hpp_filename = 'define_method.hpp'
371
+ # wrap_header(ipp_filename, 'Rice') do |ipp|
372
+ # wrap_header(hpp_filename, 'Rice', docstring, true) do |hpp|
373
+ # for j in 0..MAX_ARGS do
374
+ # t_array = (0..j).to_a
375
+ # arg_list = t_array.map { |x| "VALUE" }.join(', ')
376
+ # ipp.puts fill_template(ipp_template, {
377
+ # :args => arg_list,
378
+ # :j => j
379
+ # })
380
+ # ipp.puts ""
381
+ # hpp.puts fill_template(hpp_template, {
382
+ # :args => arg_list
383
+ # })
384
+ # hpp.puts ""
385
+ # end
386
+ # arg_list = "int, VALUE*, VALUE";
387
+ # ipp.puts fill_template(ipp_template, {
388
+ # :args => arg_list,
389
+ # :j => -1
390
+ # })
391
+ # ipp.puts ""
392
+ # hpp.puts fill_template(hpp_template, {
393
+ # :args => arg_list
394
+ # })
395
+ # end
396
+ # end
397
+ #
398
+ # ======================================================================
399
+ docstring = <<END
400
+ END
401
+ ipp_template = <<END
402
+ template<typename Func_T, typename Ret_T, %(typename_list)>
403
+ Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)>::
404
+ Auto_Function_Wrapper(
405
+ Func func,
406
+ Exception_Handler const * handler)
407
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
408
+ , func_(func)
409
+ , handler_(handler ? handler : new Default_Exception_Handler)
410
+ {
411
+ }
412
+
413
+ template<typename Func_T, typename Ret_T, %(typename_list)>
414
+ VALUE Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)>::
415
+ call(%(value_args))
416
+ {
417
+ Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)> * wrapper = 0;
418
+ try
419
+ {
420
+ void * data = detail::method_data();
421
+ wrapper = (Auto_Function_Wrapper<Func_T, Ret_T, %(typenames)> *)data;
422
+ %(arg_convert_list)
423
+ return to_ruby(wrapper->func_(%(arg_list)));
424
+ }
425
+ catch(...)
426
+ {
427
+ RUBY_TRY
428
+ {
429
+ if(wrapper)
430
+ {
431
+ return wrapper->handler_->handle_exception();
432
+ }
433
+ else
434
+ {
435
+ throw;
436
+ }
437
+ }
438
+ RUBY_CATCH
439
+ }
440
+ }
441
+
442
+ template<typename Func_T, %(typename_list)>
443
+ Auto_Function_Wrapper<Func_T, void, %(typenames)>::
444
+ Auto_Function_Wrapper(
445
+ Func func,
446
+ Exception_Handler const * handler)
447
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
448
+ , func_(func)
449
+ , handler_(handler ? handler : new Default_Exception_Handler)
450
+ {
451
+ }
452
+
453
+ template<typename Func_T, %(typename_list)>
454
+ VALUE Auto_Function_Wrapper<Func_T, void, %(typenames)>::
455
+ call(%(value_args))
456
+ {
457
+ Auto_Function_Wrapper<Func_T, void, %(typenames)> * wrapper = 0;
458
+ try
459
+ {
460
+ void * data = detail::method_data();
461
+ wrapper =
462
+ (Auto_Function_Wrapper<Func_T, void, %(typenames)> *)data;
463
+ %(arg_convert_list)
464
+ wrapper->func_(%(arg_list));
465
+ return Qnil;
466
+ }
467
+ catch(...)
468
+ {
469
+ RUBY_TRY
470
+ {
471
+ if(wrapper)
472
+ {
473
+ return wrapper->handler_->handle_exception();
474
+ }
475
+ else
476
+ {
477
+ throw;
478
+ }
479
+ }
480
+ RUBY_CATCH
481
+ }
482
+ }
483
+
484
+ // ---------------------------------------------------------------------
485
+ END
486
+
487
+ # ======================================================================
488
+ # TODO: Should the handler copy the exception handler or keep a pointer
489
+ # to it?
490
+ hpp_template = <<END
491
+ template<typename Func_T, typename Ret_T, %(typename_list_d)>
492
+ class Auto_Function_Wrapper%(specializations)
493
+ : public Wrapped_Function
494
+ {
495
+ public:
496
+ // typedef Ret_T (*Func)(%(typenames));
497
+ typedef Func_T Func;
498
+
499
+ static const int Num_Args = %(j);
500
+
501
+ Auto_Function_Wrapper(
502
+ Func func,
503
+ Exception_Handler const * handler = 0);
504
+
505
+ static VALUE call(%(value_args));
506
+
507
+ private:
508
+ Func func_;
509
+ Exception_Handler const * handler_;
510
+ };
511
+
512
+ template<typename Func_T, %(typename_list)>
513
+ class Auto_Function_Wrapper<Func_T, void, %(typenames)>
514
+ : public Wrapped_Function
515
+ {
516
+ public:
517
+ // typedef void (*Func)(%(typenames));
518
+ typedef Func_T Func;
519
+
520
+ static const int Num_Args = %(j);
521
+
522
+ Auto_Function_Wrapper(
523
+ Func func,
524
+ Exception_Handler const * handler = 0);
525
+
526
+ static VALUE call(%(value_args));
527
+
528
+ private:
529
+ Func func_;
530
+ Exception_Handler const * handler_;
531
+ };
532
+
533
+ // ---------------------------------------------------------------------
534
+ END
535
+ hpp_head = <<END
536
+ #include "Exception_Handler.hpp"
537
+
538
+ END
539
+ ipp_head = <<END
540
+ #include "method_data.hpp"
541
+ #include "../ruby_try_catch.hpp"
542
+ #include "../to_from_ruby.hpp"
543
+ END
544
+ ipp_filename = 'detail/Auto_Function_Wrapper.ipp'
545
+ hpp_filename = 'detail/Auto_Function_Wrapper.hpp'
546
+ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
547
+ wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
548
+ j = MAX_ARGS # TODO: what's the best way to iterate backward?
549
+ while j >= 0 do
550
+ t_array = (0..j).to_a
551
+ value_args = t_array.map { |x| "VALUE ruby_arg#{x}" }.join(', ')
552
+ arg_list = t_array.map { |x| "arg#{x}" }.join(', ')
553
+ typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
554
+ arg_convert_list = t_array.map do |x|
555
+ "Arg#{x}_T arg#{x}(from_ruby<Arg#{x}_T>(ruby_arg#{x})); "
556
+ end
557
+ if j == MAX_ARGS then
558
+ typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
559
+ typename_list_d = t_array.map { |x| "typename Arg#{x}_T = void" }.join(', ')
560
+ specializations = ''
561
+ else
562
+ typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
563
+ typename_list_d = typename_list
564
+ specializations = "<Func_T, Ret_T, #{typenames}>"
565
+ end
566
+ ipp.puts fill_template(ipp_template, {
567
+ :value_args => value_args,
568
+ :arg_list => arg_list,
569
+ :typenames => typenames,
570
+ :typename_list => typename_list,
571
+ :arg_convert_list => arg_convert_list,
572
+ })
573
+ hpp.puts fill_template(hpp_template, {
574
+ :value_args => value_args,
575
+ :typenames => typenames,
576
+ :typename_list_d => typename_list_d,
577
+ :typename_list => typename_list,
578
+ :j => j,
579
+ :specializations => specializations,
580
+ })
581
+ j -= 1
582
+ end
583
+ end
584
+ end
585
+
586
+ # ======================================================================
587
+ # TODO: Can I add another call() that works if from_ruby is defined
588
+ # for a reference to self instead of a pointer to self (and same for
589
+ # const reference and const pointer?)
590
+ docstring = <<END
591
+ END
592
+ ipp_template = <<END
593
+ template<typename Func_T, typename Ret_T, typename Self_T%(typename_list)>
594
+ Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)>::
595
+ Auto_Member_Function_Wrapper(
596
+ Func func,
597
+ Exception_Handler const * handler)
598
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
599
+ , func_(func)
600
+ , handler_(handler ? handler : new Default_Exception_Handler)
601
+ {
602
+ }
603
+
604
+ template<typename Func_T, typename Ret_T, typename Self_T%(typename_list)>
605
+ VALUE Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)>::
606
+ call(VALUE self%(value_args))
607
+ {
608
+ Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)> * wrapper = 0;
609
+ try
610
+ {
611
+ void * data = detail::method_data();
612
+ wrapper =
613
+ (Auto_Member_Function_Wrapper<Func_T, Ret_T, Self_T%(typenames)> *)data;
614
+ Self_T * obj = from_ruby<Self_T *>(self);
615
+ %(arg_convert_list)
616
+ Func func = wrapper->func_;
617
+ return to_ruby((*obj.*func)(%(arg_list)));
618
+ }
619
+ catch(...)
620
+ {
621
+ RUBY_TRY
622
+ {
623
+ if(wrapper)
624
+ {
625
+ return wrapper->handler_->handle_exception();
626
+ }
627
+ else
628
+ {
629
+ throw;
630
+ }
631
+ }
632
+ RUBY_CATCH
633
+ }
634
+ }
635
+
636
+ template<typename Func_T, typename Self_T%(typename_list)>
637
+ Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)>::
638
+ Auto_Member_Function_Wrapper(
639
+ Func func,
640
+ Exception_Handler const * handler)
641
+ : Wrapped_Function(RUBY_METHOD_FUNC(call), Num_Args)
642
+ , func_(func)
643
+ , handler_(handler ? handler : new Default_Exception_Handler)
644
+ {
645
+ }
646
+
647
+ template<typename Func_T, typename Self_T%(typename_list)>
648
+ VALUE Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)>::
649
+ call(VALUE self%(value_args))
650
+ {
651
+ Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)> * wrapper = 0;
652
+ try
653
+ {
654
+ void * data = detail::method_data();
655
+ wrapper =
656
+ (Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)> *)data;
657
+ Self_T * obj = from_ruby<Self_T *>(self);
658
+ %(arg_convert_list)
659
+ Func func = wrapper->func_;
660
+ (*obj.*func)(%(arg_list));
661
+ return Qnil;
662
+ }
663
+ catch(...)
664
+ {
665
+ RUBY_TRY
666
+ {
667
+ if(wrapper)
668
+ {
669
+ return wrapper->handler_->handle_exception();
670
+ }
671
+ else
672
+ {
673
+ throw;
674
+ }
675
+ }
676
+ RUBY_CATCH
677
+ }
678
+ }
679
+
680
+ // ---------------------------------------------------------------------
681
+ END
682
+ hpp_template = <<END
683
+ template<typename Func_T, typename Ret_T, typename Self_T%(typename_list_d)>
684
+ class Auto_Member_Function_Wrapper%(specializations)
685
+ : public Wrapped_Function
686
+ {
687
+ public:
688
+ typedef Func_T Func;
689
+
690
+ static const int Num_Args = %(j);
691
+
692
+ Auto_Member_Function_Wrapper(
693
+ Func func,
694
+ Exception_Handler const * handler = 0);
695
+
696
+ static VALUE call(VALUE self%(value_args));
697
+
698
+ private:
699
+ Func func_;
700
+ Exception_Handler const * handler_;
701
+ };
702
+
703
+ template<typename Func_T, typename Self_T%(typename_list)>
704
+ class Auto_Member_Function_Wrapper<Func_T, void, Self_T%(typenames)>
705
+ : public Wrapped_Function
706
+ {
707
+ public:
708
+ typedef Func_T Func;
709
+
710
+ static const int Num_Args = %(j);
711
+
712
+ Auto_Member_Function_Wrapper(
713
+ Func func,
714
+ Exception_Handler const * handler = 0);
715
+
716
+ static VALUE call(VALUE self%(value_args));
717
+
718
+ private:
719
+ Func func_;
720
+ Exception_Handler const * handler_;
721
+ };
722
+
723
+ // ---------------------------------------------------------------------
724
+ END
725
+ ipp_head = <<END
726
+ #include "method_data.hpp"
727
+ #include "../ruby_try_catch.hpp"
728
+ #include "../to_from_ruby.hpp"
729
+ #include <typeinfo>
730
+ END
731
+ ipp_filename = 'detail/Auto_Member_Function_Wrapper.ipp'
732
+ hpp_filename = 'detail/Auto_Member_Function_Wrapper.hpp'
733
+ wrap_header(hpp_filename, 'Rice::detail', docstring, true) do |hpp|
734
+ wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
735
+ j = MAX_ARGS # TODO: what's the best way to iterate backward?
736
+ while j >= 0 do
737
+ t_array = (1..j).to_a
738
+ value_args = t_array.map { |x| ", VALUE ruby_arg#{x}" }
739
+ arg_list = t_array.map { |x| "arg#{x}" }.join(', ')
740
+ typenames = t_array.map { |x| ", Arg#{x}_T" }
741
+ typenames_n = t_array.map { |x| "Arg#{x}_T" }.join(', ')
742
+ arg_convert_list = t_array.map do |x|
743
+ "Arg#{x}_T arg#{x}(from_ruby<Arg#{x}_T>(ruby_arg#{x})); "
744
+ end
745
+ if j == MAX_ARGS then
746
+ typename_list = t_array.map { |x| ", typename Arg#{x}_T" }.join
747
+ typename_list_d = t_array.map { |x| ", typename Arg#{x}_T = void" }.join
748
+ specializations = ''
749
+ else
750
+ typename_list = t_array.map { |x| ", typename Arg#{x}_T" }.join
751
+ typename_list_d = typename_list
752
+ specializations = "<Func_T, Ret_T, Self_T#{typenames}>"
753
+ end
754
+ ipp.puts fill_template(ipp_template, {
755
+ :value_args => value_args,
756
+ :arg_list => arg_list,
757
+ :typenames => typenames,
758
+ :typename_list => typename_list,
759
+ :arg_convert_list => arg_convert_list,
760
+ })
761
+ hpp.puts fill_template(hpp_template, {
762
+ :value_args => value_args,
763
+ :typenames => typenames,
764
+ # :typenames_n => typenames_n,
765
+ :typename_list => typename_list,
766
+ :typename_list_d => typename_list_d,
767
+ :j => j,
768
+ :specializations => specializations,
769
+ })
770
+ j -= 1
771
+ end
772
+ end
773
+ end
774
+
775
+ =begin
776
+ # ======================================================================
777
+ docstring = <<END
778
+ END
779
+ ipp_template = <<END
780
+ template<typename Ret_T, %(typename_list)>
781
+ void define_method_and_auto_wrap(
782
+ VALUE klass,
783
+ char const * name,
784
+ Ret_T (*func)(%(typenames)),
785
+ Exception_Handler const * handler)
786
+ {
787
+ // TODO: Register this wrapper with the GC?
788
+ Auto_Function_Wrapper<Ret_T, %(typenames)> * wrapper = new
789
+ Auto_Function_Wrapper<Ret_T, %(typenames)>(func, handler);
790
+ define_method_with_data(
791
+ klass,
792
+ name,
793
+ (RUBY_METHOD_FUNC)Auto_Function_Wrapper<Ret_T, %(typenames)>::call,
794
+ (RUBY_METHOD_FUNC)Auto_Function_Wrapper<Ret_T, %(typenames)>::Num_Args,
795
+ wrapper);
796
+ }
797
+
798
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
799
+ void define_method_and_auto_wrap(
800
+ VALUE klass,
801
+ char const * name,
802
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
803
+ Exception_Handler const * handler)
804
+ {
805
+ // TODO: Register this wrapper with the GC?
806
+ Auto_Member_Function_Wrapper<Ret_T, Self_T%(typenames_no_self)> * wrapper = new
807
+ Auto_Member_Function_Wrapper<Ret_T, Self_T%(typenames_no_self)>(func, handler);
808
+ define_method_with_data(
809
+ klass,
810
+ name,
811
+ (RUBY_METHOD_FUNC)Auto_Member_Function_Wrapper<Ret_T, Self_T%(typenames_no_self)>::call,
812
+ %(j),
813
+ wrapper);
814
+ }
815
+
816
+ // ---------------------------------------------------------------------
817
+ END
818
+ hpp_template = <<END
819
+ template<typename Ret_T, %(typename_list)>
820
+ void define_method_and_auto_wrap(
821
+ VALUE klass,
822
+ char const * name,
823
+ Ret_T (*func)(%(typenames)),
824
+ Exception_Handler const * handler = 0);
825
+
826
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
827
+ void define_method_and_auto_wrap(
828
+ VALUE klass,
829
+ char const * name,
830
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
831
+ Exception_Handler const * handler = 0);
832
+
833
+ // ---------------------------------------------------------------------
834
+ END
835
+ hpp_head = <<END
836
+ #include "Exception_Handler.hpp"
837
+ END
838
+ ipp_head = <<END
839
+ #include "Auto_Function_Wrapper.hpp"
840
+ #include "Auto_Member_Function_Wrapper.hpp"
841
+ END
842
+ ipp_filename = 'detail/define_method_and_auto_wrap.ipp'
843
+ hpp_filename = 'detail/define_method_and_auto_wrap.hpp'
844
+ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
845
+ wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
846
+ for j in 0..MAX_ARGS do
847
+ t_array = (0..j).to_a
848
+ typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
849
+ typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
850
+ t_array.shift
851
+ typenames_no_self = t_array.map { |x| ", Arg#{x}_T" }
852
+ typename_list_no_self = t_array.map { |x| ", typename Arg#{x}_T" }
853
+ typenames_no_self_no_comma = typenames_no_self.to_s.sub(', ', '')
854
+ ipp.puts fill_template(ipp_template, {
855
+ :typenames => typenames,
856
+ :typename_list => typename_list,
857
+ :typenames_no_self => typenames_no_self,
858
+ :typename_list_no_self => typename_list_no_self,
859
+ :typenames_no_self_no_comma => typenames_no_self_no_comma,
860
+ :j => j,
861
+ })
862
+ hpp.puts fill_template(hpp_template, {
863
+ :typenames => typenames,
864
+ :typename_list => typename_list,
865
+ :typename_list_no_self => typename_list_no_self,
866
+ :typenames_no_self_no_comma => typenames_no_self_no_comma,
867
+ })
868
+ end
869
+ end
870
+ end
871
+ # ======================================================================
872
+ =end
873
+
874
+ docstring = <<END
875
+ END
876
+ ipp_template = <<END
877
+ template<typename Ret_T, %(typename_list)>
878
+ Wrapped_Function * wrap_function(
879
+ Ret_T (*func)(%(typenames)),
880
+ Exception_Handler const * handler)
881
+ {
882
+ typedef Ret_T (*Func)(%(typenames));
883
+ return new Auto_Function_Wrapper<Func, Ret_T, %(typenames)>(func, handler);
884
+ }
885
+
886
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
887
+ Wrapped_Function * wrap_function(
888
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
889
+ Exception_Handler const * handler)
890
+ {
891
+ typedef Ret_T (Self_T::*Func)(%(typenames_no_self_no_comma));
892
+ return new Auto_Member_Function_Wrapper<Func, Ret_T, Self_T%(typenames_no_self)>(func, handler);
893
+ }
894
+
895
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
896
+ Wrapped_Function * wrap_function(
897
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)) const,
898
+ Exception_Handler const * handler)
899
+ {
900
+ typedef Ret_T (Self_T::*Func)(%(typenames_no_self_no_comma)) const;
901
+ return new Auto_Member_Function_Wrapper<Func, Ret_T, Self_T%(typenames_no_self)>(func, handler);
902
+ }
903
+
904
+ // ---------------------------------------------------------------------
905
+ END
906
+ hpp_template = <<END
907
+ template<typename Ret_T, %(typename_list)>
908
+ Wrapped_Function * wrap_function(
909
+ Ret_T (*func)(%(typenames)),
910
+ Exception_Handler const * handler = 0);
911
+
912
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
913
+ Wrapped_Function * wrap_function(
914
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
915
+ Exception_Handler const * handler = 0);
916
+
917
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
918
+ Wrapped_Function * wrap_function(
919
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)) const,
920
+ Exception_Handler const * handler = 0);
921
+
922
+ // ---------------------------------------------------------------------
923
+ END
924
+ hpp_head = <<END
925
+ #include "Exception_Handler.hpp"
926
+ #include "Wrapped_Function.hpp"
927
+
928
+ END
929
+ ipp_head = <<END
930
+ #include "Auto_Function_Wrapper.hpp"
931
+ #include "Auto_Member_Function_Wrapper.hpp"
932
+ END
933
+ ipp_filename = 'detail/wrap_function.ipp'
934
+ hpp_filename = 'detail/wrap_function.hpp'
935
+ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
936
+ wrap_header(ipp_filename, 'Rice::detail', nil, false, ipp_head) do |ipp|
937
+ for j in 0..MAX_ARGS do
938
+ t_array = (0..j).to_a
939
+ typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
940
+ typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
941
+ t_array.shift
942
+ typenames_no_self = t_array.map { |x| ", Arg#{x}_T" }
943
+ typename_list_no_self = t_array.map { |x| ", typename Arg#{x}_T" }
944
+ typenames_no_self_no_comma = typenames_no_self.to_s.sub(', ', '')
945
+ ipp.puts fill_template(ipp_template, {
946
+ :typenames => typenames,
947
+ :typename_list => typename_list,
948
+ :typenames_no_self => typenames_no_self,
949
+ :typename_list_no_self => typename_list_no_self,
950
+ :typenames_no_self_no_comma => typenames_no_self_no_comma,
951
+ })
952
+ hpp.puts fill_template(hpp_template, {
953
+ :typenames => typenames,
954
+ :typename_list => typename_list,
955
+ :typename_list_no_self => typename_list_no_self,
956
+ :typenames_no_self_no_comma => typenames_no_self_no_comma,
957
+ })
958
+ end
959
+ end
960
+ end
961
+
962
+ # ======================================================================
963
+ # TODO: we have to implement this function in the class definition due
964
+ # to a bug in g++
965
+ void_list = (0..MAX_ARGS).to_a.map { |x| ", typename Arg#{x}_T=void" }
966
+ hpp_start = <<END
967
+ template<typename T#{void_list}>
968
+ class Constructor
969
+ {
970
+ private:
971
+ Constructor()
972
+ {
973
+ }
974
+ };
975
+
976
+ END
977
+ hpp_template = <<END
978
+ template<typename T%(typename_list)>
979
+ class Constructor<T%(type_list)%(void_list)>
980
+ {
981
+ public:
982
+ static void construct(Object self%(arg_list))
983
+ {
984
+ DATA_PTR(self.value()) = new T(%(arg_names));
985
+ }
986
+ };
987
+
988
+ END
989
+ hpp_head = <<END
990
+ #include "to_from_ruby_defn.hpp"
991
+ #include "detail/method_data.hpp"
992
+ END
993
+ hpp_filename = 'Constructor.hpp'
994
+ wrap_header(hpp_filename, 'Rice', nil, false, hpp_head) do |hpp|
995
+ hpp.puts hpp_start
996
+ for j in 0..MAX_ARGS do
997
+ t_array = (1..j).to_a
998
+ o_array = (j..MAX_ARGS).to_a
999
+ typename_list = t_array.map { |x| ", typename Arg#{x}_T" }
1000
+ type_list = t_array.map { |x| ", Arg#{x}_T" }
1001
+ void_list = o_array.map { |x| ", void" }
1002
+ arg_list = t_array.map { |x| ", Arg#{x}_T arg#{x}" }
1003
+ arg_names = t_array.map { |x| "arg#{x}" }.join(', ')
1004
+ hpp.puts fill_template(hpp_template, {
1005
+ :typename_list => typename_list,
1006
+ :type_list => type_list,
1007
+ :void_list => void_list,
1008
+ :arg_list => arg_list,
1009
+ :arg_names => arg_names,
1010
+ })
1011
+ end
1012
+ end
1013
+
1014
+ if ARGV[0] == '--clean' then
1015
+ $filenames.each do |filename|
1016
+ File.rm_f(filename)
1017
+ end
1018
+ end
1019
+
1020
+ =begin
1021
+ # ======================================================================
1022
+ docstring = <<END
1023
+ END
1024
+ hpp_template = <<END
1025
+ struct Function_Traits<Ret_T, %(typenames)>
1026
+ {
1027
+ typedef Ret_T Result_Type;
1028
+ typedef
1029
+ }
1030
+
1031
+ template<typename Ret_T, %(typename_list)>
1032
+ Function_Traits<Ret_T, %(typenames)> functor_traits(
1033
+ Ret_T (*func)(%(typenames)),
1034
+ Exception_Handler const * handler = 0);
1035
+
1036
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
1037
+ Function_Traits<Ret_T, %(typenames)> functor_traits(
1038
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)),
1039
+ Exception_Handler const * handler = 0);
1040
+
1041
+ template<typename Ret_T, typename Self_T%(typename_list_no_self)>
1042
+ Member_Function_Traits<Ret_T, Self_T%(typenames_no_self) > functor_traits(
1043
+ Ret_T (Self_T::*func)(%(typenames_no_self_no_comma)) const,
1044
+ Exception_Handler const * handler = 0);
1045
+
1046
+ // ---------------------------------------------------------------------
1047
+ END
1048
+ hpp_head = <<END
1049
+ #include "Exception_Handler.hpp"
1050
+ #include "Wrapped_Function.hpp"
1051
+
1052
+ END
1053
+ hpp_tail = <<END
1054
+
1055
+ template<typename T>
1056
+ functor_traits(&T::operator())
1057
+
1058
+ END
1059
+ ipp_head = <<END
1060
+ #include "Auto_Function_Wrapper.hpp"
1061
+ #include "Auto_Member_Function_Wrapper.hpp"
1062
+ END
1063
+ ipp_filename = 'detail/function_traits.ipp'
1064
+ hpp_filename = 'detail/function_traits.hpp'
1065
+ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head, hpp_tail) do |hpp|
1066
+ for j in 0..MAX_ARGS do
1067
+ t_array = (0..j).to_a
1068
+ typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
1069
+ typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
1070
+ t_array.shift
1071
+ typenames_no_self = t_array.map { |x| ", Arg#{x}_T" }
1072
+ typename_list_no_self = t_array.map { |x| ", typename Arg#{x}_T" }
1073
+ typenames_no_self_no_comma = typenames_no_self.to_s.sub(', ', '')
1074
+ ipp.puts fill_template(ipp_template, {
1075
+ :typenames => typenames,
1076
+ :typename_list => typename_list,
1077
+ :typenames_no_self => typenames_no_self,
1078
+ :typename_list_no_self => typename_list_no_self,
1079
+ :typenames_no_self_no_comma => typenames_no_self_no_comma,
1080
+ })
1081
+ hpp.puts fill_template(hpp_template, {
1082
+ :typenames => typenames,
1083
+ :typename_list => typename_list,
1084
+ :typename_list_no_self => typename_list_no_self,
1085
+ :typenames_no_self_no_comma => typenames_no_self_no_comma,
1086
+ })
1087
+ end
1088
+ end
1089
+ =end
1090
+
1091
+ end # if __FILE__ == $0 then
1092
+