rice 2.1.2 → 4.0.1

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 (245) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +45 -1028
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -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 +30 -376
  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 +14 -9
  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 -49
  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 +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -276
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +120 -136
  128. data/Doxyfile +0 -2268
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README.mingw +0 -8
  132. data/aclocal.m4 +0 -1088
  133. data/bootstrap +0 -8
  134. data/check_stdcxx_11.ac +0 -142
  135. data/config.guess +0 -1421
  136. data/config.sub +0 -1807
  137. data/configure +0 -7481
  138. data/configure.ac +0 -55
  139. data/depcomp +0 -791
  140. data/doxygen.ac +0 -314
  141. data/doxygen.am +0 -186
  142. data/extconf.rb +0 -69
  143. data/install-sh +0 -501
  144. data/missing +0 -215
  145. data/post-autoconf.rb +0 -22
  146. data/post-automake.rb +0 -28
  147. data/rice/Address_Registration_Guard.cpp +0 -22
  148. data/rice/Arg_impl.hpp +0 -129
  149. data/rice/Arg_operators.cpp +0 -21
  150. data/rice/Arg_operators.hpp +0 -19
  151. data/rice/Array.hpp +0 -214
  152. data/rice/Array.ipp +0 -256
  153. data/rice/Builtin_Object.hpp +0 -8
  154. data/rice/Builtin_Object.ipp +0 -50
  155. data/rice/Builtin_Object_defn.hpp +0 -50
  156. data/rice/Class.cpp +0 -57
  157. data/rice/Class.hpp +0 -8
  158. data/rice/Class.ipp +0 -6
  159. data/rice/Class_defn.hpp +0 -83
  160. data/rice/Data_Type.cpp +0 -54
  161. data/rice/Data_Type_fwd.hpp +0 -12
  162. data/rice/Director.cpp +0 -13
  163. data/rice/Exception.cpp +0 -59
  164. data/rice/Exception_Base.hpp +0 -8
  165. data/rice/Exception_Base.ipp +0 -13
  166. data/rice/Exception_Base_defn.hpp +0 -27
  167. data/rice/Hash.hpp +0 -227
  168. data/rice/Hash.ipp +0 -329
  169. data/rice/Identifier.cpp +0 -8
  170. data/rice/Jump_Tag.hpp +0 -24
  171. data/rice/Makefile.am +0 -124
  172. data/rice/Makefile.in +0 -839
  173. data/rice/Module.cpp +0 -84
  174. data/rice/Module.hpp +0 -8
  175. data/rice/Module.ipp +0 -6
  176. data/rice/Module_defn.hpp +0 -88
  177. data/rice/Module_impl.hpp +0 -281
  178. data/rice/Module_impl.ipp +0 -345
  179. data/rice/Object.cpp +0 -169
  180. data/rice/Object.hpp +0 -8
  181. data/rice/Object.ipp +0 -19
  182. data/rice/Object_defn.hpp +0 -191
  183. data/rice/Require_Guard.hpp +0 -21
  184. data/rice/String.cpp +0 -94
  185. data/rice/String.hpp +0 -91
  186. data/rice/Struct.cpp +0 -117
  187. data/rice/Struct.hpp +0 -162
  188. data/rice/Struct.ipp +0 -26
  189. data/rice/Symbol.cpp +0 -25
  190. data/rice/Symbol.hpp +0 -66
  191. data/rice/Symbol.ipp +0 -44
  192. data/rice/config.hpp +0 -47
  193. data/rice/config.hpp.in +0 -46
  194. data/rice/detail/Arguments.hpp +0 -118
  195. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  196. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  197. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  198. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  199. data/rice/detail/Caster.hpp +0 -103
  200. data/rice/detail/Not_Copyable.hpp +0 -25
  201. data/rice/detail/Wrapped_Function.hpp +0 -33
  202. data/rice/detail/cfp.hpp +0 -24
  203. data/rice/detail/cfp.ipp +0 -51
  204. data/rice/detail/check_ruby_type.cpp +0 -27
  205. data/rice/detail/check_ruby_type.hpp +0 -23
  206. data/rice/detail/creation_funcs.hpp +0 -37
  207. data/rice/detail/creation_funcs.ipp +0 -36
  208. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  209. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  210. data/rice/detail/demangle.cpp +0 -56
  211. data/rice/detail/demangle.hpp +0 -19
  212. data/rice/detail/env.hpp +0 -11
  213. data/rice/detail/method_data.cpp +0 -86
  214. data/rice/detail/node.hpp +0 -13
  215. data/rice/detail/object_call.hpp +0 -69
  216. data/rice/detail/object_call.ipp +0 -131
  217. data/rice/detail/protect.cpp +0 -29
  218. data/rice/detail/protect.hpp +0 -34
  219. data/rice/detail/ruby_version_code.hpp +0 -6
  220. data/rice/detail/ruby_version_code.hpp.in +0 -6
  221. data/rice/detail/st.hpp +0 -22
  222. data/rice/detail/traits.hpp +0 -43
  223. data/rice/detail/win32.hpp +0 -16
  224. data/rice/detail/wrap_function.hpp +0 -341
  225. data/rice/detail/wrap_function.ipp +0 -514
  226. data/rice/protect.hpp +0 -92
  227. data/rice/protect.ipp +0 -1134
  228. data/rice/rubypp.rb +0 -97
  229. data/rice/to_from_ruby.hpp +0 -8
  230. data/rice/to_from_ruby.ipp +0 -294
  231. data/rice/to_from_ruby_defn.hpp +0 -70
  232. data/ruby.ac +0 -135
  233. data/ruby/Makefile.am +0 -1
  234. data/ruby/Makefile.in +0 -625
  235. data/ruby/lib/Makefile.am +0 -3
  236. data/ruby/lib/Makefile.in +0 -503
  237. data/ruby/lib/mkmf-rice.rb.in +0 -217
  238. data/ruby/lib/version.rb +0 -3
  239. data/sample/Makefile.am +0 -47
  240. data/sample/Makefile.in +0 -486
  241. data/test/Makefile.am +0 -72
  242. data/test/Makefile.in +0 -1150
  243. data/test/ext/Makefile.am +0 -41
  244. data/test/ext/Makefile.in +0 -480
  245. data/test/test_rice.rb +0 -41
@@ -1,22 +1,8 @@
1
1
  #ifndef Rice__detail__to_ruby__hpp_
2
2
  #define Rice__detail__to_ruby__hpp_
3
3
 
4
- namespace Rice
5
- {
6
- namespace detail
7
- {
8
- template<typename T>
9
- struct to_ruby_
10
- {
11
- static Rice::Object convert(T const & x);
12
- };
13
-
14
- template<typename T>
15
- struct to_ruby_<T *>
16
- {
17
- static Rice::Object convert(T * x);
18
- };
19
- } // detail
20
- } // Rice
4
+ #include "to_ruby_defn.hpp"
5
+ #include "to_ruby.ipp"
21
6
 
22
7
  #endif // Rice__detail__to_ruby__hpp_
8
+
@@ -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
+ }