rice 3.0.0 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/include/rice/stl.hpp +1113 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +12 -14
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +11 -6
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -46
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. data/test/test_rice.rb +0 -45
@@ -1,36 +1,414 @@
1
- #include "../Data_Object.hpp"
1
+ #include "RubyFunction.hpp"
2
+ #include "../Return.hpp"
2
3
 
3
- template<typename T>
4
- Rice::Object
5
- Rice::detail::to_ruby_<T>::
6
- convert(T const & x)
4
+ namespace Rice
7
5
  {
8
- if(Data_Type<T>::is_bound())
6
+ namespace detail
9
7
  {
10
- return Rice::Data_Object<T >(new T(x), Rice::Data_Type<T >::klass());
11
- }
12
- else
13
- {
14
- std::string s("Unable to convert ");
15
- s += demangle(typeid(T *).name());
16
- throw std::invalid_argument(s.c_str());
17
- }
18
- }
8
+ template<>
9
+ class To_Ruby<void>
10
+ {
11
+ public:
12
+ VALUE convert(void const*)
13
+ {
14
+ return Qnil;
15
+ }
16
+ };
19
17
 
20
- template<typename T>
21
- Rice::Object
22
- Rice::detail::to_ruby_<T *>::
23
- convert(T * x)
24
- {
25
- if(Data_Type<T>::is_bound())
26
- {
27
- Data_Object<T> obj(x);
28
- return obj;
29
- }
30
- else
31
- {
32
- std::string s("Unable to convert ");
33
- s += demangle(typeid(T *).name());
34
- throw std::invalid_argument(s.c_str());
18
+ template<>
19
+ class To_Ruby<std::nullptr_t>
20
+ {
21
+ public:
22
+ VALUE convert(std::nullptr_t const)
23
+ {
24
+ return Qnil;
25
+ }
26
+ };
27
+
28
+ template<>
29
+ class To_Ruby<short>
30
+ {
31
+ public:
32
+ VALUE convert(short const& x)
33
+ {
34
+ #ifdef rb_int2num_inline
35
+ return protect(rb_int2num_inline, (int)x);
36
+ #else
37
+ return RB_INT2NUM(x);
38
+ #endif
39
+ }
40
+ };
41
+
42
+ template<>
43
+ class To_Ruby<short&>
44
+ {
45
+ public:
46
+ VALUE convert(short const& x)
47
+ {
48
+ #ifdef rb_int2num_inline
49
+ return protect(rb_int2num_inline, (int)x);
50
+ #else
51
+ return RB_INT2NUM(x);
52
+ #endif
53
+ }
54
+ };
55
+
56
+ template<>
57
+ class To_Ruby<int>
58
+ {
59
+ public:
60
+ VALUE convert(int const& x)
61
+ {
62
+ #ifdef rb_int2num_inline
63
+ return protect(rb_int2num_inline, (int)x);
64
+ #else
65
+ return RB_INT2NUM(x);
66
+ #endif
67
+ }
68
+ };
69
+
70
+ template<>
71
+ class To_Ruby<int&>
72
+ {
73
+ public:
74
+ VALUE convert(int const& x)
75
+ {
76
+ #ifdef rb_int2num_inline
77
+ return protect(rb_int2num_inline, (int)x);
78
+ #else
79
+ return RB_INT2NUM(x);
80
+ #endif
81
+ }
82
+ };
83
+
84
+ template<>
85
+ class To_Ruby<long>
86
+ {
87
+ public:
88
+ VALUE convert(long const& x)
89
+ {
90
+ return protect(rb_long2num_inline, x);
91
+ }
92
+ };
93
+
94
+ template<>
95
+ class To_Ruby<long&>
96
+ {
97
+ public:
98
+ VALUE convert(long const& x)
99
+ {
100
+ return protect(rb_long2num_inline, x);
101
+ }
102
+ };
103
+
104
+ template<>
105
+ class To_Ruby<long long>
106
+ {
107
+ public:
108
+ VALUE convert(long long const& x)
109
+ {
110
+ return protect(rb_ll2inum, x);
111
+ }
112
+ };
113
+
114
+ template<>
115
+ class To_Ruby<long long&>
116
+ {
117
+ public:
118
+ VALUE convert(long long const& x)
119
+ {
120
+ return protect(rb_ll2inum, x);
121
+ }
122
+ };
123
+
124
+ template<>
125
+ class To_Ruby<unsigned short>
126
+ {
127
+ public:
128
+ VALUE convert(unsigned short const& x)
129
+ {
130
+ #ifdef rb_int2num_inline
131
+ return protect(rb_uint2num_inline, (unsigned int)x);
132
+ #else
133
+ return RB_UINT2NUM(x);
134
+ #endif
135
+ }
136
+ };
137
+
138
+ template<>
139
+ class To_Ruby<unsigned short&>
140
+ {
141
+ public:
142
+ VALUE convert(unsigned short const& x)
143
+ {
144
+ #ifdef rb_int2num_inline
145
+ return protect(rb_uint2num_inline, (unsigned int)x);
146
+ #else
147
+ return RB_UINT2NUM(x);
148
+ #endif
149
+ }
150
+ };
151
+
152
+ template<>
153
+ class To_Ruby<unsigned int>
154
+ {
155
+ public:
156
+ VALUE convert(unsigned int const& x)
157
+ {
158
+ #ifdef rb_int2num_inline
159
+ return protect(rb_uint2num_inline, (unsigned int)x);
160
+ #else
161
+ return RB_UINT2NUM(x);
162
+ #endif
163
+ }
164
+ };
165
+
166
+ template<>
167
+ class To_Ruby<unsigned int&>
168
+ {
169
+ public:
170
+ VALUE convert(unsigned int const& x)
171
+ {
172
+ #ifdef rb_int2num_inline
173
+ return protect(rb_uint2num_inline, (unsigned int)x);
174
+ #else
175
+ return RB_UINT2NUM(x);
176
+ #endif
177
+ }
178
+ };
179
+
180
+ template<>
181
+ class To_Ruby<unsigned long>
182
+ {
183
+ public:
184
+ To_Ruby() = default;
185
+
186
+ explicit To_Ruby(Return* returnInfo) : returnInfo_(returnInfo)
187
+ {
188
+ }
189
+
190
+ VALUE convert(unsigned long const& x)
191
+ {
192
+ if (this->returnInfo_ && this->returnInfo_->getIsValue())
193
+ {
194
+ return x;
195
+ }
196
+ else
197
+ {
198
+ return protect(rb_ulong2num_inline, x);
199
+ }
200
+ }
201
+
202
+ private:
203
+ Return* returnInfo_ = nullptr;
204
+ };
205
+
206
+ template<>
207
+ class To_Ruby<unsigned long&>
208
+ {
209
+ public:
210
+ To_Ruby() = default;
211
+
212
+ explicit To_Ruby(Return* returnInfo) : returnInfo_(returnInfo)
213
+ {
214
+ }
215
+
216
+ VALUE convert(unsigned long const& x)
217
+ {
218
+ if (this->returnInfo_ && this->returnInfo_->getIsValue())
219
+ {
220
+ return x;
221
+ }
222
+ else
223
+ {
224
+ return protect(rb_ulong2num_inline, x);
225
+ }
226
+ }
227
+
228
+ private:
229
+ Return* returnInfo_ = nullptr;
230
+ };
231
+
232
+ template<>
233
+ class To_Ruby<unsigned long long>
234
+ {
235
+ public:
236
+ To_Ruby() = default;
237
+
238
+ explicit To_Ruby(Return* returnInfo) : returnInfo_(returnInfo)
239
+ {
240
+ }
241
+
242
+ VALUE convert(unsigned long long const& x)
243
+ {
244
+ if (this->returnInfo_ && this->returnInfo_->getIsValue())
245
+ {
246
+ return x;
247
+ }
248
+ else
249
+ {
250
+ return protect(rb_ull2inum, (unsigned long long)x);
251
+ }
252
+ }
253
+
254
+ private:
255
+ Return* returnInfo_ = nullptr;
256
+ };
257
+
258
+ template<>
259
+ class To_Ruby<unsigned long long&>
260
+ {
261
+ public:
262
+ To_Ruby() = default;
263
+
264
+ explicit To_Ruby(Return* returnInfo) : returnInfo_(returnInfo)
265
+ {
266
+ }
267
+
268
+ VALUE convert(unsigned long long const& x)
269
+ {
270
+ if (this->returnInfo_ && this->returnInfo_->getIsValue())
271
+ {
272
+ return x;
273
+ }
274
+ else
275
+ {
276
+ return protect(rb_ull2inum, (unsigned long long)x);
277
+ }
278
+ }
279
+
280
+ private:
281
+ Return* returnInfo_ = nullptr;
282
+ };
283
+
284
+ template<>
285
+ class To_Ruby<float>
286
+ {
287
+ public:
288
+ VALUE convert(float const& x)
289
+ {
290
+ return protect(rb_float_new, (double)x);
291
+ }
292
+ };
293
+
294
+ template<>
295
+ class To_Ruby<float&>
296
+ {
297
+ public:
298
+ VALUE convert(float const& x)
299
+ {
300
+ return protect(rb_float_new, (double)x);
301
+ }
302
+ };
303
+
304
+ template<>
305
+ class To_Ruby<double>
306
+ {
307
+ public:
308
+ VALUE convert(double const& x)
309
+ {
310
+ return protect(rb_float_new, x);
311
+ }
312
+ };
313
+
314
+ template<>
315
+ class To_Ruby<double&>
316
+ {
317
+ public:
318
+ VALUE convert(double const& x)
319
+ {
320
+ return protect(rb_float_new, x);
321
+ }
322
+ };
323
+
324
+ template<>
325
+ class To_Ruby<bool>
326
+ {
327
+ public:
328
+ VALUE convert(bool const& x)
329
+ {
330
+ return x ? Qtrue : Qfalse;
331
+ }
332
+ };
333
+
334
+ template<>
335
+ class To_Ruby<bool&>
336
+ {
337
+ public:
338
+ VALUE convert(bool const& x)
339
+ {
340
+ return x ? Qtrue : Qfalse;
341
+ }
342
+ };
343
+
344
+ template<>
345
+ class To_Ruby<char>
346
+ {
347
+ public:
348
+ VALUE convert(char const& x)
349
+ {
350
+ return To_Ruby<int>().convert(x);
351
+ }
352
+ };
353
+
354
+ template<>
355
+ class To_Ruby<char&>
356
+ {
357
+ public:
358
+ VALUE convert(char const& x)
359
+ {
360
+ return To_Ruby<int>().convert(x);
361
+ }
362
+ };
363
+
364
+ template<>
365
+ class To_Ruby<unsigned char>
366
+ {
367
+ public:
368
+ VALUE convert(unsigned char const& x)
369
+ {
370
+ return To_Ruby<unsigned int>().convert(x);
371
+ }
372
+ };
373
+
374
+ template<>
375
+ class To_Ruby<unsigned char&>
376
+ {
377
+ public:
378
+ VALUE convert(unsigned char const& x)
379
+ {
380
+ return To_Ruby<unsigned int>().convert(x);
381
+ }
382
+ };
383
+
384
+ template<>
385
+ class To_Ruby<signed char>
386
+ {
387
+ public:
388
+ VALUE convert(signed char const& x)
389
+ {
390
+ return To_Ruby<signed int>().convert(x);
391
+ }
392
+ };
393
+
394
+ template<>
395
+ class To_Ruby<signed char&>
396
+ {
397
+ public:
398
+ VALUE convert(signed char const& x)
399
+ {
400
+ return To_Ruby<signed int>().convert(x);
401
+ }
402
+ };
403
+
404
+ template<>
405
+ class To_Ruby<char*>
406
+ {
407
+ public:
408
+ VALUE convert(char const* x)
409
+ {
410
+ return protect(rb_str_new2, x);
411
+ }
412
+ };
35
413
  }
36
- }
414
+ }
@@ -0,0 +1,48 @@
1
+ #ifndef Rice__detail__to_ruby_defn__hpp_
2
+ #define Rice__detail__to_ruby_defn__hpp_
3
+
4
+ #include "rice_traits.hpp"
5
+
6
+ namespace Rice
7
+ {
8
+ namespace detail
9
+ {
10
+ //! Convert a C++ object to Ruby.
11
+ /*! If x is a pointer, wraps the pointee as a Ruby object. If x is an
12
+ * Object, returns x.
13
+ *
14
+ * If no conversion exists a compile-time error is generated.
15
+ *
16
+ * \param x the object to convert.
17
+ * \return a Ruby representation of the C++ object.
18
+ *
19
+ * Example:
20
+ * \code
21
+ * rb_p(to_ruby(42));
22
+ *
23
+ * Foo * p_foo = new Foo();
24
+ * rb_p(to_ruby(p_foo));
25
+ * \endcode
26
+ */
27
+ template <typename T>
28
+ class To_Ruby;
29
+
30
+ // Helper template function that let's users avoid having to specify the template type - its deduced
31
+ template <typename T>
32
+ VALUE to_ruby(T&& x)
33
+ {
34
+ using Unqualified_T = remove_cv_recursive_t<T>;
35
+ return To_Ruby<Unqualified_T>().convert(std::forward<T>(x));
36
+ }
37
+
38
+ // Helper template function that let's users avoid having to specify the template type - its deduced
39
+ template <typename T>
40
+ VALUE to_ruby(T* x)
41
+ {
42
+ using Unqualified_T = remove_cv_recursive_t<T>;
43
+ return To_Ruby<Unqualified_T*>().convert(x);
44
+ }
45
+ } // detail
46
+ } // Rice
47
+
48
+ #endif // Rice__detail__to_ruby_defn__hpp_
@@ -0,0 +1,82 @@
1
+ #ifndef Rice__Forward_Declares__ipp_
2
+ #define Rice__Forward_Declares__ipp_
3
+
4
+ namespace Rice
5
+ {
6
+ // These methods cannot be defined where they are declared due to circular dependencies
7
+ inline Class Object::class_of() const
8
+ {
9
+ return detail::protect(rb_class_of, value_);
10
+ }
11
+
12
+ inline String Object::to_s() const
13
+ {
14
+ return call("to_s");
15
+ }
16
+
17
+ inline String Object::class_name() const
18
+ {
19
+ return detail::protect(rb_obj_classname, this->value());
20
+ }
21
+
22
+ inline String Object::inspect() const
23
+ {
24
+ return call("inspect");
25
+ }
26
+
27
+ inline Object Object::instance_eval(String const& s)
28
+ {
29
+ const VALUE argv[] = { s.value() };
30
+ return detail::protect(rb_obj_instance_eval, 1, &argv[0], this->value());
31
+ }
32
+
33
+ inline Object Object::vcall(Identifier id, Array args)
34
+ {
35
+ std::vector<VALUE> a(args.size());
36
+
37
+ Array::const_iterator it = args.begin();
38
+ Array::const_iterator end = args.end();
39
+
40
+ for (int i = 0; it != end; i++, ++it)
41
+ {
42
+ a[i] = it->value();
43
+ }
44
+
45
+ return detail::protect(rb_funcall3, this->value(), id.id(), (int)args.size(), (const VALUE*)a.data());
46
+ }
47
+
48
+ inline std::ostream& operator<<(std::ostream& out, Object const& obj)
49
+ {
50
+ String s(obj.to_s());
51
+ out << s.c_str();
52
+ return out;
53
+ }
54
+
55
+ inline Identifier::Identifier(Symbol const& symbol) : id_(SYM2ID(symbol.value()))
56
+ {
57
+ }
58
+
59
+ inline String Module::name() const
60
+ {
61
+ VALUE name = detail::protect(rb_mod_name, this->value());
62
+ if (name == Qnil)
63
+ {
64
+ return String("");
65
+ }
66
+ else
67
+ {
68
+ return name;
69
+ }
70
+ }
71
+
72
+ inline Array Module::ancestors() const
73
+ {
74
+ return detail::protect(rb_mod_ancestors, this->value());
75
+ }
76
+
77
+ inline Class Module::singleton_class() const
78
+ {
79
+ return CLASS_OF(value());
80
+ }
81
+ }
82
+ #endif // Rice__Forward_Declares__ipp_
@@ -5,27 +5,23 @@
5
5
 
