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,60 +1,1034 @@
1
1
  #ifndef Rice__detail__from_ruby__ipp_
2
2
  #define Rice__detail__from_ruby__ipp_
3
3
 
4
- #include "../Data_Type.hpp"
5
- #include "../String.hpp"
6
- #include "demangle.hpp"
7
- #include <typeinfo>
8
-
9
- template<typename T>
10
- T Rice::detail::from_ruby_<T>::
11
- convert(Rice::Object x)
4
+ #include <optional>
5
+ #include <stdexcept>
6
+ #include "../Exception_defn.hpp"
7
+ #include "../Arg.hpp"
8
+ #include "RubyFunction.hpp"
9
+
10
+ /* This file implements conversions from Ruby to native values fo fundamental types
11
+ such as bool, int, float, etc. It also includes conversions for chars and strings */
12
+ namespace Rice::detail
12
13
  {
13
- if(rb_type(x.value()) == T_DATA)
14
+ // =========== short ============
15
+ template<>
16
+ class From_Ruby<short>
14
17
  {
15
- return *Data_Type<T>::from_ruby(x);
16
- }
17
- else
18
+ public:
19
+ From_Ruby() = default;
20
+
21
+ explicit From_Ruby(Arg* arg) : arg_(arg)
22
+ {
23
+ }
24
+
25
+ short convert(VALUE value)
26
+ {
27
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
28
+ {
29
+ return this->arg_->defaultValue<short>();
30
+ }
31
+ else
32
+ {
33
+ return protect(rb_num2short_inline, value);
34
+ }
35
+ }
36
+
37
+ private:
38
+ Arg* arg_ = nullptr;
39
+ };
40
+
41
+ template<>
42
+ class From_Ruby<short&>
18
43
  {
19
- std::string s("Unable to convert ");
20
- s += x.class_of().name().c_str();
21
- s += " to ";
22
- s += demangle(typeid(T).name());
23
- throw std::invalid_argument(s.c_str());
24
- }
25
- }
44
+ public:
45
+ From_Ruby() = default;
26
46
 
