rice 4.3.3 → 4.6.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 (237) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -26
  3. data/CMakeLists.txt +31 -0
  4. data/CMakePresets.json +75 -0
  5. data/COPYING +3 -2
  6. data/FindRuby.cmake +437 -0
  7. data/README.md +7 -2
  8. data/Rakefile +12 -5
  9. data/include/rice/rice.hpp +9522 -4426
  10. data/include/rice/stl.hpp +2831 -1198
  11. data/lib/make_rice_headers.rb +79 -0
  12. data/lib/mkmf-rice.rb +40 -94
  13. data/lib/rice/version.rb +3 -0
  14. data/lib/rice.rb +1 -0
  15. data/lib/rubygems/builder.rb +11 -0
  16. data/lib/rubygems/cmake_builder.rb +113 -0
  17. data/lib/rubygems_plugin.rb +9 -0
  18. data/rice/Address_Registration_Guard.hpp +72 -3
  19. data/rice/Arg.hpp +26 -6
  20. data/rice/Arg.ipp +35 -2
  21. data/rice/Buffer.hpp +123 -0
  22. data/rice/Buffer.ipp +599 -0
  23. data/rice/Callback.hpp +21 -0
  24. data/rice/Callback.ipp +13 -0
  25. data/rice/Constructor.hpp +4 -27
  26. data/rice/Constructor.ipp +79 -0
  27. data/rice/Data_Object.hpp +73 -3
  28. data/rice/Data_Object.ipp +388 -96
  29. data/rice/Data_Type.hpp +214 -3
  30. data/rice/Data_Type.ipp +144 -67
  31. data/rice/Director.hpp +0 -2
  32. data/rice/Enum.hpp +4 -7
  33. data/rice/Enum.ipp +102 -55
  34. data/rice/Exception.hpp +62 -2
  35. data/rice/Exception.ipp +7 -12
  36. data/rice/Init.hpp +8 -0
  37. data/rice/Init.ipp +8 -0
  38. data/rice/JumpException.hpp +44 -0
  39. data/rice/JumpException.ipp +48 -0
  40. data/rice/MemoryView.hpp +11 -0
  41. data/rice/MemoryView.ipp +3 -0
  42. data/rice/Return.hpp +7 -27
  43. data/rice/Return.ipp +13 -13
  44. data/rice/cpp_api/Array.hpp +209 -0
  45. data/rice/cpp_api/Array.ipp +304 -0
  46. data/rice/cpp_api/Builtin_Object.hpp +31 -0
  47. data/rice/cpp_api/Builtin_Object.ipp +37 -0
  48. data/rice/cpp_api/Class.hpp +70 -0
  49. data/rice/cpp_api/Class.ipp +97 -0
  50. data/rice/cpp_api/Encoding.hpp +32 -0
  51. data/rice/cpp_api/Encoding.ipp +59 -0
  52. data/rice/cpp_api/Hash.hpp +194 -0
  53. data/rice/cpp_api/Hash.ipp +257 -0
  54. data/rice/{Identifier.hpp → cpp_api/Identifier.hpp} +2 -6
  55. data/rice/{Identifier.ipp → cpp_api/Identifier.ipp} +4 -2
  56. data/rice/cpp_api/Module.hpp +72 -0
  57. data/rice/cpp_api/Module.ipp +101 -0
  58. data/rice/cpp_api/Object.hpp +272 -0
  59. data/rice/cpp_api/Object.ipp +235 -0
  60. data/rice/cpp_api/String.hpp +74 -0
  61. data/rice/cpp_api/String.ipp +120 -0
  62. data/rice/cpp_api/Struct.hpp +113 -0
  63. data/rice/cpp_api/Struct.ipp +92 -0
  64. data/rice/cpp_api/Symbol.hpp +46 -0
  65. data/rice/cpp_api/Symbol.ipp +93 -0
  66. data/rice/cpp_api/shared_methods.hpp +134 -0
  67. data/rice/detail/DefaultHandler.hpp +12 -0
  68. data/rice/detail/DefaultHandler.ipp +8 -0
  69. data/rice/detail/HandlerRegistry.hpp +5 -35
  70. data/rice/detail/HandlerRegistry.ipp +7 -11
  71. data/rice/detail/InstanceRegistry.hpp +1 -4
  72. data/rice/detail/MethodInfo.hpp +12 -10
  73. data/rice/detail/MethodInfo.ipp +26 -21
  74. data/rice/detail/Native.hpp +33 -0
  75. data/rice/detail/Native.ipp +157 -0
  76. data/rice/detail/NativeAttributeGet.hpp +52 -0
  77. data/rice/detail/NativeAttributeGet.ipp +57 -0
  78. data/rice/detail/NativeAttributeSet.hpp +44 -0
  79. data/rice/detail/NativeAttributeSet.ipp +88 -0
  80. data/rice/detail/NativeCallbackFFI.hpp +55 -0
  81. data/rice/detail/NativeCallbackFFI.ipp +151 -0
  82. data/rice/detail/NativeCallbackSimple.hpp +30 -0
  83. data/rice/detail/NativeCallbackSimple.ipp +29 -0
  84. data/rice/detail/NativeFunction.hpp +33 -23
  85. data/rice/detail/NativeFunction.ipp +309 -70
  86. data/rice/detail/NativeIterator.hpp +9 -11
  87. data/rice/detail/NativeIterator.ipp +33 -31
  88. data/rice/detail/NativeRegistry.hpp +24 -15
  89. data/rice/detail/NativeRegistry.ipp +23 -48
  90. data/rice/detail/Proc.hpp +4 -0
  91. data/rice/detail/Proc.ipp +85 -0
  92. data/rice/detail/Registries.hpp +0 -7
  93. data/rice/detail/Registries.ipp +0 -18
  94. data/rice/detail/RubyFunction.hpp +0 -3
  95. data/rice/detail/RubyFunction.ipp +4 -8
  96. data/rice/detail/RubyType.hpp +16 -0
  97. data/rice/detail/RubyType.ipp +232 -0
  98. data/rice/detail/Type.hpp +7 -6
  99. data/rice/detail/Type.ipp +192 -45
  100. data/rice/detail/TypeRegistry.hpp +15 -7
  101. data/rice/detail/TypeRegistry.ipp +105 -12
  102. data/rice/detail/Wrapper.hpp +68 -32
  103. data/rice/detail/Wrapper.ipp +121 -109
  104. data/rice/detail/cpp_protect.hpp +5 -6
  105. data/rice/detail/default_allocation_func.ipp +0 -2
  106. data/rice/detail/from_ruby.hpp +38 -3
  107. data/rice/detail/from_ruby.ipp +1321 -492
  108. data/rice/detail/ruby.hpp +18 -0
  109. data/rice/detail/to_ruby.hpp +41 -3
  110. data/rice/detail/to_ruby.ipp +1424 -194
  111. data/rice/global_function.hpp +0 -4
  112. data/rice/global_function.ipp +0 -1
  113. data/rice/libc/file.hpp +11 -0
  114. data/rice/libc/file.ipp +32 -0
  115. data/rice/rice.hpp +116 -26
  116. data/rice/ruby_mark.hpp +4 -3
  117. data/rice/stl/complex.hpp +6 -0
  118. data/rice/stl/complex.ipp +93 -0
  119. data/rice/stl/exception.hpp +11 -0
  120. data/rice/stl/exception.ipp +29 -0
  121. data/rice/stl/exception_ptr.hpp +6 -0
  122. data/rice/stl/exception_ptr.ipp +27 -0
  123. data/rice/stl/map.hpp +12 -0
  124. data/rice/stl/map.ipp +469 -0
  125. data/rice/stl/monostate.hpp +6 -0
  126. data/rice/stl/monostate.ipp +80 -0
  127. data/rice/stl/multimap.hpp +14 -0
  128. data/rice/stl/multimap.ipp +448 -0
  129. data/rice/stl/optional.hpp +6 -0
  130. data/rice/stl/optional.ipp +118 -0
  131. data/rice/stl/pair.hpp +13 -0
  132. data/rice/stl/pair.ipp +155 -0
  133. data/rice/stl/reference_wrapper.hpp +6 -0
  134. data/rice/stl/reference_wrapper.ipp +41 -0
  135. data/rice/stl/set.hpp +12 -0
  136. data/rice/stl/set.ipp +495 -0
  137. data/rice/stl/shared_ptr.hpp +28 -0
  138. data/rice/stl/shared_ptr.ipp +224 -0
  139. data/rice/stl/string.hpp +6 -0
  140. data/rice/stl/string.ipp +158 -0
  141. data/rice/stl/string_view.hpp +6 -0
  142. data/rice/stl/string_view.ipp +65 -0
  143. data/rice/stl/tuple.hpp +6 -0
  144. data/rice/stl/tuple.ipp +128 -0
  145. data/rice/stl/type_index.hpp +6 -0
  146. data/rice/stl/type_index.ipp +30 -0
  147. data/rice/stl/type_info.hpp +6 -0
  148. data/rice/stl/type_info.ipp +29 -0
  149. data/rice/stl/unique_ptr.hpp +22 -0
  150. data/rice/stl/unique_ptr.ipp +139 -0
  151. data/rice/stl/unordered_map.hpp +12 -0
  152. data/rice/stl/unordered_map.ipp +469 -0
  153. data/rice/stl/variant.hpp +6 -0
  154. data/rice/stl/variant.ipp +242 -0
  155. data/rice/stl/vector.hpp +12 -0
  156. data/rice/stl/vector.ipp +590 -0
  157. data/rice/stl.hpp +11 -3
  158. data/rice/traits/attribute_traits.hpp +26 -0
  159. data/rice/traits/function_traits.hpp +95 -0
  160. data/rice/traits/method_traits.hpp +47 -0
  161. data/rice/traits/rice_traits.hpp +160 -0
  162. data/rice.gemspec +85 -0
  163. data/test/embed_ruby.cpp +7 -1
  164. data/test/extconf.rb +2 -0
  165. data/test/test_Address_Registration_Guard.cpp +5 -0
  166. data/test/test_Array.cpp +18 -4
  167. data/test/test_Attribute.cpp +136 -21
  168. data/test/test_Buffer.cpp +285 -0
  169. data/test/test_Builtin_Object.cpp +5 -0
  170. data/test/test_Callback.cpp +230 -0
  171. data/test/test_Class.cpp +5 -31
  172. data/test/test_Constructor.cpp +69 -6
  173. data/test/test_Data_Object.cpp +97 -38
  174. data/test/test_Data_Type.cpp +470 -65
  175. data/test/test_Director.cpp +17 -8
  176. data/test/test_Enum.cpp +155 -40
  177. data/test/test_Exception.cpp +235 -0
  178. data/test/test_File.cpp +70 -0
  179. data/test/test_From_Ruby.cpp +609 -0
  180. data/test/test_Hash.cpp +5 -0
  181. data/test/test_Identifier.cpp +5 -0
  182. data/test/test_Inheritance.cpp +6 -1
  183. data/test/test_Iterator.cpp +6 -1
  184. data/test/test_Jump_Exception.cpp +23 -0
  185. data/test/test_Keep_Alive.cpp +13 -19
  186. data/test/test_Keep_Alive_No_Wrapper.cpp +5 -1
  187. data/test/test_Memory_Management.cpp +5 -0
  188. data/test/test_Module.cpp +128 -67
  189. data/test/test_Native_Registry.cpp +2 -34
  190. data/test/test_Object.cpp +5 -0
  191. data/test/test_Overloads.cpp +806 -0
  192. data/test/test_Ownership.cpp +160 -54
  193. data/test/test_Proc.cpp +44 -0
  194. data/test/test_Self.cpp +9 -4
  195. data/test/test_Stl_Exception.cpp +109 -0
  196. data/test/test_Stl_Map.cpp +54 -42
  197. data/test/test_Stl_Multimap.cpp +693 -0
  198. data/test/test_Stl_Optional.cpp +5 -0
  199. data/test/test_Stl_Pair.cpp +14 -9
  200. data/test/test_Stl_Reference_Wrapper.cpp +9 -2
  201. data/test/test_Stl_Set.cpp +790 -0
  202. data/test/test_Stl_SharedPtr.cpp +458 -0
  203. data/test/test_Stl_String.cpp +5 -0
  204. data/test/test_Stl_String_View.cpp +5 -0
  205. data/test/test_Stl_Tuple.cpp +116 -0
  206. data/test/test_Stl_Type.cpp +147 -0
  207. data/test/test_Stl_UniquePtr.cpp +202 -0
  208. data/test/test_Stl_Unordered_Map.cpp +43 -38
  209. data/test/test_Stl_Variant.cpp +217 -84
  210. data/test/test_Stl_Vector.cpp +306 -58
  211. data/test/test_String.cpp +5 -0
  212. data/test/test_Struct.cpp +5 -0
  213. data/test/test_Symbol.cpp +5 -0
  214. data/test/test_Template.cpp +192 -0
  215. data/test/test_To_Ruby.cpp +524 -0
  216. data/test/test_Tracking.cpp +1 -0
  217. data/test/test_Type.cpp +171 -0
  218. data/test/test_global_functions.cpp +67 -7
  219. data/test/unittest.cpp +8 -0
  220. metadata +127 -26
  221. data/lib/version.rb +0 -3
  222. data/rice/Address_Registration_Guard_defn.hpp +0 -79
  223. data/rice/Data_Object_defn.hpp +0 -84
  224. data/rice/Data_Type_defn.hpp +0 -190
  225. data/rice/Exception_defn.hpp +0 -68
  226. data/rice/HandlerRegistration.hpp +0 -15
  227. data/rice/detail/ExceptionHandler.hpp +0 -8
  228. data/rice/detail/ExceptionHandler.ipp +0 -28
  229. data/rice/detail/ExceptionHandler_defn.hpp +0 -77
  230. data/rice/detail/Jump_Tag.hpp +0 -21
  231. data/rice/detail/NativeAttribute.hpp +0 -64
  232. data/rice/detail/NativeAttribute.ipp +0 -112
  233. data/rice/detail/from_ruby_defn.hpp +0 -38
  234. data/rice/detail/to_ruby_defn.hpp +0 -48
  235. data/test/test_Jump_Tag.cpp +0 -17
  236. data/test/test_Stl_SmartPointer.cpp +0 -283
  237. data/test/test_To_From_Ruby.cpp +0 -399