6
6
  namespace Rice
7
7
  {
8
+ template<typename Function_T>
9
+ [[deprecated("Please call define_global_function with Arg parameters")]]
10
+ void define_global_function(char const * name, Function_T&& func, MethodInfo* arguments);
8
11
 
9
- /**
10
- * Helper forwarder method to easily wrap
11
- * globally available functions. This simply
12
- * forwards off a call to define_module_function
13
- * on rb_mKernel
14
- */
15
- template<typename Func_T>
16
- void define_global_function(
17
- char const * name,
18
- Func_T func,
19
- Arguments* arguments = 0);
20
-
21
- // FIXME: See Module::define_method with Arg
22
- template<typename Func_T>
23
- void define_global_function(
24
- char const * name,
25
- Func_T func,
26
- Arg const& arg);
27
-
28
-
12
+ //! Define an global function
13
+ /*! The method's implementation can be any function or static member
14
+ * function. A wrapper will be generated which will convert the arguments
15
+ * from ruby types to C++ types before calling the function. The return
16
+ * value will be converted back to ruby.
17
+ * \param name the name of the method
18
+ * \param func the implementation of the function, either a function
19
+ * pointer or a member function pointer.
20
+ * \param args a list of Arg instance used to define default parameters (optional)
21
+ * \return *this
22
+ */
23
+ template<typename Function_T, typename...Arg_Ts>
24
+ void define_global_function(char const * name, Function_T&& func, Arg_Ts const& ...args);
29
25
  } // Rice
