rice 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) 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/lib/mkmf-rice.rb +127 -0
  9. data/lib/version.rb +3 -0
  10. data/rice/Address_Registration_Guard.ipp +75 -32
  11. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  12. data/rice/Arg.hpp +80 -4
  13. data/rice/Arg.ipp +51 -0
  14. data/rice/Constructor.hpp +12 -14
  15. data/rice/Data_Object.ipp +234 -107
  16. data/rice/Data_Object_defn.hpp +77 -117
  17. data/rice/Data_Type.hpp +1 -2
  18. data/rice/Data_Type.ipp +251 -295
  19. data/rice/Data_Type_defn.hpp +175 -243
  20. data/rice/Director.hpp +11 -6
  21. data/rice/Enum.hpp +54 -104
  22. data/rice/Enum.ipp +104 -230
  23. data/rice/Exception.hpp +2 -8
  24. data/rice/Exception.ipp +65 -0
  25. data/rice/Exception_defn.hpp +46 -47
  26. data/rice/Identifier.hpp +28 -28
  27. data/rice/Identifier.ipp +23 -27
  28. data/rice/Return.hpp +39 -0
  29. data/rice/Return.ipp +33 -0
  30. data/rice/detail/Exception_Handler.ipp +22 -62
  31. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  32. data/rice/detail/Iterator.hpp +18 -88
  33. data/rice/detail/Iterator.ipp +47 -0
  34. data/rice/detail/Jump_Tag.hpp +21 -0
  35. data/rice/detail/MethodInfo.hpp +44 -0
  36. data/rice/detail/MethodInfo.ipp +78 -0
  37. data/rice/detail/NativeAttribute.hpp +53 -0
  38. data/rice/detail/NativeAttribute.ipp +83 -0
  39. data/rice/detail/NativeFunction.hpp +69 -0
  40. data/rice/detail/NativeFunction.ipp +248 -0
  41. data/rice/detail/RubyFunction.hpp +39 -0
  42. data/rice/detail/RubyFunction.ipp +92 -0
  43. data/rice/detail/Type.hpp +29 -0
  44. data/rice/detail/Type.ipp +138 -0
  45. data/rice/detail/TypeRegistry.hpp +50 -0
  46. data/rice/detail/TypeRegistry.ipp +106 -0
  47. data/rice/detail/Wrapper.hpp +51 -0
  48. data/rice/detail/Wrapper.ipp +151 -0
  49. data/rice/detail/default_allocation_func.hpp +8 -19
  50. data/rice/detail/default_allocation_func.ipp +9 -8
  51. data/rice/detail/from_ruby.hpp +2 -37
  52. data/rice/detail/from_ruby.ipp +1020 -46
  53. data/rice/detail/from_ruby_defn.hpp +38 -0
  54. data/rice/detail/function_traits.hpp +124 -0
  55. data/rice/detail/method_data.hpp +23 -15
  56. data/rice/detail/method_data.ipp +53 -0
  57. data/rice/detail/rice_traits.hpp +116 -0
  58. data/rice/detail/ruby.hpp +9 -46
  59. data/rice/detail/to_ruby.hpp +3 -17
  60. data/rice/detail/to_ruby.ipp +409 -31
  61. data/rice/detail/to_ruby_defn.hpp +48 -0
  62. data/rice/forward_declares.ipp +82 -0
  63. data/rice/global_function.hpp +16 -20
  64. data/rice/global_function.ipp +8 -17
  65. data/rice/rice.hpp +59 -0
  66. data/rice/ruby_mark.hpp +5 -3
  67. data/rice/ruby_try_catch.hpp +4 -4
  68. data/rice/stl.hpp +11 -0
  69. data/sample/callbacks/extconf.rb +3 -0
  70. data/sample/callbacks/sample_callbacks.cpp +10 -13
  71. data/sample/enum/extconf.rb +3 -0
  72. data/sample/enum/sample_enum.cpp +3 -17
  73. data/sample/enum/test.rb +2 -2
  74. data/sample/inheritance/animals.cpp +8 -24
  75. data/sample/inheritance/extconf.rb +3 -0
  76. data/sample/inheritance/test.rb +1 -1
  77. data/sample/map/extconf.rb +3 -0
  78. data/sample/map/map.cpp +10 -18
  79. data/sample/map/test.rb +1 -1
  80. data/test/embed_ruby.cpp +18 -5
  81. data/test/ext/t1/extconf.rb +3 -0
  82. data/test/ext/t1/t1.cpp +1 -3
  83. data/test/ext/t2/extconf.rb +3 -0
  84. data/test/ext/t2/t2.cpp +1 -1
  85. data/test/extconf.rb +23 -0
  86. data/test/ruby/test_callbacks_sample.rb +28 -0
  87. data/test/ruby/test_multiple_extensions.rb +18 -0
  88. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  89. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  90. data/test/test_Address_Registration_Guard.cpp +23 -10
  91. data/test/test_Array.cpp +129 -73
  92. data/test/test_Attribute.cpp +147 -0
  93. data/test/test_Builtin_Object.cpp +34 -14
  94. data/test/test_Class.cpp +149 -275
  95. data/test/test_Constructor.cpp +10 -9
  96. data/test/test_Data_Object.cpp +133 -192
  97. data/test/test_Data_Type.cpp +322 -252
  98. data/test/test_Director.cpp +54 -41
  99. data/test/test_Enum.cpp +228 -103
  100. data/test/test_Exception.cpp +5 -6
  101. data/test/test_Hash.cpp +31 -30
  102. data/test/test_Identifier.cpp +4 -5
  103. data/test/test_Inheritance.cpp +221 -0
  104. data/test/test_Iterator.cpp +161 -0
  105. data/test/test_Jump_Tag.cpp +1 -1
  106. data/test/test_Keep_Alive.cpp +161 -0
  107. data/test/test_Memory_Management.cpp +2 -4
  108. data/test/test_Module.cpp +167 -110
  109. data/test/test_Object.cpp +41 -21
  110. data/test/test_Ownership.cpp +275 -0
  111. data/test/test_Self.cpp +205 -0
  112. data/test/test_Stl_Optional.cpp +90 -0
  113. data/test/test_Stl_Pair.cpp +144 -0
  114. data/test/test_Stl_SmartPointer.cpp +200 -0
  115. data/test/test_Stl_String.cpp +74 -0
  116. data/test/test_Stl_Vector.cpp +652 -0
  117. data/test/test_String.cpp +1 -2
  118. data/test/test_Struct.cpp +29 -39
  119. data/test/test_Symbol.cpp +1 -2
  120. data/test/test_To_From_Ruby.cpp +249 -285
  121. data/test/test_global_functions.cpp +39 -19
  122. data/test/unittest.hpp +0 -4
  123. metadata +63 -139
  124. data/Doxyfile +0 -2268
  125. data/Makefile.am +0 -26
  126. data/Makefile.in +0 -931
  127. data/README.mingw +0 -8
  128. data/aclocal.m4 +0 -1085
  129. data/ax_cxx_compile_stdcxx.m4 +0 -951
  130. data/bootstrap +0 -8
  131. data/config.guess +0 -1421
  132. data/config.sub +0 -1807
  133. data/configure +0 -7792
  134. data/configure.ac +0 -55
  135. data/depcomp +0 -791
  136. data/doxygen.ac +0 -314
  137. data/doxygen.am +0 -186
  138. data/extconf.rb +0 -70
  139. data/install-sh +0 -501
  140. data/missing +0 -215
  141. data/post-autoconf.rb +0 -22
  142. data/post-automake.rb +0 -28
  143. data/rice/Address_Registration_Guard.cpp +0 -22
  144. data/rice/Arg_impl.hpp +0 -129
  145. data/rice/Arg_operators.cpp +0 -21
  146. data/rice/Arg_operators.hpp +0 -19
  147. data/rice/Array.hpp +0 -214
  148. data/rice/Array.ipp +0 -256
  149. data/rice/Builtin_Object.hpp +0 -8
  150. data/rice/Builtin_Object.ipp +0 -50
  151. data/rice/Builtin_Object_defn.hpp +0 -50
  152. data/rice/Class.cpp +0 -57
  153. data/rice/Class.hpp +0 -8
  154. data/rice/Class.ipp +0 -6
  155. data/rice/Class_defn.hpp +0 -84
  156. data/rice/Data_Type.cpp +0 -54
  157. data/rice/Data_Type_fwd.hpp +0 -12
  158. data/rice/Director.cpp +0 -13
  159. data/rice/Exception.cpp +0 -54
  160. data/rice/Exception_Base.hpp +0 -8
  161. data/rice/Exception_Base.ipp +0 -13
  162. data/rice/Exception_Base_defn.hpp +0 -27
  163. data/rice/Hash.hpp +0 -230
  164. data/rice/Hash.ipp +0 -329
  165. data/rice/Identifier.cpp +0 -8
  166. data/rice/Jump_Tag.hpp +0 -24
  167. data/rice/Makefile.am +0 -121
  168. data/rice/Makefile.in +0 -884
  169. data/rice/Module.cpp +0 -84
  170. data/rice/Module.hpp +0 -8
  171. data/rice/Module.ipp +0 -6
  172. data/rice/Module_defn.hpp +0 -88
  173. data/rice/Module_impl.hpp +0 -281
  174. data/rice/Module_impl.ipp +0 -345
  175. data/rice/Object.cpp +0 -169
  176. data/rice/Object.hpp +0 -8
  177. data/rice/Object.ipp +0 -33
  178. data/rice/Object_defn.hpp +0 -214
  179. data/rice/Require_Guard.hpp +0 -21
  180. data/rice/String.cpp +0 -89
  181. data/rice/String.hpp +0 -91
  182. data/rice/Struct.cpp +0 -117
  183. data/rice/Struct.hpp +0 -162
  184. data/rice/Struct.ipp +0 -26
  185. data/rice/Symbol.cpp +0 -25
  186. data/rice/Symbol.hpp +0 -66
  187. data/rice/Symbol.ipp +0 -44
  188. data/rice/config.hpp +0 -47
  189. data/rice/config.hpp.in +0 -46
  190. data/rice/detail/Arguments.hpp +0 -118
  191. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  192. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  193. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  194. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  195. data/rice/detail/Caster.hpp +0 -103
  196. data/rice/detail/Not_Copyable.hpp +0 -25
  197. data/rice/detail/Wrapped_Function.hpp +0 -33
  198. data/rice/detail/cfp.hpp +0 -24
  199. data/rice/detail/cfp.ipp +0 -51
  200. data/rice/detail/check_ruby_type.cpp +0 -27
  201. data/rice/detail/check_ruby_type.hpp +0 -23
  202. data/rice/detail/creation_funcs.hpp +0 -37
  203. data/rice/detail/creation_funcs.ipp +0 -36
  204. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  205. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  206. data/rice/detail/demangle.cpp +0 -56
  207. data/rice/detail/demangle.hpp +0 -19
  208. data/rice/detail/env.hpp +0 -11
  209. data/rice/detail/method_data.cpp +0 -92
  210. data/rice/detail/node.hpp +0 -13
  211. data/rice/detail/protect.cpp +0 -29
  212. data/rice/detail/protect.hpp +0 -34
  213. data/rice/detail/ruby_version_code.hpp +0 -6
  214. data/rice/detail/ruby_version_code.hpp.in +0 -6
  215. data/rice/detail/st.hpp +0 -22
  216. data/rice/detail/win32.hpp +0 -16
  217. data/rice/detail/wrap_function.hpp +0 -66
  218. data/rice/protect.hpp +0 -38
  219. data/rice/protect.ipp +0 -1134
  220. data/rice/rubypp.rb +0 -97
  221. data/rice/to_from_ruby.hpp +0 -8
  222. data/rice/to_from_ruby.ipp +0 -418
  223. data/rice/to_from_ruby_defn.hpp +0 -70
  224. data/ruby.ac +0 -135
  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/sample/Makefile.am +0 -53
  232. data/sample/Makefile.in +0 -495
  233. data/test/Makefile.am +0 -73
  234. data/test/Makefile.in +0 -1219
  235. data/test/ext/Makefile.am +0 -41
  236. data/test/ext/Makefile.in +0 -483
  237. data/test/test_rice.rb +0 -45