27
- template<typename T>
28
- T * Rice::detail::from_ruby_<T *>::
29
- convert(Rice::Object x)
30
- {
31
- if(rb_type(x.value()) == T_DATA)
47
+ explicit From_Ruby(Arg* arg) : arg_(arg)
48
+ {
49
+ }
50
+
51
+ short& convert(VALUE value)
52
+ {
53
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
54
+ {
55
+ return this->arg_->defaultValue<short>();
56
+ }
57
+ else
58
+ {
59
+ this->converted_ = protect(rb_num2short_inline, value);
60
+ return this->converted_;
61
+ }
62
+ }
63
+
64
+ private:
65
+ Arg* arg_ = nullptr;
66
+ short converted_ = 0;
67
+ };
68
+
69
+ template<>
70
+ class From_Ruby<short*>
32
71
  {
33
- return Data_Type<T>::from_ruby(x);
34
- }
35
- else
72
+ public:
73
+ short* convert(VALUE value)
74
+ {
75
+ if (value == Qnil)
76
+ {
77
+ return nullptr;
78
+ }
79
+ else
80
+ {
81
+ this->converted_ = protect(rb_num2short_inline, value);
82
+ return &this->converted_;
83
+ }
84
+ }
85
+
86
+ private:
87
+ short converted_ = 0;
88
+ };
89
+
90
+ // =========== int ============
91
+ template<>
92
+ class From_Ruby<int>
93
+ {
94
+ public:
95
+ From_Ruby() = default;
96
+
97
+ explicit From_Ruby(Arg* arg) : arg_(arg)
98
+ {
99
+ }
100
+
101
+ int convert(VALUE value)
102
+ {
103
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
104
+ {
105
+ return this->arg_->defaultValue<int>();
106
+ }
107
+ else
108
+ {
109
+ return (int)protect(rb_num2long_inline, value);
110
+ }
111
+ }
112
+
113
+ private:
114
+ Arg* arg_ = nullptr;
115
+ };
116
+
117
+ template<>
118
+ class From_Ruby<int&>
119
+ {
120
+ public:
121
+ From_Ruby() = default;
122
+
123
+ explicit From_Ruby(Arg* arg) : arg_(arg)
124
+ {
125
+ }
126
+
127
+ int& convert(VALUE value)
128
+ {
129
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
130
+ {
131
+ return this->arg_->defaultValue<int>();
132
+ }
133
+ else
134
+ {
135
+ this->converted_ = (int)protect(rb_num2long_inline, value);
136
+ return this->converted_;
137
+ }
138
+ }
139
+
140
+ private:
141
+ Arg* arg_ = nullptr;
142
+ int converted_ = 0;
143
+ };
144
+
145
+ template<>
146
+ class From_Ruby<int*>
147
+ {
148
+ public:
149
+ int* convert(VALUE value)
150
+ {
151
+ if (value == Qnil)
152
+ {
153
+ return nullptr;
154
+ }
155
+ else
156
+ {
157
+ this->converted_ = (int)protect(rb_num2long_inline, value);
158
+ return &this->converted_;
159
+ }
160
+ }
161
+
162
+ private:
163
+ int converted_;
164
+ };
165
+
166
+ // =========== long ============
167
+ template<>
168
+ class From_Ruby<long>
169
+ {
170
+ public:
171
+ From_Ruby() = default;
172
+
173
+ explicit From_Ruby(Arg* arg) : arg_(arg)
174
+ {
175
+ }
176
+
177
+ long convert(VALUE value)
178
+ {
179
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
180
+ {
181
+ return this->arg_->defaultValue<long>();
182
+ }
183
+ else
184
+ {
185
+ return protect(rb_num2long_inline, value);
186
+ }
187
+ }
188
+
189
+ private:
190
+ Arg* arg_ = nullptr;
191
+ };
192
+
193
+ template<>
194
+ class From_Ruby<long&>
36
195
  {
37
- std::string s("Unable to convert ");
38
- s += x.class_of().name().c_str();
39
- s += " to ";
40
- s += demangle(typeid(T *).name());
41
- throw std::invalid_argument(s.c_str());
196
+ public:
197
+ From_Ruby() = default;
198
+
199
+ explicit From_Ruby(Arg* arg) : arg_(arg)
200
+ {
201
+ }
202
+
203
+ long& convert(VALUE value)
204
+ {
205
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
206
+ {
207
+ return this->arg_->defaultValue<long>();
208
+ }
209
+ else
210
+ {
211
+ this->converted_ = protect(rb_num2long_inline, value);
212
+ return this->converted_;
213
+ }
214
+ }
215
+
216
+ private:
217
+ Arg* arg_ = nullptr;
218
+ long converted_ = 0;
219
+ };
220
+
221
+ template<>
222
+ class From_Ruby<long*>
223
+ {
224
+ public:
225
+ long* convert(VALUE value)
226
+ {
227
+ if (value == Qnil)
228
+ {
229
+ return nullptr;
230
+ }
231
+ else
232
+ {
233
+ this->converted_ = protect(rb_num2long_inline, value);
234
+ return &this->converted_;
235
+ }
236
+ }
237
+
238
+ private:
239
+ long converted_ = 0;
240
+ };
241
+
242
+ // =========== long long ============
243
+ template<>
244
+ class From_Ruby<long long>
245
+ {
246
+ public:
247
+ From_Ruby() = default;
248
+
249
+ explicit From_Ruby(Arg* arg) : arg_(arg)
250
+ {
251
+ }
252
+
253
+ long long convert(VALUE value)
254
+ {
255
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
256
+ {
257
+ return this->arg_->defaultValue<long long>();
258
+ }
259
+ else
260
+ {
261
+ return protect(rb_num2ll_inline, value);
262
+ }
263
+ }
264
+
265
+ private:
266
+ Arg* arg_ = nullptr;
267
+ };
268
+
269
+ template<>
270
+ class From_Ruby<long long&>
271
+ {
272
+ public:
273
+ From_Ruby() = default;
274
+
275
+ explicit From_Ruby(Arg* arg) : arg_(arg)
276
+ {
277
+ }
278
+
279
+ long long& convert(VALUE value)
280
+ {
281
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
282
+ {
283
+ return this->arg_->defaultValue<long long>();
284
+ }
285
+ else
286
+ {
287
+ this->converted_ = protect(rb_num2ll_inline, value);
288
+ return this->converted_;
289
+ }
290
+ }
291
+
292
+ private:
293
+ Arg* arg_ = nullptr;
294
+ long long converted_ = 0;
295
+ };
296
+
297
+ template<>
298
+ class From_Ruby<long long*>
299
+ {
300
+ public:
301
+ long long* convert(VALUE value)
302
+ {
303
+ if (value == Qnil)
304
+ {
305
+ return nullptr;
306
+ }
307
+ else
308
+ {
309
+ this->converted_ = protect(rb_num2ll_inline, value);
310
+ return &this->converted_;
311
+ }
312
+ }
313
+
314
+ private:
315
+ long long converted_ = 0;
316
+ };
317
+
318
+ // =========== unsigned short ============
319
+ template<>
320
+ class From_Ruby<unsigned short>
321
+ {
322
+ public:
323
+ From_Ruby() = default;
324
+
325
+ explicit From_Ruby(Arg* arg) : arg_(arg)
326
+ {
327
+ }
328
+
329
+ unsigned short convert(VALUE value)
330
+ {
331
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
332
+ {
333
+ return this->arg_->defaultValue<unsigned short>();
334
+ }
335
+ else
336
+ {
337
+ return protect(rb_num2ushort, value);
338
+ }
339
+ }
340
+
341
+ private:
342
+ Arg* arg_ = nullptr;
343
+ };
344
+
345
+ template<>
346
+ class From_Ruby<unsigned short&>
347
+ {
348
+ public:
349
+ From_Ruby() = default;
350
+
351
+ explicit From_Ruby(Arg* arg) : arg_(arg)
352
+ {
353
+ }
354
+
355
+ unsigned short& convert(VALUE value)
356
+ {
357
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
358
+ {
359
+ return this->arg_->defaultValue<unsigned short>();
360
+ }
361
+ else
362
+ {
363
+ this->converted_ = protect(rb_num2ushort, value);
364
+ return this->converted_;
365
+ }
366
+ }
367
+
368
+ private:
369
+ Arg* arg_ = nullptr;
370
+ unsigned short converted_ = 0;
371
+ };
372
+
373
+ template<>
374
+ class From_Ruby<unsigned short*>
375
+ {
376
+ public:
377
+ unsigned short* convert(VALUE value)
378
+ {
379
+ if (value == Qnil)
380
+ {
381
+ return nullptr;
382
+ }
383
+ else
384
+ {
385
+ this->converted_ = protect(rb_num2ushort, value);
386
+ return &this->converted_;
387
+ }
388
+ }
389
+
390
+ private:
391
+ unsigned short converted_ = 0;
392
+ };
393
+
394
+ // =========== unsigned int ============
395
+ template<>
396
+ class From_Ruby<unsigned int>
397
+ {
398
+ public:
399
+ From_Ruby() = default;
400
+
401
+ explicit From_Ruby(Arg* arg) : arg_(arg)
402
+ {
403
+ }
404
+
405
+ unsigned int convert(VALUE value)
406
+ {
407
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
408
+ {
409
+ return this->arg_->defaultValue<unsigned int>();
410
+ }
411
+ else
412
+ {
413
+ return (unsigned int)protect(rb_num2ulong_inline, value);
414
+ }
415
+ }
416
+
417
+ private:
418
+ Arg* arg_ = nullptr;
419
+ };
420
+
421
+ template<>
422
+ class From_Ruby<unsigned int&>
423
+ {
424
+ public:
425
+ From_Ruby() = default;
426
+
427
+ explicit From_Ruby(Arg* arg) : arg_(arg)
428
+ {
429
+ }
430
+
431
+ unsigned int& convert(VALUE value)
432
+ {
433
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
434
+ {
435
+ return this->arg_->defaultValue<unsigned int>();
436
+ }
437
+ else
438
+ {
439
+ this->converted_ = (unsigned int)protect(rb_num2ulong_inline, value);
440
+ return this->converted_;
441
+ }
442
+ }
443
+
444
+ private:
445
+ Arg* arg_ = nullptr;
446
+ unsigned int converted_ = 0;
447
+ };
448
+
449
+ template<>
450
+ class From_Ruby<unsigned int*>
451
+ {
452
+ public:
453
+ unsigned int* convert(VALUE value)
454
+ {
455
+ if (value == Qnil)
456
+ {
457
+ return nullptr;
458
+ }
459
+ else
460
+ {
461
+ this->converted_ = (unsigned int)protect(rb_num2ulong_inline, value);
462
+ return &this->converted_;
463
+ }
464
+ }
465
+
466
+ private:
467
+ unsigned int converted_ = 0;
468
+ };
469
+
470
+ // =========== unsigned long ============
471
+ template<>
472
+ class From_Ruby<unsigned long>
473
+ {
474
+ public:
475
+ From_Ruby() = default;
476
+
477
+ explicit From_Ruby(Arg* arg) : arg_(arg)
478
+ {
479
+ }
480
+
481
+ unsigned long convert(VALUE value)
482
+ {
483
+ if (this->arg_ && this->arg_->getIsValue())
484
+ {
485
+ return (unsigned long)value;
486
+ }
487
+ else if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
488
+ {
489
+ return this->arg_->defaultValue<unsigned long>();
490
+ }
491
+ else
492
+ {
493
+ return protect(rb_num2ulong_inline, value);
494
+ }
495
+ }
496
+
497
+ private:
498
+ Arg* arg_ = nullptr;
499
+ };
500
+
501
+ template<>
502
+ class From_Ruby<unsigned long&>
503
+ {
504
+ public:
505
+ From_Ruby() = default;
506
+
507
+ explicit From_Ruby(Arg* arg) : arg_(arg)
508
+ {
509
+ }
510
+
511
+ unsigned long& convert(VALUE value)
512
+ {
513
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
514
+ {
515
+ return this->arg_->defaultValue<unsigned long>();
516
+ }
517
+ else
518
+ {
519
+ this->converted_ = protect(rb_num2ulong_inline, value);
520
+ return this->converted_;
521
+ }
522
+ }
523
+
524
+ private:
525
+ Arg* arg_ = nullptr;
526
+ unsigned long converted_ = 0;
527
+ };
528
+
529
+ template<>
530
+ class From_Ruby<unsigned long*>
531
+ {
532
+ public:
533
+ unsigned long* convert(VALUE value)
534
+ {
535
+ if (value == Qnil)
536
+ {
537
+ return nullptr;
538
+ }
539
+ else
540
+ {
541
+ this->converted_ = protect(rb_num2ulong_inline, value);
542
+ return &this->converted_;
543
+ }
544
+ }
545
+
546
+ private:
547
+ unsigned long converted_ = 0;
548
+ };
549
+
550
+ // =========== unsigned long long ============
551
+ template<>
552
+ class From_Ruby<unsigned long long>
553
+ {
554
+ public:
555
+ From_Ruby() = default;
556
+
557
+ explicit From_Ruby(Arg* arg) : arg_(arg)
558
+ {
559
+ }
560
+
561
+ unsigned long long convert(VALUE value)
562
+ {
563
+ if (this->arg_ && this->arg_->getIsValue())
564
+ {
565
+ return value;
566
+ }
567
+ else if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
568
+ {
569
+ return this->arg_->defaultValue<unsigned long long>();
570
+ }
571
+ else
572
+ {
573
+ return protect(rb_num2ull, value);
574
+ }
575
+ }
576
+
577
+ private:
578
+ Arg* arg_ = nullptr;
579
+ };
580
+
581
+ template<>
582
+ class From_Ruby<unsigned long long&>
583
+ {
584
+ public:
585
+ From_Ruby() = default;
586
+
587
+ explicit From_Ruby(Arg* arg) : arg_(arg)
588
+ {
589
+ }
590
+
591
+ unsigned long long& convert(VALUE value)
592
+ {
593
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
594
+ {
595
+ return this->arg_->defaultValue<unsigned long long>();
596
+ }
597
+ else
598
+ {
599
+ this->converted_ = protect(rb_num2ull, value);
600
+ return this->converted_;
601
+ }
602
+ }
603
+
604
+ private:
605
+ Arg* arg_ = nullptr;
606
+ unsigned long long converted_ = 0;
607
+ };
608
+
609
+ template<>
610
+ class From_Ruby<unsigned long long*>
611
+ {
612
+ public:
613
+ unsigned long long* convert(VALUE value)
614
+ {
615
+ if (value == Qnil)
616
+ {
617
+ return nullptr;
618
+ }
619
+ else
620
+ {
621
+ this->converted_ = protect(rb_num2ull, value);
622
+ return &this->converted_;
623
+ }
624
+ }
625
+
626
+ private:
627
+ unsigned long long converted_ = 0;
628
+ };
629
+
630
+ // =========== bool ============
631
+ template<>
632
+ class From_Ruby<bool>
633
+ {
634
+ public:
635
+ From_Ruby() = default;
636
+
637
+ explicit From_Ruby(Arg* arg) : arg_(arg)
638
+ {
639
+ }
640
+
641
+ bool convert(VALUE value)
642
+ {
643
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
644
+ {
645
+ return this->arg_->defaultValue<bool>();
646
+ }
647
+ else
648
+ {
649
+ return RTEST(value);
650
+ }
651
+ }
652
+
653
+ private:
654
+ Arg* arg_ = nullptr;
655
+ };
656
+
657
+ template<>
658
+ class From_Ruby<bool&>
659
+ {
660
+ public:
661
+ From_Ruby() = default;
662
+
663
+ explicit From_Ruby(Arg* arg) : arg_(arg)
664
+ {
665
+ }
666
+
667
+ bool& convert(VALUE value)
668
+ {
669
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
670
+ {
671
+ return this->arg_->defaultValue<bool>();
672
+ }
673
+ else
674
+ {
675
+ this->converted_ = RTEST(value);
676
+ return this->converted_;
677
+ }
678
+ }
679
+
680
+ private:
681
+ Arg* arg_ = nullptr;
682
+ bool converted_ = false;
683
+ };
684
+
685
+ template<>
686
+ class From_Ruby<bool*>
687
+ {
688
+ public:
689
+ bool* convert(VALUE value)
690
+ {
691
+ if (value == Qnil)
692
+ {
693
+ return nullptr;
694
+ }
695
+ else
696
+ {
697
+ this->converted_ = RTEST(value);
698
+ return &this->converted_;
699
+ }
700
+ }
701
+
702
+ private:
703
+ bool converted_ = false;
704
+ };
705
+
706
+ // =========== char ============
707
+ template<typename T>
708
+ inline T charFromRuby(VALUE value)
709
+ {
710
+ switch (rb_type(value))
711
+ {
712
+ case T_STRING:
713
+ {
714
+ if (RSTRING_LEN(value) == 1)
715
+ {
716
+ return RSTRING_PTR(value)[0];
717
+ }
718
+ else
719
+ {
720
+ throw std::invalid_argument("from_ruby<char>: string must have length 1");
721
+ }
722
+ break;
723
+ }
724
+ case T_FIXNUM:
725
+ {
726
+ return From_Ruby<long>().convert(value) & 0xff;
727
+ break;
728
+ }
729
+ default:
730
+ {
731
+ throw Exception(rb_eTypeError, "wrong argument type %s (expected % s)",
732
+ detail::protect(rb_obj_classname, value), "char type");
733
+ }
734
+ }
42
735
  }