30
26
 
31
27
  #include "global_function.ipp"
@@ -1,22 +1,13 @@
1
- #include "detail/define_method_and_auto_wrap.hpp"
1
+ #include "cpp_api/Module.hpp"
2
2
 
3
- template<typename Func_T>
4
- void Rice::define_global_function(
5
- char const * name,
6
- Func_T func,
7
- Arguments* arguments)
3
+ template<typename Function_T>
4
+ void Rice::define_global_function(char const * name, Function_T&& func, MethodInfo* methodInfo)
8
5
  {
9
- Module(rb_mKernel).define_module_function(name, func, arguments);
6
+ Module(rb_mKernel).define_module_function(name, std::forward<Function_T>(func), methodInfo);
10
7
  }
11
8
 
12
- template<typename Func_T>
13
- void Rice::define_global_function(
14
- char const * name,
15
- Func_T func,
16
- Arg const& arg)
9
+ template<typename Function_T, typename...Arg_Ts>
10
+ void Rice::define_global_function(char const * name, Function_T&& func, Arg_Ts const& ...args)
17
11
  {
18
- Arguments* args = new Arguments();
19
- args->add(arg);
20
- define_global_function(name, func, args);
21
- }
22
-
12
+ Module(rb_mKernel).define_module_function(name, std::forward<Function_T>(func), args...);
13
+ }
data/rice/rice.hpp ADDED
@@ -0,0 +1,59 @@
1
+ #ifndef Rice__hpp_
2
+ #define Rice__hpp_
3
+
4
+ #include "detail/ruby.hpp"
5
+ #include "detail/rice_traits.hpp"
6
+ #include "detail/function_traits.hpp"
7
+ #include "detail/Type.hpp"
8
+ #include "detail/TypeRegistry.hpp"
9
+ #include "detail/Wrapper.hpp"
10
+ #include "detail/default_allocation_func.hpp"
11
+ #include "detail/Jump_Tag.hpp"
12
+ #include "Exception_defn.hpp"
13
+ #include "detail/RubyFunction.hpp"
14
+ #include "Return.hpp"
15
+ #include "Arg.hpp"
16
+ #include "detail/from_ruby.hpp"
17
+ #include "detail/to_ruby.hpp"
18
+ #include "detail/MethodInfo.hpp"
19
+ #include "detail/Exception_Handler.hpp"
20
+ #include "detail/Iterator.hpp"
21
+ #include "Exception.ipp"
22
+ #include "detail/method_data.hpp"
23
+ #include "ruby_try_catch.hpp"
24
+ #include "detail/NativeAttribute.hpp"
25
+ #include "detail/NativeFunction.hpp"
26
+
27
+ #include "ruby_mark.hpp"
28
+
29
+ #include "Identifier.hpp"
30
+
31
+ #include "cpp_api/Object.hpp"
32
+ #include "cpp_api/Builtin_Object.hpp"
33
+ #include "cpp_api/String.hpp"
34
+ #include "cpp_api/Array.hpp"
35
+ #include "cpp_api/Hash.hpp"
36
+ #include "cpp_api/Symbol.hpp"
37
+
38
+ #include "Address_Registration_Guard.hpp"
39
+ #include "cpp_api/Module.hpp"
40
+ #include "global_function.hpp"
41
+
42
+ #include "cpp_api/Class.hpp"
43
+ #include "cpp_api/Struct.hpp"
44
+
45
+ #include "Director.hpp"
46
+ #include "Data_Type.hpp"
47
+ #include "Constructor.hpp"
48
+ #include "Data_Object.hpp"
49
+ #include "detail/Iterator.ipp"
50
+
51
+ // Dependent on Data_Object due to the way method metadata is stored in the Ruby class
52
+ #include "detail/default_allocation_func.ipp"
53
+
54
+ #include "Enum.hpp"
55
+
56
+ // Dependent on Module, Class, Array and String
57
+ #include "forward_declares.ipp"
58
+
59
+ #endif // Rice__hpp_