@@ -0,0 +1,652 @@
1
+ #include <complex>
2
+ #include <memory>
3
+
4
+ #include "unittest.hpp"
5
+ #include "embed_ruby.hpp"
6
+ #include <rice/rice.hpp>
7
+ #include <rice/stl.hpp>
8
+
9
+ using namespace Rice;
10
+
11
+ TESTSUITE(Vector);
12
+
13
+ SETUP(Vector)
14
+ {
15
+ embed_ruby();
16
+ }
17
+
18
+ namespace
19
+ {
20
+
21
+ class MyClass
22
+ {
23
+ public:
24
+ std::vector<std::string> stringVector()
25
+ {
26
+ std::vector<std::string> result{ "One", "Two", "Three" };
27
+ return result;
28
+ }
29
+ };
30
+ }
31
+
32
+ Class makeVectorClass()
33
+ {
34
+ Class c= define_class<MyClass>("MyClass").
35
+ define_constructor(Constructor<MyClass>()).
36
+ define_method("stringVector", &MyClass::stringVector);
37
+
38
+ return c;
39
+ }
40
+
41
+ TESTCASE(StringVector)
42
+ {
43
+ Module m = define_module("Testing");
44
+
45
+ Class c = define_vector<std::vector<std::string>>("StringVector");
46
+
47
+ Object vec = m.instance_eval("$vector = StringVector.new");
48
+ Object result = vec.call("size");
49
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
50
+
51
+ m.instance_eval("$vector << 'one' << 'two' << 'two' << 'three'");
52
+ result = vec.call("size");
53
+ ASSERT_EQUAL(4, detail::From_Ruby<int32_t>().convert(result));
54
+
55
+ m.instance_eval("$vector.append('four')");
56
+ result = vec.call("size");
57
+ ASSERT_EQUAL(5, detail::From_Ruby<int32_t>().convert(result));
58
+
59
+ result = vec.call("first");
60
+ ASSERT_EQUAL("one", detail::From_Ruby<std::string>().convert(result));
61
+
62
+ result = vec.call("last");
63
+ ASSERT_EQUAL("four", detail::From_Ruby<std::string>().convert(result));
64
+ }
65
+
66
+ TESTCASE(WrongType)
67
+ {
68
+ Module m = define_module("Testing");
69
+
70
+ Class c = define_vector<std::vector<std::string>>("StringVector");
71
+
72
+ Object vec = m.instance_eval("$vector = StringVector.new");
73
+ ASSERT_EXCEPTION_CHECK(
74
+ Exception,
75
+ m.instance_eval("$vector << 1"),
76
+ ASSERT_EQUAL("wrong argument type Integer (expected String)", ex.what()));
77
+ }
78
+
79
+ TESTCASE(Empty)
80
+ {
81
+ Module m = define_module("Testing");
82
+
83
+ Class c = define_vector<std::vector<std::int32_t>>("IntVector");
84
+ Object vec = c.call("new");
85
+
86
+ Object result = vec.call("size");
87
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
88
+
89
+ result = vec.call("empty?");
90
+ ASSERT_EQUAL(Qtrue, result.value());
91
+
92
+ result = vec.call("first");
93
+ ASSERT_EQUAL(Qnil, result.value());
94
+
95
+ result = vec.call("last");
96
+ ASSERT_EQUAL(Qnil, result.value());
97
+ }
98
+
99
+ TESTCASE(Indexing)
100
+ {
101
+ Module m = define_module("Testing");
102
+
103
+ Class c = define_vector<std::vector<std::int32_t>>("IntVector");
104
+ Object vec = c.call("new");
105
+ vec.call("push", 0);
106
+ vec.call("push", 1);
107
+ vec.call("push", 2);
108
+
109
+ Object result = vec.call("size");
110
+ ASSERT_EQUAL(3, detail::From_Ruby<int32_t>().convert(result));
111
+
112
+ result = vec.call("[]", 0);
113
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
114
+
115
+ result = vec.call("[]", 1);
116
+ ASSERT_EQUAL(1, detail::From_Ruby<int32_t>().convert(result));
117
+
118
+ result = vec.call("[]", 2);
119
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
120
+
121
+ result = vec.call("[]", 3);
122
+ ASSERT_EQUAL(Qnil, result.value());
123
+
124
+ result = vec.call("[]", -1);
125
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
126
+
127
+ result = vec.call("[]", -2);
128
+ ASSERT_EQUAL(1, detail::From_Ruby<int32_t>().convert(result));
129
+
130
+ result = vec.call("[]", -3);
131
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
132
+
133
+ result = vec.call("[]", -4);
134
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
135
+
136
+ result = vec.call("[]", -7);
137
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
138
+ }
139
+
140
+ TESTCASE(Sizing)
141
+ {
142
+ Module m = define_module("Testing");
143
+
144
+ Class c = define_vector<std::vector<std::int32_t>>("IntVector");
145
+ Object vec = c.call("new");
146
+ vec.call("resize", 10);
147
+
148
+ Object result = vec.call("size");
149
+ ASSERT_EQUAL(10, detail::From_Ruby<int32_t>().convert(result));
150
+
151
+ vec.call("clear");
152
+
153
+ result = vec.call("size");
154
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
155
+ }
156
+
157
+ TESTCASE(ToString)
158
+ {
159
+ Module m = define_module("Testing");
160
+
161
+ Class c = define_vector<std::vector<std::int32_t>>("IntVector");
162
+ Object vec = c.call("new");
163
+ vec.call("resize", 3);
164
+
165
+ Object result = vec.call("to_s");
166
+ ASSERT_EQUAL("[0, 0, 0]", detail::From_Ruby<std::string>().convert(result));
167
+
168
+ vec.call("clear");
169
+
170
+ result = vec.call("to_s");
171
+ ASSERT_EQUAL("[]", detail::From_Ruby<std::string>().convert(result));
172
+ }
173
+
174
+ TESTCASE(Update)
175
+ {
176
+ Module m = define_module("Testing");
177
+
178
+ Class c = define_vector<std::vector<std::string>>("StringVector");
179
+ Object vec = c.call("new");
180
+ vec.call("push", "original 1");
181
+ vec.call("push", "original 2");
182
+
183
+ Object result = vec.call("size");
184
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
185
+
186
+ result = vec.call("[]=", 1, "new 2");
187
+ ASSERT_EQUAL("new 2", detail::From_Ruby<std::string>().convert(result));
188
+
189
+ result = vec.call("[]", 1);
190
+ ASSERT_EQUAL("new 2", detail::From_Ruby<std::string>().convert(result));
191
+
192
+ ASSERT_EXCEPTION_CHECK(
193
+ Exception,
194
+ result = vec.call("[]=", 99999, "new 2"),
195
+ ASSERT_EQUAL("Invalid index: 99999", ex.what()));
196
+ }
197
+
198
+ TESTCASE(Modify)
199
+ {
200
+ Module m = define_module("Testing");
201
+
202
+ Class c = define_vector<std::vector<int64_t>>("Int64Vector");
203
+ Object vec = c.call("new");
204
+
205
+ Object result = vec.call("push", 11);
206
+ ASSERT(result.is_equal(vec));
207
+
208
+ result = vec.call("push", 22);
209
+ ASSERT(result.is_equal(vec));
210
+
211
+ result = vec.call("size");
212
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
213
+
214
+ result = vec.call("insert", 1, 33);
215
+ ASSERT(result.is_equal(vec));
216
+
217
+ result = vec.call("to_s");
218
+ ASSERT_EQUAL("[11, 33, 22]", detail::From_Ruby<std::string>().convert(result));
219
+
220
+ result = vec.call("delete", 11);
221
+ ASSERT_EQUAL(11, detail::From_Ruby<int64_t>().convert(result));
222
+
223
+ result = vec.call("size");
224
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
225
+
226
+ result = vec.call("delete_at", 0);
227
+ ASSERT_EQUAL(33, detail::From_Ruby<int64_t>().convert(result));
228
+
229
+ result = vec.call("size");
230
+ ASSERT_EQUAL(1, detail::From_Ruby<int32_t>().convert(result));
231
+
232
+ result = vec.call("pop");
233
+ ASSERT_EQUAL(22, detail::From_Ruby<int64_t>().convert(result));
234
+
235
+ result = vec.call("size");
236
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
237
+
238
+ result = vec.call("pop");
239
+ ASSERT_EQUAL(Qnil, result.value());
240
+ }
241
+
242
+ TESTCASE(Copy)
243
+ {
244
+ Module m = define_module("Testing");
245
+
246
+ Class c = define_vector<std::vector<double>>("DoubleVector");
247
+ Object object = c.call("new");
248
+
249
+ object.call("push", 11.1);
250
+ object.call("push", 22.2);
251
+ std::vector<double>& vec = detail::From_Ruby<std::vector<double>&>().convert(object);
252
+
253
+ Object result = object.call("copy");
254
+ std::vector<double>& vecCopy = detail::From_Ruby<std::vector<double>&>().convert(result);
255
+
256
+ ASSERT_EQUAL(vec.size(), vecCopy.size());
257
+ ASSERT_EQUAL(vec[0], vecCopy[0]);
258
+ ASSERT_EQUAL(vec[1], vecCopy[1]);
259
+
260
+ vecCopy.push_back(33.3);
261
+ ASSERT_NOT_EQUAL(vec.size(), vecCopy.size());
262
+ }
263
+
264
+ TESTCASE(Iterate)
265
+ {
266
+ Module m = define_module("Testing");
267
+ Class c = define_vector<std::vector<double>>("DoubleVector");
268
+
269
+ std::string code = R"(vector = DoubleVector.new
270
+ vector << 5.0 << 6.0 << 7.0
271
+ updated = vector.map do |value|
272
+ value * 2.0
273
+ end)";
274
+
275
+ Array result = m.instance_eval(code);
276
+ ASSERT_EQUAL(3, result.size());
277
+ ASSERT_EQUAL(10.0, detail::From_Ruby<double>().convert(result[0].value()));
278
+ ASSERT_EQUAL(12.0, detail::From_Ruby<double>().convert(result[1].value()));
279
+ ASSERT_EQUAL(14.0, detail::From_Ruby<double>().convert(result[2].value()));
280
+ }
281
+
282
+ namespace
283
+ {
284
+ class NotComparable
285
+ {
286
+ public:
287
+ NotComparable(uint32_t value) : value_(value)
288
+ {
289
+ };
290
+
291
+ uint32_t value_;
292
+ };
293
+ }
294
+
295
+ TESTCASE(NotComparable)
296
+ {
297
+ define_class<NotComparable>("NotComparable").
298
+ define_constructor(Constructor<NotComparable, uint32_t>());
299
+
300
+ Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
301
+
302
+ Object vec = c.call("new");
303
+ vec.call("push", NotComparable(1));
304
+ vec.call("push", NotComparable(2));
305
+ vec.call("push", NotComparable(3));
306
+
307
+ Object result = vec.call("delete", NotComparable(1));
308
+ ASSERT_EQUAL(Qnil, result.value());
309
+
310
+ result = vec.call("length");
311
+ ASSERT_EQUAL(3, detail::From_Ruby<size_t>().convert(result));
312
+
313
+ result = vec.call("include?", NotComparable(2));
314
+ ASSERT_EQUAL(Qfalse, result.value());
315
+
316
+ result = vec.call("index", NotComparable(3));
317
+ ASSERT_EQUAL(Qnil, result.value());
318
+ }
319
+
320
+ TESTCASE(NotDefaultConstructable)
321
+ {
322
+ define_class<NotComparable>("NotComparable").
323
+ define_constructor(Constructor<NotComparable, uint32_t>());
324
+
325
+ Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
326
+ Object vec = c.call("new");
327
+
328
+ Object result = vec.call("resize", 10);
329
+ ASSERT_EQUAL(Qnil, result.value());
330
+
331
+ result = vec.call("length");
332
+ ASSERT_EQUAL(0, detail::From_Ruby<size_t>().convert(result));
333
+ }
334
+
335
+ TESTCASE(NotPrintable)
336
+ {
337
+ define_class<NotComparable>("NotComparable").
338
+ define_constructor(Constructor<NotComparable, uint32_t>());
339
+
340
+ Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
341
+
342
+ Object vec = c.call("new");
343
+ vec.call("push", NotComparable(1));
344
+ vec.call("push", NotComparable(2));
345
+ vec.call("push", NotComparable(3));
346
+
347
+ Object result = vec.call("to_s");
348
+ ASSERT_EQUAL("[Not printable]", detail::From_Ruby<std::string>().convert(result));
349
+ }
350
+
351
+ namespace
352
+ {
353
+ class Comparable
354
+ {
355
+ public:
356
+ Comparable(uint32_t value) : value_(value)
357
+ {
358
+ };
359
+
360
+ bool operator==(const Comparable& other)
361
+ {
362
+ return this->value_ == other.value_;
363
+ }
364
+
365
+ uint32_t value_;
366
+ };
367
+
368
+ inline std::ostream& operator<<(std::ostream& stream, Comparable const& comparable)
369
+ {
370
+ stream << "Comparable(" << std::to_string(comparable.value_) << ")";
371
+ return stream;
372
+ }
373
+ }
374
+
375
+ TESTCASE(Comparable)
376
+ {
377
+ define_class<Comparable>("IsComparable").
378
+ define_constructor(Constructor<Comparable, uint32_t>());
379
+
380
+ Class c = define_vector<std::vector<Comparable>>("ComparableVector");
381
+
382
+ Object vec = c.call("new");
383
+
384
+ Comparable comparable1(1);
385
+ vec.call("push", comparable1);
386
+
387
+ Comparable comparable2(2);
388
+ vec.call("push", comparable2);
389
+
390
+ Comparable comparable3(3);
391
+ vec.call("push", comparable3);
392
+
393
+ Object result = vec.call("delete", Comparable(1));
394
+ Comparable comparable = detail::From_Ruby<Comparable>().convert(result);
395
+ ASSERT_EQUAL(1, comparable.value_);
396
+
397
+ result = vec.call("length");
398
+ ASSERT_EQUAL(2, detail::From_Ruby<size_t>().convert(result));
399
+
400
+ result = vec.call("include?", Comparable(2));
401
+ ASSERT_EQUAL(Qtrue, result.value());
402
+
403
+ result = vec.call("index", Comparable(3));
404
+ ASSERT_EQUAL(1, detail::From_Ruby<size_t>().convert(result.value()));
405
+ }
406
+
407
+ TESTCASE(DefaultConstructable)
408
+ {
409
+ define_class<Comparable>("IsComparable").
410
+ define_constructor(Constructor<Comparable, uint32_t>());
411
+
412
+ Class c = define_vector<std::vector<Comparable>>("ComparableVector");
413
+ Object vec = c.call("new");
414
+
415
+ Object result = vec.call("resize", 10);
416
+ ASSERT_EQUAL(Qnil, result.value());
417
+
418
+ result = vec.call("length");
419
+ ASSERT_EQUAL(0, detail::From_Ruby<size_t>().convert(result));
420
+ }
421
+
422
+ TESTCASE(Printable)
423
+ {
424
+ define_class<Comparable>("IsComparable").
425
+ define_constructor(Constructor<Comparable, uint32_t>());
426
+
427
+ Class c = define_vector<std::vector<Comparable>>("ComparableVector");
428
+
429
+ Object vec = c.call("new");
430
+ vec.call("push", Comparable(1));
431
+ vec.call("push", Comparable(2));
432
+ vec.call("push", Comparable(3));
433
+
434
+ Object result = vec.call("to_s");
435
+ ASSERT_EQUAL("[Comparable(1), Comparable(2), Comparable(3)]", detail::From_Ruby<std::string>().convert(result));
436
+ }
437
+
438
+ namespace
439
+ {
440
+ std::vector<std::complex<uint32_t>> returnComplexVector()
441
+ {
442
+ std::complex<uint32_t> complex1(1, 1);
443
+ std::complex<uint32_t> complex2(2, 2);
444
+ std::complex<uint32_t> complex3(3, 3);
445
+
446
+ std::vector<std::complex<uint32_t>> result;
447
+ result.push_back(complex1);
448
+ result.push_back(complex2);
449
+ result.push_back(complex3);
450
+ return result;
451
+ }
452
+
453
+ std::vector<std::complex<double>> passComplexVector(std::vector<std::complex<double>>& complexes)
454
+ {
455
+ return complexes;
456
+ }
457
+ }
458
+
459
+ TESTCASE(AutoRegisterReturn)
460
+ {
461
+ define_global_function("return_complex_vector", &returnComplexVector);
462
+
463
+ Module m = define_module("Testing");
464
+ Object vec = m.instance_eval("return_complex_vector");
465
+ ASSERT_EQUAL("Rice::Std::Vector__complex__unsignedInt___allocator__complex__unsignedInt______", vec.class_name().str());
466
+
467
+ std::string code = R"(vector = return_complex_vector
468
+ complex = vector.last
469
+ complex == Complex(3, 3))";
470
+
471
+ Object result = m.instance_eval(code);
472
+ ASSERT_EQUAL(Qtrue, result.value());
473
+ }
474
+
475
+ TESTCASE(AutoRegisterParameter)
476
+ {
477
+ define_global_function("pass_complex_vector", &passComplexVector);
478
+
479
+ std::string code = R"(vector = Rice::Std::Vector__complex__double___allocator__complex__double______.new
480
+ vector << Complex(4.0, 4.0)
481
+ vector << Complex(5.0, 5.0)
482
+ pass_complex_vector(vector))";
483
+
484
+ Module m = define_module("Testing");
485
+ Object vec = m.instance_eval(code);
486
+
487
+ Object result = vec.call("size");
488
+ ASSERT_EQUAL("Rice::Std::Vector__complex__double___allocator__complex__double______", vec.class_name().str());
489
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
490
+
491
+ std::vector<std::complex<double>> complexes = detail::From_Ruby<std::vector<std::complex<double>>>().convert(vec);
492
+ ASSERT_EQUAL(complexes[0], std::complex<double>(4, 4));
493
+ ASSERT_EQUAL(complexes[1], std::complex<double>(5, 5));
494
+ }
495
+
496
+ namespace
497
+ {
498
+ std::vector<std::string> defaultVector(std::vector<std::string> strings = {"one", "two", "three"})
499
+ {
500
+ return strings;
501
+ }
502
+ }
503
+
504
+ TESTCASE(DefaultValue)
505
+ {
506
+ define_vector<std::vector<std::string>>("StringVector");
507
+ define_global_function("default_vector", &defaultVector, Arg("strings") = std::vector<std::string> { "one", "two", "three" });
508
+
509
+ Module m = define_module("Testing");
510
+ Object result = m.instance_eval("default_vector");
511
+ std::vector<std::string> actual = detail::From_Ruby<std::vector<std::string>>().convert(result);
512
+
513
+ std::vector<std::string> expected{ "one", "two", "three" };
514
+
515
+ ASSERT_EQUAL(expected.size(), actual.size());
516
+ ASSERT_EQUAL(expected[0], actual[0]);
517
+ ASSERT_EQUAL(expected[1], actual[1]);
518
+ ASSERT_EQUAL(expected[2], actual[2]);
519
+ }
520
+
521
+ namespace
522
+ {
523
+ std::vector<int> ints;
524
+ std::vector<float> floats;
525
+ std::vector<std::string> strings;
526
+
527
+ void arrayToVector(std::vector<int> aInts, std::vector<float> aFloats, std::vector<std::string> aStrings)
528
+ {
529
+ ints = aInts;
530
+ floats = aFloats;
531
+ strings = aStrings;
532
+ }
533
+
534
+ void arrayToVectorRefs(std::vector<int>& aInts, std::vector<float>& aFloats, std::vector<std::string>& aStrings)
535
+ {
536
+ ints = aInts;
537
+ floats = aFloats;
538
+ strings = aStrings;
539
+ }
540
+
541
+ void arrayToVectorPointers(std::vector<int>* aInts, std::vector<float>* aFloats, std::vector<std::string>* aStrings)
542
+ {
543
+ ints = *aInts;
544
+ floats = *aFloats;
545
+ strings = *aStrings;
546
+ }
547
+ }
548
+
549
+ TESTCASE(ArrayToVector)
550
+ {
551
+ define_global_function("array_to_vector", &arrayToVector);
552
+
553
+ Module m = define_module("Testing");
554
+
555
+ std::string code = "array_to_vector([7, 9, 1_000_000], [49.0, 78.0, 999.0], %w[one two three])";
556
+ m.instance_eval(code);
557
+
558
+ ASSERT_EQUAL(3, ints.size());
559
+ ASSERT_EQUAL(7, ints[0]);
560
+ ASSERT_EQUAL(9, ints[1]);
561
+ ASSERT_EQUAL(1'000'000, ints[2]);
562
+
563
+ ASSERT_EQUAL(3, floats.size());
564
+ ASSERT_EQUAL(49.0, floats[0]);
565
+ ASSERT_EQUAL(78.0, floats[1]);
566
+ ASSERT_EQUAL(999.0, floats[2]);
567
+
568
+ ASSERT_EQUAL(3, strings.size());
569
+ ASSERT_EQUAL("one", strings[0]);
570
+ ASSERT_EQUAL("two", strings[1]);
571
+ ASSERT_EQUAL("three", strings[2]);
572
+ }
573
+
574
+ TESTCASE(ArrayToVectorRefs)
575
+ {
576
+ define_global_function("array_to_vector_refs", &arrayToVectorRefs);
577
+
578
+ Module m = define_module("Testing");
579
+
580
+ std::string code = "array_to_vector_refs([8, 10, 1_000_001], [50.0, 79.0, 1_000.0], %w[eleven twelve thirteen])";
581
+ m.instance_eval(code);
582
+
583
+ ASSERT_EQUAL(3, ints.size());
584
+ ASSERT_EQUAL(8, ints[0]);
585
+ ASSERT_EQUAL(10, ints[1]);
586
+ ASSERT_EQUAL(1'000'001, ints[2]);
587
+
588
+ ASSERT_EQUAL(3, floats.size());
589
+ ASSERT_EQUAL(50.0, floats[0]);
590
+ ASSERT_EQUAL(79.0, floats[1]);
591
+ ASSERT_EQUAL(1'000.0, floats[2]);
592
+
593
+ ASSERT_EQUAL(3, strings.size());
594
+ ASSERT_EQUAL("eleven", strings[0]);
595
+ ASSERT_EQUAL("twelve", strings[1]);
596
+ ASSERT_EQUAL("thirteen", strings[2]);
597
+ }
598
+
599
+ TESTCASE(ArrayToVectorPointers)
600
+ {
601
+ define_global_function("array_to_vector_pointers", &arrayToVectorPointers);
602
+
603
+ Module m = define_module("Testing");
604
+
605
+ std::string code = "array_to_vector_pointers([9, 11, 1_000_002], [51.0, 80.0, 1_001.0], %w[fourteen fifteen sixteen])";
606
+ m.instance_eval(code);
607
+
608
+ ASSERT_EQUAL(3, ints.size());
609
+ ASSERT_EQUAL(9, ints[0]);
610
+ ASSERT_EQUAL(11, ints[1]);
611
+ ASSERT_EQUAL(1'000'002, ints[2]);
612
+
613
+ ASSERT_EQUAL(3, floats.size());
614
+ ASSERT_EQUAL(51.0, floats[0]);
615
+ ASSERT_EQUAL(80.0, floats[1]);
616
+ ASSERT_EQUAL(1'001.0, floats[2]);
617
+
618
+ ASSERT_EQUAL(3, strings.size());
619
+ ASSERT_EQUAL("fourteen", strings[0]);
620
+ ASSERT_EQUAL("fifteen", strings[1]);
621
+ ASSERT_EQUAL("sixteen", strings[2]);
622
+ }
623
+
624
+ TESTCASE(ArrayToVectorWrongTypes)
625
+ {
626
+ define_global_function("array_to_vector", &arrayToVector);
627
+
628
+ Module m = define_module("Testing");
629
+
630
+ std::string code = "array_to_vector([7, 9, 1_000_000], [49.0, 78.0, 999.0], [50.0, 79.0, 1000.0])";
631
+
632
+ ASSERT_EXCEPTION_CHECK(
633
+ Exception,
634
+ m.instance_eval(code),
635
+ ASSERT_EQUAL("wrong argument type Float (expected String)", ex.what())
636
+ );
637
+ }
638
+
639
+ TESTCASE(ArrayToVectorMixedTypes)
640
+ {
641
+ define_global_function("array_to_vector", &arrayToVector);
642
+
643
+ Module m = define_module("Testing");
644
+
645
+ std::string code = "array_to_vector([7, 'nine', true], [49.0, 78.0, 999.0], %w[one two three])";
646
+
647
+ ASSERT_EXCEPTION_CHECK(
648
+ Exception,
649
+ m.instance_eval(code),
650
+ ASSERT_EQUAL("no implicit conversion of String into Integer", ex.what())
651
+ );
652
+ }