43
- }
736
+
737
+ template<>
738
+ class From_Ruby<char>
739
+ {
740
+ public:
741
+ From_Ruby() = default;
44
742
 
45
- template<typename T>
46
- T const * Rice::detail::from_ruby_<T const *>::
47
- convert(Rice::Object x)
48
- {
49
- return from_ruby<T *>(x);
50
- }
743
+ explicit From_Ruby(Arg* arg) : arg_(arg)
744
+ {
745
+ }
51
746
 
52
- template<typename T>
53
- T & Rice::detail::from_ruby_<T &>::
54
- convert(Rice::Object x)
55
- {
56
- return *from_ruby<T *>(x);
57
- }
747
+ char convert(VALUE value)
748
+ {
749
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
750
+ {
751
+ return this->arg_->defaultValue<char>();
752
+ }
753
+ else
754
+ {
755
+ return charFromRuby<char>(value);
756
+ }
757
+ }
758
+
759
+ private:
760
+ Arg* arg_ = nullptr;
761
+ };
58
762
 
59
- #endif // Rice__detail__from_ruby__ipp_
763
+ template<>
764
+ class From_Ruby<char&>
765
+ {
766
+ public:
767
+ From_Ruby() = default;
60
768
 
769
+ explicit From_Ruby(Arg* arg) : arg_(arg)
770
+ {
771
+ }
772
+
773
+ char& convert(VALUE value)
774
+ {
775
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
776
+ {
777
+ return this->arg_->defaultValue<char>();
778
+ }
779
+ else
780
+ {
781
+ this->converted_ = charFromRuby<char>(value);
782
+ return this->converted_;
783
+ }
784
+ }
785
+
786
+ private:
787
+ Arg* arg_ = nullptr;
788
+ char converted_ = 0;
789
+ };
790
+
791
+ template<>
792
+ class From_Ruby<char*>
793
+ {
794
+ public:
795
+ char* convert(VALUE value)
796
+ {
797
+ if (value == Qnil)
798
+ {
799
+ return nullptr;
800
+ }
801
+ else
802
+ {
803
+ detail::protect(rb_check_type, value, (int)T_STRING);
804
+ return RSTRING_PTR(value);
805
+ }
806
+ }
807
+ };
808
+
809
+ // This is mostly for testing. NativeFunction removes const before calling From_Ruby
810
+ template<>
811
+ class From_Ruby<char const*>
812
+ {
813
+ public:
814
+ char const* convert(VALUE value)
815
+ {
816
+ if (value == Qnil)
817
+ {
818
+ return nullptr;
819
+ }
820
+ else
821
+ {
822
+ detail::protect(rb_check_type, value, (int)T_STRING);
823
+ return RSTRING_PTR(value);
824
+ }
825
+ }
826
+ };
827
+
828
+ // =========== unsinged char ============
829
+ template<>
830
+ class From_Ruby<unsigned char>
831
+ {
832
+ public:
833
+ From_Ruby() = default;
834
+
835
+ explicit From_Ruby(Arg* arg) : arg_(arg)
836
+ {
837
+ }
838
+
839
+ unsigned char convert(VALUE value)
840
+ {
841
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
842
+ {
843
+ return this->arg_->defaultValue<unsigned char>();
844
+ }
845
+ else
846
+ {
847
+ return charFromRuby<unsigned char>(value);
848
+ }
849
+ }
850
+
851
+ private:
852
+ Arg* arg_ = nullptr;
853
+ };
854
+
855
+ // =========== signed char ============
856
+ template<>
857
+ class From_Ruby<signed char>
858
+ {
859
+ public:
860
+ From_Ruby() = default;
861
+
862
+ explicit From_Ruby(Arg* arg) : arg_(arg)
863
+ {
864
+ }
865
+
866
+ signed char convert(VALUE value)
867
+ {
868
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
869
+ {
870
+ return this->arg_->defaultValue<signed char>();
871
+ }
872
+ else
873
+ {
874
+ return charFromRuby<signed char>(value);
875
+ }
876
+ }
877
+
878
+ private:
879
+ Arg* arg_ = nullptr;
880
+ };
881
+
882
+ // =========== double ============
883
+ template<>
884
+ class From_Ruby<double>
885
+ {
886
+ public:
887
+ From_Ruby() = default;
888
+
889
+ explicit From_Ruby(Arg* arg) : arg_(arg)
890
+ {
891
+ }
892
+
893
+ double convert(VALUE value)
894
+ {
895
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
896
+ {
897
+ return this->arg_->defaultValue<double>();
898
+ }
899
+ else
900
+ {
901
+ return protect(rb_num2dbl, value);
902
+ }
903
+ }
904
+
905
+ private:
906
+ Arg* arg_ = nullptr;
907
+ };
908
+
909
+ template<>
910
+ class From_Ruby<double&>
911
+ {
912
+ public:
913
+ From_Ruby() = default;
914
+
915
+ explicit From_Ruby(Arg* arg) : arg_(arg)
916
+ {
917
+ }
918
+
919
+ double& convert(VALUE value)
920
+ {
921
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
922
+ {
923
+ return this->arg_->defaultValue<double>();
924
+ }
925
+ else
926
+ {
927
+ this->converted_ = protect(rb_num2dbl, value);
928
+ return this->converted_;
929
+ }
930
+ }
931
+
932
+ private:
933
+ Arg* arg_ = nullptr;
934
+ double converted_;
935
+ };
936
+
937
+ template<>
938
+ class From_Ruby<double*>
939
+ {
940
+ public:
941
+ double* convert(VALUE value)
942
+ {
943
+ if (value == Qnil)
944
+ {
945
+ return nullptr;
946
+ }
947
+ else
948
+ {
949
+ this->converted_ = protect(rb_num2dbl, value);
950
+ return &this->converted_;
951
+ }
952
+ }
953
+
954
+ private:
955
+ double converted_;
956
+ };
957
+
958
+ // =========== float ============
959
+ template<>
960
+ class From_Ruby<float>
961
+ {
962
+ public:
963
+ From_Ruby() = default;
964
+
965
+ explicit From_Ruby(Arg* arg) : arg_(arg)
966
+ {
967
+ }
968
+
969
+ float convert(VALUE value)
970
+ {
971
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
972
+ {
973
+ return this->arg_->defaultValue<float>();
974
+ }
975
+ else
976
+ {
977
+ return (float)protect(rb_num2dbl, value);
978
+ }
979
+ }
980
+
981
+ private:
982
+ Arg* arg_ = nullptr;
983
+ };
984
+
985
+ template<>
986
+ class From_Ruby<float&>
987
+ {
988
+ public:
989
+ From_Ruby() = default;
990
+
991
+ explicit From_Ruby(Arg* arg) : arg_(arg)
992
+ {
993
+ }
994
+
995
+ float& convert(VALUE value)
996
+ {
997
+ if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
998
+ {
999
+ return this->arg_->defaultValue<float>();
1000
+ }
1001
+ else
1002
+ {
1003
+ this->converted_ = (float)protect(rb_num2dbl, value);
1004
+ return this->converted_;
1005
+ }
1006
+ }
1007
+
1008
+ private:
1009
+ Arg* arg_ = nullptr;
1010
+ float converted_;
1011
+ };
1012
+
1013
+ template<>
1014
+ class From_Ruby<float*>
1015
+ {
1016
+ public:
1017
+ float* convert(VALUE value)
1018
+ {
1019
+ if (value == Qnil)
1020
+ {
1021
+ return nullptr;
1022
+ }
1023
+ else
1024
+ {
1025
+ this->converted_ = (float)protect(rb_num2dbl, value);
1026
+ return &this->converted_;
1027
+ }
1028
+ }
1029
+
1030
+ private:
1031
+ float converted_;
1032
+ };
1033
+ }
1034
+ #endif // Rice__detail__from_ruby__ipp_