rice 1.0.0

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 (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,86 @@
1
+ #ifndef Rice__ruby_try_catch__hpp_
2
+ #define Rice__ruby_try_catch__hpp_
3
+
4
+ #include "Exception_Base.hpp"
5
+ #include "Jump_Tag.hpp"
6
+ #include "detail/ruby.hpp"
7
+ #include <stdexcept>
8
+
9
+ /*! \def RUBY_TRY
10
+ * \brief Start a block to catch Ruby exceptions and rethrow them.
11
+ */
12
+ // Goto is used here to avoid having to use a second try/catch block (we
13
+ // can't rb_exc_raise directly out of the catch blocks below, since the
14
+ // exceptions will not get properly cleaned up).
15
+ // The labels are located before the try and not after it so the function can't
16
+ // "fall through" into the exception-handling code accidentally.
17
+ #define RUBY_TRY \
18
+ VALUE Rice__ruby_exc = Qnil; \
19
+ int Rice__ruby_jump_tag = 0; \
20
+ \
21
+ goto start_of_RUBY_TRY; \
22
+ \
23
+ Rice__ruby_exception: \
24
+ rb_exc_raise(Rice__ruby_exc); \
25
+ Rice__ruby_jump_tag: \
26
+ rb_jump_tag(Rice__ruby_jump_tag); \
27
+ \
28
+ start_of_RUBY_TRY: \
29
+ try
30
+
31
+ /*! \def RUBY_RETHROW(ex)
32
+ * \brief Given a Ruby exception as a VALUE, safely raise the exception as a
33
+ * Ruby exception. This should be used inside a RUBY_TRY/RUBY_CATCH
34
+ * block.
35
+ */
36
+ #define RUBY_RETHROW(ex) \
37
+ Rice__ruby_exc = ex; \
38
+ goto Rice__ruby_exception;
39
+
40
+ /*! \def RUBY_CATCH
41
+ * \brief End a RUBY_TRY block.
42
+ */
43
+ #define RUBY_CATCH \
44
+ catch(::Rice::Exception_Base const & ex) \
45
+ { \
46
+ RUBY_RETHROW(ex.value()); \
47
+ } \
48
+ catch(::Rice::Jump_Tag const & ex) \
49
+ { \
50
+ Rice__ruby_jump_tag = ex.tag; \
51
+ goto Rice__ruby_jump_tag; \
52
+ } \
53
+ catch(std::bad_alloc const & ex) \
54
+ { \
55
+ /* This won't work quite right if the rb_exc_new2 fails; not */ \
56
+ /* much we can do about that, since Ruby doesn't give us access */ \
57
+ /* to a pre-allocated NoMemoryError object */ \
58
+ RUBY_RETHROW(rb_exc_new2(rb_eNoMemError, ex.what())); \
59
+ } \
60
+ catch(std::invalid_argument const & ex) \
61
+ { \
62
+ /* This can raise a NoMemoryError in VERY rare circumstances */ \
63
+ RUBY_RETHROW(rb_exc_new2(rb_eArgError, ex.what())); \
64
+ } \
65
+ catch(std::domain_error const & ex) \
66
+ { \
67
+ /* This can raise a NoMemoryError in VERY rare circumstances */ \
68
+ RUBY_RETHROW(rb_exc_new2(rb_eFloatDomainError, ex.what())); \
69
+ } \
70
+ catch(std::out_of_range const & ex) \
71
+ { \
72
+ /* This can raise a NoMemoryError in VERY rare circumstances */ \
73
+ RUBY_RETHROW(rb_exc_new2(rb_eRangeError, ex.what())); \
74
+ } \
75
+ catch(std::exception const & ex) \
76
+ { \
77
+ /* This can raise a NoMemoryError in VERY rare circumstances */ \
78
+ RUBY_RETHROW(rb_exc_new2(rb_eRuntimeError, ex.what())); \
79
+ } \
80
+ catch(...) \
81
+ { \
82
+ RUBY_RETHROW(rb_exc_new2(rb_eRuntimeError, "unknown C++ exception thrown")); \
83
+ } \
84
+
85
+ #endif // Rice__ruby_try_catch__hpp_
86
+
@@ -0,0 +1,8 @@
1
+ #ifndef Rice__to_from_ruby__hpp_
2
+ #define Rice__to_from_ruby__hpp_
3
+
4
+ #include "to_from_ruby_defn.hpp"
5
+ #include "to_from_ruby.ipp"
6
+
7
+ #endif // Rice__to_from_ruby__hpp_
8
+
@@ -0,0 +1,299 @@
1
+ #include "protect.hpp"
2
+ #include "Object.hpp"
3
+ #include "detail/from_ruby.ipp"
4
+ #include "detail/to_ruby.ipp"
5
+
6
+ // ---------------------------------------------------------------------
7
+ template<>
8
+ inline
9
+ Rice::Object from_ruby<Rice::Object>(Rice::Object x)
10
+ {
11
+ return x;
12
+ }
13
+
14
+ template<>
15
+ inline
16
+ Rice::Object to_ruby<Rice::Object>(Rice::Object const & x)
17
+ {
18
+ return x;
19
+ }
20
+
21
+ // ---------------------------------------------------------------------
22
+ namespace Rice
23
+ {
24
+ namespace detail
25
+ {
26
+ inline int num2int(VALUE x)
27
+ {
28
+ return NUM2INT(x);
29
+ }
30
+
31
+ inline VALUE int2num(int x)
32
+ {
33
+ return INT2NUM(x);
34
+ }
35
+ }
36
+ }
37
+
38
+ template<>
39
+ inline
40
+ int from_ruby<int>(Rice::Object x)
41
+ {
42
+ return Rice::protect(Rice::detail::num2int, x);
43
+ }
44
+
45
+ template<>
46
+ inline
47
+ Rice::Object to_ruby<int>(int const & x)
48
+ {
49
+ return Rice::protect(Rice::detail::int2num, x);
50
+ }
51
+
52
+ // ---------------------------------------------------------------------
53
+ namespace Rice
54
+ {
55
+ namespace detail
56
+ {
57
+ inline long num2long(VALUE x)
58
+ {
59
+ return NUM2LONG(x);
60
+ }
61
+
62
+ inline VALUE long2num(long x)
63
+ {
64
+ return LONG2NUM(x);
65
+ }
66
+ }
67
+ }
68
+
69
+ template<>
70
+ inline
71
+ long from_ruby<long>(Rice::Object x)
72
+ {
73
+ return Rice::protect(Rice::detail::num2long, x);
74
+ }
75
+
76
+ template<>
77
+ inline
78
+ Rice::Object to_ruby<long>(long const & x)
79
+ {
80
+ return Rice::protect(Rice::detail::long2num, x);
81
+ }
82
+
83
+ // ---------------------------------------------------------------------
84
+ namespace Rice
85
+ {
86
+ namespace detail
87
+ {
88
+ inline unsigned int num2uint(VALUE x)
89
+ {
90
+ return NUM2UINT(x);
91
+ }
92
+
93
+ inline VALUE uint2num(unsigned int x)
94
+ {
95
+ return UINT2NUM(x);
96
+ }
97
+ }
98
+ }
99
+
100
+ template<>
101
+ inline
102
+ unsigned int from_ruby<unsigned int>(Rice::Object x)
103
+ {
104
+ return Rice::protect(Rice::detail::num2uint, x);
105
+ }
106
+
107
+ template<>
108
+ inline
109
+ Rice::Object to_ruby<unsigned int>(unsigned int const & x)
110
+ {
111
+ return Rice::protect(Rice::detail::uint2num, x);
112
+ }
113
+
114
+ // ---------------------------------------------------------------------
115
+ namespace Rice
116
+ {
117
+ namespace detail
118
+ {
119
+ inline unsigned long num2ulong(VALUE x)
120
+ {
121
+ return NUM2ULONG(x);
122
+ }
123
+
124
+ inline VALUE ulong2num(unsigned long x)
125
+ {
126
+ return ULONG2NUM(x);
127
+ }
128
+ }
129
+ }
130
+
131
+ template<>
132
+ inline
133
+ unsigned long from_ruby<unsigned long>(Rice::Object x)
134
+ {
135
+ return Rice::protect(Rice::detail::num2ulong, x);
136
+ }
137
+
138
+ template<>
139
+ inline
140
+ Rice::Object to_ruby<unsigned long>(unsigned long const & x)
141
+ {
142
+ return Rice::protect(Rice::detail::ulong2num, x);
143
+ }
144
+
145
+ // ---------------------------------------------------------------------
146
+ template<>
147
+ inline
148
+ bool from_ruby<bool>(Rice::Object x)
149
+ {
150
+ return RTEST(x);
151
+ }
152
+
153
+ template<>
154
+ inline
155
+ Rice::Object to_ruby<bool>(bool const & x)
156
+ {
157
+ return x ? Qtrue : Qfalse;
158
+ }
159
+
160
+ // ---------------------------------------------------------------------
161
+ template<>
162
+ inline
163
+ char from_ruby<char>(Rice::Object x)
164
+ {
165
+ if(x.rb_type() == T_STRING)
166
+ {
167
+ if(RSTRING(x.value())->len == 0)
168
+ {
169
+ return RSTRING(x.value())->ptr[0];
170
+ }
171
+ else
172
+ {
173
+ throw std::invalid_argument("from_ruby<char>: string must have length 1");
174
+ }
175
+ }
176
+ else
177
+ {
178
+ return from_ruby<int>(x) & 0xff;
179
+ }
180
+ }
181
+
182
+ template<>
183
+ inline
184
+ Rice::Object to_ruby<char>(char const & x)
185
+ {
186
+ return to_ruby<int>(x);
187
+ }
188
+
189
+ // ---------------------------------------------------------------------
190
+
191
+ template<>
192
+ inline
193
+ unsigned char from_ruby<unsigned char>(Rice::Object x)
194
+ {
195
+ // TODO: I'm not sure if this is the right behavior yet
196
+ return from_ruby<char>(x);
197
+ }
198
+
199
+ template<>
200
+ inline
201
+ Rice::Object to_ruby<unsigned char>(unsigned char const & x)
202
+ {
203
+ return to_ruby<unsigned int>(x);
204
+ }
205
+
206
+ // ---------------------------------------------------------------------
207
+
208
+ namespace Rice
209
+ {
210
+ namespace detail
211
+ {
212
+ inline VALUE num2dbl(VALUE x, double * d)
213
+ {
214
+ *d = NUM2DBL(x);
215
+ return Qnil;
216
+ }
217
+
218
+ inline VALUE dbl2num(double x)
219
+ {
220
+ return rb_float_new(x);
221
+ }
222
+ }
223
+ }
224
+
225
+ template<>
226
+ inline
227
+ float from_ruby<float>(Rice::Object x)
228
+ {
229
+ double d;
230
+ Rice::protect(Rice::detail::num2dbl, x, &d);
231
+ return float(d);
232
+ }
233
+
234
+ template<>
235
+ inline
236
+ Rice::Object to_ruby<float>(float const & x)
237
+ {
238
+ return Rice::protect(Rice::detail::dbl2num, x);
239
+ }
240
+
241
+ // ---------------------------------------------------------------------
242
+
243
+ template<>
244
+ inline
245
+ double from_ruby<double>(Rice::Object x)
246
+ {
247
+ double d;
248
+ Rice::protect(Rice::detail::num2dbl, x, &d);
249
+ return d;
250
+ }
251
+
252
+ template<>
253
+ inline
254
+ Rice::Object to_ruby<double>(double const & x)
255
+ {
256
+ return Rice::protect(Rice::detail::dbl2num, x);
257
+ }
258
+
259
+ // ---------------------------------------------------------------------
260
+ namespace Rice
261
+ {
262
+ namespace detail
263
+ {
264
+ inline VALUE str2ccstr(VALUE x)
265
+ {
266
+ return (VALUE)(STR2CSTR(x));
267
+ }
268
+ }
269
+ }
270
+
271
+ template<>
272
+ inline
273
+ char const * from_ruby<char const *>(Rice::Object x)
274
+ {
275
+ return (char const *)Rice::protect(Rice::detail::str2ccstr, x);
276
+ }
277
+
278
+ template<>
279
+ inline
280
+ Rice::Object to_ruby<char const *>(char const * const & x)
281
+ {
282
+ return Rice::protect(rb_str_new2, x);
283
+ }
284
+
285
+ // ---------------------------------------------------------------------
286
+ template<>
287
+ inline
288
+ std::string from_ruby<std::string>(Rice::Object x)
289
+ {
290
+ return std::string(from_ruby<char const *>(x));
291
+ }
292
+
293
+ template<>
294
+ inline
295
+ Rice::Object to_ruby<std::string>(std::string const & x)
296
+ {
297
+ return to_ruby(x.c_str());
298
+ }
299
+
@@ -0,0 +1,71 @@
1
+ #ifndef Rice__to_from_ruby_defn__hpp_
2
+ #define Rice__to_from_ruby_defn__hpp_
3
+
4
+ #include "Object_defn.hpp"
5
+ #include "detail/from_ruby.hpp"
6
+ #include "detail/to_ruby.hpp"
7
+
8
+ #include <typeinfo>
9
+ #include <string>
10
+ #include <stdexcept>
11
+
12
+ // ---------------------------------------------------------------------
13
+
14
+ //! Convert a Ruby object to C++.
15
+ /*! If the Ruby object can be converted to an immediate value, returns a
16
+ * copy of the Ruby object. If the Ruby object is holding a C++
17
+ * object and the type specified is a pointer to that type, returns a
18
+ * pointer to that object.
19
+ *
20
+ * Conversions from ruby to a pointer type are automatically generated
21
+ * when a type is bound using Data_Type. If no conversion exists, and
22
+ * exception is thrown.
23
+ *
24
+ * \param T the C++ type to which to convert.
25
+ * \param x the Ruby object to convert.
26
+ * \return a C++ representation of the Ruby object.
27
+ *
28
+ * Example:
29
+ * \code
30
+ * Object x = INT2NUM(42);
31
+ * std::cout << from_ruby<int>(x);
32
+ *
33
+ * Data_Object<Foo> foo(new Foo);
34
+ * Object obj(foo);
35
+ * std::cout << *from_ruby<Foo *>(obj) << std::endl;
36
+ * \endcode
37
+ */
38
+ template<typename T>
39
+ inline
40
+ typename Rice::detail::from_ruby_<T>::Retval_T from_ruby(Rice::Object x)
41
+ {
42
+ return Rice::detail::from_ruby_<T>::convert(x);
43
+ }
44
+
45
+ //! Convert a C++ object to Ruby.
46
+ /*! If x is a pointer, wraps the pointee as a Ruby object. If x is an
47
+ * Object, returns x.
48
+ *
49
+ * If no conversion exists, a compile-time error is generated.
50
+ *
51
+ * \param x the object to convert.
52
+ * \return a Ruby representation of the C++ object.
53
+ *
54
+ * Example:
55
+ * \code
56
+ * rb_p(to_ruby(42));
57
+ *
58
+ * Data_Object<Foo> foo(new Foo);
59
+ * Foo * p_foo = foo.get();
60
+ * rb_p(to_ruby(p_foo));
61
+ * \endcode
62
+ */
63
+ template<typename T>
64
+ inline
65
+ Rice::Object to_ruby(T const & x)
66
+ {
67
+ return Rice::detail::to_ruby_<T>::convert(x);
68
+ }
69
+
70
+ #endif // Rice__to_from_ruby_defn__hpp_
71
+