@@ -14,9 +14,13 @@ SETUP(Vector)
14
14
  embed_ruby();
15
15
  }
16
16
 
17
- namespace
17
+ TEARDOWN(Vector)
18
18
  {
19
+ rb_gc_start();
20
+ }
19
21
 
22
+ namespace
23
+ {
20
24
  class MyClass
21
25
  {
22
26
  public:
@@ -41,9 +45,9 @@ TESTCASE(StringVector)
41
45
  {
42
46
  Module m = define_module("Testing");
43
47
 
44
- Class c = define_vector<std::vector<std::string>>("StringVector");
48
+ Class c = define_vector<std::string>("StringVector");
45
49
 
46
- Object vec = m.module_eval("$vector = StringVector.new");
50
+ Object vec = m.module_eval("$vector = Std::StringVector.new");
47
51
  Object result = vec.call("size");
48
52
  ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
49
53
 
@@ -62,13 +66,64 @@ TESTCASE(StringVector)
62
66
  ASSERT_EQUAL("four", detail::From_Ruby<std::string>().convert(result));
63
67
  }
64
68
 
65
- TESTCASE(WrongType)
69
+ TESTCASE(Constructors)
70
+ {
71
+ Module m = define_module("Testing");
72
+
73
+ Class c = define_vector<int>("IntVector");
74
+
75
+ // Default constructor
76
+ std::string code = R"(Std::IntVector.new)";
77
+ Object vec = m.module_eval(code);
78
+ Object result = vec.call("size");
79
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
80
+
81
+ detail::From_Ruby<int> fromRuby;
82
+
83
+ // Constructor with specific size and default construtible values
84
+ code = R"(Std::IntVector.new(3))";
85
+ vec = m.module_eval(code);
86
+ result = vec.call("size");
87
+ ASSERT_EQUAL(3, fromRuby.convert(result));
88
+ Object element = vec.call("[]", 0);
89
+ ASSERT_EQUAL(0, fromRuby.convert(element));
90
+ element = vec.call("[]", 1);
91
+ ASSERT_EQUAL(0, fromRuby.convert(element));
92
+ element = vec.call("[]", 2);
93
+ ASSERT_EQUAL(0, fromRuby.convert(element));
94
+
95
+ // Constructor with specific size and value
96
+ code = R"(Std::IntVector.new(3, 5))";
97
+ vec = m.module_eval(code);
98
+ result = vec.call("size");
99
+ ASSERT_EQUAL(3, fromRuby.convert(result));
100
+ element = vec.call("[]", 0);
101
+ ASSERT_EQUAL(5, fromRuby.convert(element));
102
+ element = vec.call("[]", 1);
103
+ ASSERT_EQUAL(5, fromRuby.convert(element));
104
+ element = vec.call("[]", 2);
105
+ ASSERT_EQUAL(5, fromRuby.convert(element));
106
+
107
+ // Custom constructor
108
+ code = R"(Std::IntVector.new([1, 2, 3]))";
109
+ vec = m.module_eval(code);
110
+ result = vec.call("size");
111
+ ASSERT_EQUAL(3, fromRuby.convert(result));
112
+ element = vec.call("[]", 0);
113
+ ASSERT_EQUAL(1, fromRuby.convert(element));
114
+ element = vec.call("[]", 1);
115
+ ASSERT_EQUAL(2, fromRuby.convert(element));
116
+ element = vec.call("[]", 2);
117
+ ASSERT_EQUAL(3, fromRuby.convert(element));
118
+ }
119
+
120
+ TESTCASE(WrongElementType)
66
121
  {
67
122
  Module m = define_module("Testing");
68
123
 
69
- Class c = define_vector<std::vector<std::string>>("StringVector");
124
+ Class c = define_vector<std::string>("StringVector");
70
125
 
71
- Object vec = m.module_eval("$vector = StringVector.new");
126
+ Object vec = m.module_eval("$vector = Std::StringVector.new");
72
127
  ASSERT_EXCEPTION_CHECK(
73
128
  Exception,
74
129
  m.module_eval("$vector << 1"),
@@ -79,7 +134,7 @@ TESTCASE(Empty)
79
134
  {
80
135
  Module m = define_module("Testing");
81
136
 
82
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
137
+ Class c = define_vector<std::int32_t>("IntVector");
83
138
  Object vec = c.call("new");
84
139
 
85
140
  Object result = vec.call("size");
@@ -95,11 +150,50 @@ TESTCASE(Empty)
95
150
  ASSERT_EQUAL(Qnil, result.value());
96
151
  }
97
152
 
153
+ TESTCASE(BoolVector)
154
+ {
155
+ Class boolVecClass = define_vector<bool>("BoolVector");
156
+
157
+ Object vec = boolVecClass.call("new");
158
+ vec.call("resize", 3, true);
159
+
160
+ Object result = vec.call("size");
161
+ ASSERT_EQUAL(3, detail::From_Ruby<int32_t>().convert(result));
162
+ result = vec.call("first");
163
+ ASSERT_EQUAL(Qtrue, result.value());
164
+
165
+ Object enumerable = vec.call("each");
166
+ Object arr = enumerable.call("to_a");
167
+ Object size = arr.call("size");
168
+ ASSERT_EQUAL(3, detail::From_Ruby<int32_t>().convert(size));
169
+
170
+ result = vec.call("[]", 0);
171
+ ASSERT_EQUAL(Qtrue, result.value());
172
+
173
+ result = vec.call("[]=", 1, false);
174
+ ASSERT_EQUAL(Qfalse, result.value());
175
+
176
+ std::string code = R"(array = self.each.to_a
177
+ array == [true, false, true])";
178
+
179
+ result = vec.instance_eval(code);
180
+ ASSERT_EQUAL(Qtrue, result.value());
181
+
182
+ result = vec.call("delete", 1);
183
+ ASSERT_EQUAL(Qtrue, result.value());
184
+ result = vec.call("size");
185
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
186
+
187
+ vec.call("clear");
188
+ result = vec.call("size");
189
+ ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
190
+ }
191
+
98
192
  TESTCASE(Indexing)
99
193
  {
100
194
  Module m = define_module("Testing");
101
195
 
102
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
196
+ Class c = define_vector<std::int32_t>("IntVector");
103
197
  Object vec = c.call("new");
104
198
  vec.call("push", 0);
105
199
  vec.call("push", 1);
@@ -136,11 +230,47 @@ TESTCASE(Indexing)
136
230
  ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
137
231
  }
138
232
 
233
+ TESTCASE(Slice)
234
+ {
235
+ Module m = define_module("Testing");
236
+
237
+ Class c = define_vector<std::int32_t>("IntVector");
238
+ Object vec = c.call("new");
239
+ vec.call("push", 7);
240
+ vec.call("push", 8);
241
+ vec.call("push", 9);
242
+ vec.call("push", 10);
243
+ vec.call("push", 11);
244
+ vec.call("push", 12);
245
+
246
+ Array result = vec.call("[]", 3, 1);
247
+ std::vector<std::int32_t> slice = result.to_vector<int32_t>();
248
+ ASSERT_EQUAL(1, slice.size());
249
+ ASSERT_EQUAL(10, slice[0]);
250
+
251
+ result = vec.call("[]", 3, 2);
252
+ slice = result.to_vector<int32_t>();
253
+ ASSERT_EQUAL(2, slice.size());
254
+ ASSERT_EQUAL(10, slice[0]);
255
+ ASSERT_EQUAL(11, slice[1]);
256
+
257
+ result = vec.call("[]", 4, 10);
258
+ slice = result.to_vector<int32_t>();
259
+ ASSERT_EQUAL(2, slice.size());
260
+ ASSERT_EQUAL(11, slice[0]);
261
+ ASSERT_EQUAL(12, slice[1]);
262
+
263
+ result = vec.call("[]", -1, 2);
264
+ slice = result.to_vector<int32_t>();
265
+ ASSERT_EQUAL(1, slice.size());
266
+ ASSERT_EQUAL(12, slice[0]);
267
+ }
268
+
139
269
  TESTCASE(Sizing)
140
270
  {
141
271
  Module m = define_module("Testing");
142
272
 
143
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
273
+ Class c = define_vector<std::int32_t>("IntVector");
144
274
  Object vec = c.call("new");
145
275
  vec.call("resize", 10);
146
276
 
@@ -157,7 +287,7 @@ TESTCASE(ToString)
157
287
  {
158
288
  Module m = define_module("Testing");
159
289
 
160
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
290
+ Class c = define_vector<std::int32_t>("IntVector");
161
291
  Object vec = c.call("new");
162
292
  vec.call("resize", 3);
163
293
 
@@ -174,7 +304,7 @@ TESTCASE(Update)
174
304
  {
175
305
  Module m = define_module("Testing");
176
306
 
177
- Class c = define_vector<std::vector<std::string>>("StringVector");
307
+ Class c = define_vector<std::string>("StringVector");
178
308
  Object vec = c.call("new");
179
309
  vec.call("push", "original 1");
180
310
  vec.call("push", "original 2");
@@ -198,7 +328,7 @@ TESTCASE(Modify)
198
328
  {
199
329
  Module m = define_module("Testing");
200
330
 
201
- Class c = define_vector<std::vector<int64_t>>("Int64Vector");
331
+ Class c = define_vector<int64_t>("Int64Vector");
202
332
  Object vec = c.call("new");
203
333
 
204
334
  Object result = vec.call("push", 11);
@@ -238,26 +368,26 @@ TESTCASE(Modify)
238
368
  ASSERT_EQUAL(Qnil, result.value());
239
369
  }
240
370
 
241
- TESTCASE(Copy)
371
+ TESTCASE(Clone)
242
372
  {
243
373
  Module m = define_module("Testing");
244
374
 
245
- Class c = define_vector<std::vector<double>>("DoubleVector");
375
+ Class c = define_vector<double>("DoubleVector");
246
376
  Object object = c.call("new");
247
377
 
248
378
  object.call("push", 11.1);
249
379
  object.call("push", 22.2);
250
380
  std::vector<double>& vec = detail::From_Ruby<std::vector<double>&>().convert(object);
251
381
 
252
- Object result = object.call("copy");
253
- std::vector<double>& vecCopy = detail::From_Ruby<std::vector<double>&>().convert(result);
382
+ Object result = object.call("clone");
383
+ std::vector<double>& vecClone = detail::From_Ruby<std::vector<double>&>().convert(result);
254
384
 
255
- ASSERT_EQUAL(vec.size(), vecCopy.size());
256
- ASSERT_EQUAL(vec[0], vecCopy[0]);
257
- ASSERT_EQUAL(vec[1], vecCopy[1]);
385
+ ASSERT_EQUAL(vec.size(), vecClone.size());
386
+ ASSERT_EQUAL(vec[0], vecClone[0]);
387
+ ASSERT_EQUAL(vec[1], vecClone[1]);
258
388
 
259
- vecCopy.push_back(33.3);
260
- ASSERT_NOT_EQUAL(vec.size(), vecCopy.size());
389
+ vecClone.push_back(33.3);
390
+ ASSERT_NOT_EQUAL(vec.size(), vecClone.size());
261
391
  }
262
392
 
263
393
  namespace
@@ -278,7 +408,7 @@ TESTCASE(NotComparable)
278
408
  define_class<NotComparable>("NotComparable").
279
409
  define_constructor(Constructor<NotComparable, uint32_t>());
280
410
 
281
- Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
411
+ Class c = define_vector<NotComparable>("NotComparableVector");
282
412
 
283
413
  Object vec = c.call("new");
284
414
  vec.call("push", NotComparable(1));
@@ -303,7 +433,7 @@ TESTCASE(NotDefaultConstructable)
303
433
  define_class<NotComparable>("NotComparable").
304
434
  define_constructor(Constructor<NotComparable, uint32_t>());
305
435
 
306
- Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
436
+ Class c = define_vector<NotComparable>("NotComparableVector");
307
437
  Object vec = c.call("new");
308
438
 
309
439
  Object result = vec.call("resize", 10);
@@ -318,7 +448,7 @@ TESTCASE(NotPrintable)
318
448
  define_class<NotComparable>("NotComparable").
319
449
  define_constructor(Constructor<NotComparable, uint32_t>());
320
450
 
321
- Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
451
+ Class c = define_vector<NotComparable>("NotComparableVector");
322
452
 
323
453
  Object vec = c.call("new");
324
454
  vec.call("push", NotComparable(1));
@@ -338,7 +468,7 @@ namespace
338
468
  {
339
469
  };
340
470
 
341
- bool operator==(const Comparable& other)
471
+ bool operator==(const Comparable& other) const
342
472
  {
343
473
  return this->value_ == other.value_;
344
474
  }
@@ -358,7 +488,7 @@ TESTCASE(Comparable)
358
488
  define_class<Comparable>("IsComparable").
359
489
  define_constructor(Constructor<Comparable, uint32_t>());
360
490
 
361
- Class c = define_vector<std::vector<Comparable>>("ComparableVector");
491
+ Class c = define_vector<Comparable>("ComparableVector");
362
492
 
363
493
  Object vec = c.call("new");
364
494
 
@@ -385,12 +515,55 @@ TESTCASE(Comparable)
385
515
  ASSERT_EQUAL(1, detail::From_Ruby<size_t>().convert(result.value()));
386
516
  }
387
517
 
518
+ namespace
519
+ {
520
+ class ComparableButNotBool
521
+ {
522
+ public:
523
+ ComparableButNotBool(uint32_t value) : value_(value)
524
+ {
525
+ };
526
+
527
+ std::string operator==(const ComparableButNotBool& other)
528
+ {
529
+ return "not a boolean";
530
+ }
531
+
532
+ uint32_t value_;
533
+ };
534
+ }
535
+
536
+ TESTCASE(ComparableButNotBool)
537
+ {
538
+ define_class<ComparableButNotBool>("IsComparableButNotBool").
539
+ define_constructor(Constructor<ComparableButNotBool, uint32_t>());
540
+
541
+ Class c = define_vector<ComparableButNotBool>("ComparableButNotBoolVector");
542
+
543
+ Object vec = c.call("new");
544
+ vec.call("push", ComparableButNotBool(1));
545
+ vec.call("push", ComparableButNotBool(2));
546
+ vec.call("push", ComparableButNotBool(3));
547
+
548
+ Object result = vec.call("delete", ComparableButNotBool(1));
549
+ ASSERT_EQUAL(Qnil, result.value());
550
+
551
+ result = vec.call("length");
552
+ ASSERT_EQUAL(3u, detail::From_Ruby<size_t>().convert(result));
553
+
554
+ result = vec.call("include?", ComparableButNotBool(2));
555
+ ASSERT_EQUAL(Qfalse, result.value());
556
+
557
+ result = vec.call("index", ComparableButNotBool(3));
558
+ ASSERT_EQUAL(Qnil, result.value());
559
+ }
560
+
388
561
  TESTCASE(DefaultConstructable)
389
562
  {
390
563
  define_class<Comparable>("IsComparable").
391
564
  define_constructor(Constructor<Comparable, uint32_t>());
392
565
 
393
- Class c = define_vector<std::vector<Comparable>>("ComparableVector");
566
+ Class c = define_vector<Comparable>("ComparableVector");
394
567
  Object vec = c.call("new");
395
568
 
396
569
  Object result = vec.call("resize", 10);
@@ -405,7 +578,7 @@ TESTCASE(Printable)
405
578
  define_class<Comparable>("IsComparable").
406
579
  define_constructor(Constructor<Comparable, uint32_t>());
407
580
 
408
- Class c = define_vector<std::vector<Comparable>>("ComparableVector");
581
+ Class c = define_vector<Comparable>("ComparableVector");
409
582
 
410
583
  Object vec = c.call("new");
411
584
  vec.call("push", Comparable(1));
@@ -443,7 +616,7 @@ TESTCASE(AutoRegisterReturn)
443
616
 
444
617
  Module m = define_module("Testing");
445
618
  Object vec = m.module_eval("return_complex_vector");
446
- ASSERT_EQUAL("Rice::Std::Vector__complex__double___allocator__complex__double______", vec.class_name().str());
619
+ ASSERT_EQUAL("Std::Vector≺complex≺double≻≻", vec.class_name().str());
447
620
 
448
621
  std::string code = R"(vector = return_complex_vector
449
622
  complex = vector.last
@@ -453,14 +626,8 @@ TESTCASE(AutoRegisterReturn)
453
626
  ASSERT_EQUAL(Qtrue, result.value());
454
627
 
455
628
  // Now register this same vector
456
- define_vector<std::vector<std::complex<double>>>("ComplexVector");
457
- code = R"(vector = ComplexVector.new)";
458
- result = m.module_eval(code);
459
- ASSERT(result.is_instance_of(vec.class_of()));
460
-
461
- // Now register it again in the module
462
- define_vector_under<std::vector<std::complex<double>>>(m, "ComplexVector2");
463
- code = R"(vector = Testing::ComplexVector2.new)";
629
+ define_vector<std::complex<double>>("ComplexVector");
630
+ code = R"(vector = Std::ComplexVector.new)";
464
631
  result = m.module_eval(code);
465
632
  ASSERT(result.is_instance_of(vec.class_of()));
466
633
  }
@@ -469,16 +636,16 @@ TESTCASE(AutoRegisterParameter)
469
636
  {
470
637
  define_global_function("pass_complex_vector", &passComplexVector);
471
638
 
472
- std::string code = R"(vector = Rice::Std::Vector__complex__double___allocator__complex__double______.new
473
- vector << Complex(4.0, 4.0)
474
- vector << Complex(5.0, 5.0)
475
- pass_complex_vector(vector))";
639
+ std::string code = R"(vector = Std::Vector≺complex≺double≻≻.new
640
+ vector << Complex(4.0, 4.0)
641
+ vector << Complex(5.0, 5.0)
642
+ pass_complex_vector(vector))";
476
643
 
477
644
  Module m = define_module("Testing");
478
645
  Object vec = m.module_eval(code);
479
646
 
480
647
  Object result = vec.call("size");
481
- ASSERT_EQUAL("Rice::Std::Vector__complex__double___allocator__complex__double______", vec.class_name().str());
648
+ ASSERT_EQUAL("Std::Vector≺complex≺double≻≻", vec.class_name().str());
482
649
  ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
483
650
 
484
651
  std::vector<std::complex<double>> complexes = detail::From_Ruby<std::vector<std::complex<double>>>().convert(vec);
@@ -496,7 +663,7 @@ namespace
496
663
 
497
664
  TESTCASE(DefaultValue)
498
665
  {
499
- define_vector<std::vector<std::string>>("StringVector");
666
+ define_vector<std::string>("StringVector");
500
667
  define_global_function("default_vector", &defaultVector, Arg("strings") = std::vector<std::string> { "one", "two", "three" });
501
668
 
502
669
  Module m = define_module("Testing");
@@ -515,10 +682,10 @@ TESTCASE(ToArray)
515
682
  {
516
683
  Module m = define_module("Testing");
517
684
 
518
- Class c = define_vector<std::vector<std::string>>("StringVector").
685
+ Class c = define_vector<std::string>("StringVector").
519
686
  define_constructor(Constructor<std::vector<std::string>>());
520
687
 
521
- std::string code = R"(vector = StringVector.new
688
+ std::string code = R"(vector = Std::StringVector.new
522
689
  vector << "abc"
523
690
  vector << "def"
524
691
  vector << "ghi"
@@ -694,15 +861,15 @@ namespace
694
861
  stream << "Vector";
695
862
  return stream;
696
863
  }
697
- }
698
864
 
699
- void createFactoryClass()
700
- {
701
- define_class<Factory>("Factory").
702
- define_constructor(Constructor<Factory>()).
703
- define_method("pointer", &Factory::returnPointer).
704
- define_method("reference", &Factory::returnReference).
705
- define_method("value", &Factory::returnValue);
865
+ void createFactoryClass()
866
+ {
867
+ define_class<Factory>("Factory").
868
+ define_constructor(Constructor<Factory>()).
869
+ define_method("pointer", &Factory::returnPointer).
870
+ define_method("reference", &Factory::returnReference).
871
+ define_method("value", &Factory::returnValue);
872
+ }
706
873
  }
707
874
 
708
875
  TESTCASE(Returns)
@@ -726,9 +893,9 @@ TESTCASE(Returns)
726
893
  TESTCASE(Iterate)
727
894
  {
728
895
  Module m = define_module("Testing");
729
- Class c = define_vector<std::vector<double>>("DoubleVector");
896
+ Class c = define_vector<double>("DoubleVector");
730
897
 
731
- std::string code = R"(vector = DoubleVector.new
898
+ std::string code = R"(vector = Std::DoubleVector.new
732
899
  vector << 5.0 << 6.0 << 7.0
733
900
  updated = vector.map do |value|
734
901
  value * 2.0
@@ -815,8 +982,12 @@ namespace
815
982
  std::vector<std::string*> vectorOfStringPointers()
816
983
  {
817
984
  std::vector<std::string*> result;
818
- std::string* pString = new std::string("Hello");
819
- result.push_back(pString);
985
+ std::string* pString1 = new std::string("Hello");
986
+ result.push_back(pString1);
987
+
988
+ std::string* pString2 = new std::string("World");
989
+ result.push_back(pString2);
990
+
820
991
  return result;
821
992
  }
822
993
  }
@@ -827,11 +998,20 @@ TESTCASE(StringPointerVector)
827
998
 
828
999
  Module m(rb_mKernel);
829
1000
  Data_Object<std::vector<std::string*>> vec = m.call("vector_of_string_pointers");
830
- ASSERT_EQUAL(1, vec->size());
1001
+ ASSERT_EQUAL(2, vec->size());
831
1002
 
832
1003
  std::string expected("Hello");
833
1004
  std::string* actual = (*vec)[0];
834
1005
  ASSERT_EQUAL(expected, *actual);
1006
+
1007
+ std::string code = R"(vec = vector_of_string_pointers
1008
+ outer_buffer = vec.data
1009
+ inner_buffers = outer_buffer.to_ary(2)
1010
+ inner_buffer = inner_buffers[1]
1011
+ inner_buffer.to_ary(1))";
1012
+ Array array = m.module_eval(code);
1013
+ ASSERT_EQUAL(1, array.size());
1014
+ ASSERT_EQUAL("World", detail::From_Ruby<std::string>().convert(array[0].value()).c_str());
835
1015
  }
836
1016
 
837
1017
  namespace
@@ -869,3 +1049,71 @@ TESTCASE(MyClass2PointerVector)
869
1049
  MyClass2* pMyClass = (*result)[0];
870
1050
  ASSERT_EQUAL("Hello MyClass2", pMyClass->name);
871
1051
  }
1052
+
1053
+ namespace
1054
+ {
1055
+ bool typeCheckValue(std::vector<std::string> vec)
1056
+ {
1057
+ return true;
1058
+ }
1059
+
1060
+ bool typeCheckRef(std::vector<std::string>& vec)
1061
+ {
1062
+ return true;
1063
+ }
1064
+
1065
+ bool typeCheckPtr(std::vector<std::string>* vec)
1066
+ {
1067
+ return true;
1068
+ }
1069
+ }
1070
+
1071
+ TESTCASE(TypeCheck)
1072
+ {
1073
+ define_vector<int>("Vector≺int≻");
1074
+ define_vector<std::string>("Vector≺string≻");
1075
+
1076
+ Module m(anonymous_module());
1077
+ m.define_module_function("check_value", &typeCheckValue).
1078
+ define_module_function("check_ref", &typeCheckRef).
1079
+ define_module_function("check_ptr", &typeCheckPtr);
1080
+
1081
+ std::string code = R"(vec = Std::Vector≺string≻.new
1082
+ check_value(vec))";
1083
+ Object result = m.module_eval(code);
1084
+ ASSERT_EQUAL(Qtrue, result.value());
1085
+
1086
+ code = R"(vec = Std::Vector≺string≻.new
1087
+ check_ref(vec))";
1088
+ result = m.module_eval(code);
1089
+ ASSERT_EQUAL(Qtrue, result.value());
1090
+
1091
+ code = R"(vec = Std::Vector≺string≻.new
1092
+ check_ptr(vec))";
1093
+ result = m.module_eval(code);
1094
+ ASSERT_EQUAL(Qtrue, result.value());
1095
+
1096
+ code = R"(vec = Std::Vector≺int≻.new
1097
+ check_value(vec))";
1098
+
1099
+ ASSERT_EXCEPTION_CHECK(
1100
+ Exception,
1101
+ result = m.module_eval(code),
1102
+ ASSERT_EQUAL("wrong argument type Std::Vector≺int≻ (expected Std::Vector≺string≻)", ex.what()));
1103
+
1104
+ code = R"(vec = Std::Vector≺int≻.new
1105
+ check_ref(vec))";
1106
+
1107
+ ASSERT_EXCEPTION_CHECK(
1108
+ Exception,
1109
+ result = m.module_eval(code),
1110
+ ASSERT_EQUAL("wrong argument type Std::Vector≺int≻ (expected Std::Vector≺string≻)", ex.what()));
1111
+
1112
+ code = R"(vec = Std::Vector≺int≻.new
1113
+ check_ptr(vec))";
1114
+
1115
+ ASSERT_EXCEPTION_CHECK(
1116
+ Exception,
1117
+ result = m.module_eval(code),
1118
+ ASSERT_EQUAL("wrong argument type Std::Vector≺int≻ (expected Std::Vector≺string≻)", ex.what()));
1119
+ }
data/test/test_String.cpp CHANGED
@@ -11,6 +11,11 @@ SETUP(String)
11
11
  embed_ruby();
12
12
  }
13
13
 
14
+ TEARDOWN(String)
15
+ {
16
+ rb_gc_start();
17
+ }
18
+
14
19
  TESTCASE(default_construct)
15
20
  {
16
21
  String s;
data/test/test_Struct.cpp CHANGED
@@ -24,6 +24,11 @@ SETUP(Struct)
24
24
  embed_ruby();
25
25
  }
26
26
 
27
+ TEARDOWN(Struct)
28
+ {
29
+ rb_gc_start();
30
+ }
31
+
27
32
  TESTCASE(default_construct)
28
33
  {
29
34
  Struct s;
data/test/test_Symbol.cpp CHANGED
@@ -11,6 +11,11 @@ SETUP(Symbol)
11
11
  embed_ruby();
12
12
  }
13
13
 
14
+ TEARDOWN(Symbol)
15
+ {
16
+ rb_gc_start();
17
+ }
18
+
14
19
  TESTCASE(construct_from_symbol)
15
20
  {
16
21
  VALUE v = ID2SYM(rb_intern("foo"));