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
@@ -104,6 +104,94 @@ void makeIntrinsicVariant()
104
104
  define_attr("variant_attr", &MyClass::variant_);
105
105
  }
106
106
 
107
+ namespace
108
+ {
109
+ class MyClass1
110
+ {
111
+ public:
112
+ MyClass1()
113
+ {
114
+ int a = 1;
115
+ }
116
+
117
+ std::string sayHello()
118
+ {
119
+ return "Hi from MyClass1";
120
+ }
121
+ };
122
+
123
+ class MyClass2
124
+ {
125
+ public:
126
+ MyClass2()
127
+ {
128
+ int a = 2;
129
+ }
130
+
131
+ std::string sayHello()
132
+ {
133
+ return "Hi from MyClass2";
134
+ }
135
+ };
136
+
137
+ using Variant_T = std::variant<std::monostate, MyClass1, MyClass2>;
138
+
139
+ Variant_T variant(bool myClass1)
140
+ {
141
+ if (myClass1)
142
+ {
143
+ return MyClass1();
144
+ }
145
+ else
146
+ {
147
+ return MyClass2();
148
+ }
149
+ }
150
+
151
+ Variant_T roundTripVariant(Variant_T variant)
152
+ {
153
+ return variant;
154
+ }
155
+
156
+ Variant_T& roundTripVariantRef(Variant_T& variant)
157
+ {
158
+ return variant;
159
+ }
160
+
161
+ const Variant_T& roundTripConstVariantRef(const Variant_T& variant)
162
+ {
163
+ return variant;
164
+ }
165
+ }
166
+
167
+ void makeClassVariant()
168
+ {
169
+ define_class<MyClass1>("MyClass1").
170
+ define_constructor(Constructor<MyClass1>()).
171
+ define_method("say_hello", &MyClass1::sayHello);
172
+
173
+ define_class<MyClass2>("MyClass2").
174
+ define_constructor(Constructor<MyClass2>()).
175
+ define_method("say_hello", &MyClass2::sayHello);
176
+
177
+ define_global_function("variant_class", &variant);
178
+ define_global_function("roundtrip_variant", &roundTripVariant);
179
+ define_global_function("roundtrip_variant_ref", &roundTripVariantRef);
180
+ define_global_function("roundtrip_const_variant_ref", &roundTripConstVariantRef);
181
+ }
182
+
183
+ SETUP(Variant)
184
+ {
185
+ embed_ruby();
186
+ makeIntrinsicVariant();
187
+ makeClassVariant();
188
+ }
189
+
190
+ TEARDOWN(Variant)
191
+ {
192
+ rb_gc_start();
193
+ }
194
+
107
195
  TESTCASE(IntrinsicReturns)
108
196
  {
109
197
  using namespace std::complex_literals;
@@ -212,83 +300,6 @@ TESTCASE(VariantAttribute)
212
300
  ASSERT_EQUAL(78, detail::From_Ruby<int>().convert(result));
213
301
  }
214
302
 
215
- namespace
216
- {
217
- class MyClass1
218
- {
219
- public:
220
- MyClass1()
221
- {
222
- int a = 1;
223
- }
224
-
225
- std::string sayHello()
226
- {
227
- return "Hi from MyClass1";
228
- }
229
- };
230
-
231
- class MyClass2
232
- {
233
- public:
234
- MyClass2()
235
- {
236
- int a = 2;
237
- }
238
-
239
- std::string sayHello()
240
- {
241
- return "Hi from MyClass2";
242
- }
243
- };
244
-
245
- using Class_Variant_T = std::variant<std::monostate, MyClass1, MyClass2>;
246
-
247
- Class_Variant_T variantClass(bool myClass1)
248
- {
249
- if (myClass1)
250
- {
251
- return MyClass1();
252
- }
253
- else
254
- {
255
- return MyClass2();
256
- }
257
- }
258
-
259
- Class_Variant_T roundTripVariantClass(Class_Variant_T variant)
260
- {
261
- return variant;
262
- }
263
-
264
- Class_Variant_T& roundTripVariantClassRef(Class_Variant_T& variant)
265
- {
266
- return variant;
267
- }
268
- }
269
-
270
- void makeClassVariant()
271
- {
272
- define_class<MyClass1>("MyClass1").
273
- define_constructor(Constructor<MyClass1>()).
274
- define_method("say_hello", &MyClass1::sayHello);
275
-
276
- define_class<MyClass2>("MyClass2").
277
- define_constructor(Constructor<MyClass2>()).
278
- define_method("say_hello", &MyClass2::sayHello);
279
-
280
- define_global_function("variant_class", &variantClass);
281
- define_global_function("roundtrip_variant_class", &roundTripVariantClass);
282
- define_global_function("roundtrip_variant_class_ref", &roundTripVariantClassRef);
283
- }
284
-
285
- SETUP(Variant)
286
- {
287
- embed_ruby();
288
- makeIntrinsicVariant();
289
- makeClassVariant();
290
- }
291
-
292
303
  TESTCASE(ClassReturns)
293
304
  {
294
305
  Module m = define_module("Testing");
@@ -302,19 +313,22 @@ TESTCASE(ClassReturns)
302
313
  ASSERT_EQUAL("Hi from MyClass2", detail::From_Ruby<std::string>().convert(hello));
303
314
  }
304
315
 
305
- TESTCASE(ClassRoundtrip)
316
+ TESTCASE(Roundtrip)
306
317
  {
307
318
  Module m = define_module("Testing");
308
319
 
309
320
  Object instance = m.module_eval("MyClass1.new");
310
- Object instance2 = m.call("roundtrip_variant_class", instance);
321
+ Object instance2 = m.call("roundtrip_variant", instance);
311
322
  String hello = instance2.call("say_hello");
312
323
  ASSERT_EQUAL("Hi from MyClass1", detail::From_Ruby<std::string>().convert(hello));
313
324
 
314
325
  instance = m.module_eval("MyClass2.new");
315
- instance2 = m.call("roundtrip_variant_class", instance);
326
+ instance2 = m.call("roundtrip_variant", instance);
316
327
  hello = instance2.call("say_hello");
317
328
  ASSERT_EQUAL("Hi from MyClass2", detail::From_Ruby<std::string>().convert(hello));
329
+
330
+ instance2 = m.call("roundtrip_variant", nullptr);
331
+ ASSERT_EQUAL(Qnil, instance2.value());
318
332
  }
319
333
 
320
334
  /* This test case runs successfully on MSVC but not g++. Having stepped through the code with
@@ -326,21 +340,140 @@ TESTCASE(ClassRoundtrip)
326
340
  std::tuple with one element, a reference to a variant. So it doesn't change and the address
327
341
  of the variable doesn't change. But for some reason g++ resets the
328
342
  the std::variant index to 0 thus breaking the test. Maybe something to do with storing
329
- a refernence to a variant in a tuple? */
343
+ a reference to a variant in a tuple? */
330
344
 
331
345
  #ifdef _MSC_VER
332
- TESTCASE(ClassRoundtripRef)
346
+ TESTCASE(RoundtripRef)
333
347
  {
334
348
  Module m = define_module("Testing");
335
349
 
336
350
  Object instance = m.module_eval("MyClass1.new");
337
- Object instance2 = m.call("roundtrip_variant_class_ref", instance);
351
+ Object instance2 = m.call("roundtrip_variant_ref", instance);
338
352
  String hello = instance2.call("say_hello");
339
353
  ASSERT_EQUAL("Hi from MyClass1", detail::From_Ruby<std::string>().convert(hello));
340
354
 
341
355
  instance = m.module_eval("MyClass2.new");
342
- instance2 = m.call("roundtrip_variant_class_ref", instance);
356
+ instance2 = m.call("roundtrip_variant_ref", instance);
343
357
  hello = instance2.call("say_hello");
344
358
  ASSERT_EQUAL("Hi from MyClass2", detail::From_Ruby<std::string>().convert(hello));
359
+
360
+ instance2 = m.call("roundtrip_variant_ref", nullptr);
361
+ ASSERT_EQUAL(Qnil, instance2.value());
345
362
  }
346
363
  #endif
364
+
365
+ TESTCASE(RoundtripConstRef)
366
+ {
367
+ Module m = define_module("Testing");
368
+
369
+ Object instance = m.module_eval("MyClass1.new");
370
+ Object instance2 = m.call("roundtrip_const_variant_ref", instance);
371
+ String hello = instance2.call("say_hello");
372
+ ASSERT_EQUAL("Hi from MyClass1", detail::From_Ruby<std::string>().convert(hello));
373
+
374
+ instance = m.module_eval("MyClass2.new");
375
+ instance2 = m.call("roundtrip_const_variant_ref", instance);
376
+ hello = instance2.call("say_hello");
377
+ ASSERT_EQUAL("Hi from MyClass2", detail::From_Ruby<std::string>().convert(hello));
378
+
379
+ instance2 = m.call("roundtrip_const_variant_ref", nullptr);
380
+ ASSERT_EQUAL(Qnil, instance2.value());
381
+ }
382
+
383
+ namespace
384
+ {
385
+ class MyClass4
386
+ {
387
+ public:
388
+ size_t variantIndex(std::variant<std::vector<std::string>, std::vector<int>> variant)
389
+ {
390
+ return variant.index();
391
+ }
392
+ };
393
+ }
394
+
395
+ TESTCASE(VariantWithTwoVectors)
396
+ {
397
+ using namespace std::complex_literals;
398
+
399
+ define_class<MyClass4>("MyClass4").
400
+ define_constructor(Constructor<MyClass4>()).
401
+ define_method("variant_index", &MyClass4::variantIndex);
402
+
403
+ Module m = define_module("Testing");
404
+
405
+ std::string code = R"(vector = Std::Vector≺string≻.new
406
+ vector << "a" << "b" << "c"
407
+ my_class = MyClass4.new
408
+ my_class.variant_index(vector))";
409
+
410
+ Object result = m.module_eval(code);
411
+ ASSERT_EQUAL(0, detail::From_Ruby<size_t>().convert(result));
412
+
413
+ code = R"(vector = Std::Vector≺int≻.new
414
+ vector.push_back(4)
415
+ my_class = MyClass4.new
416
+ my_class.variant_index(vector))";
417
+ result = m.module_eval(code);
418
+ ASSERT_EQUAL(1, detail::From_Ruby<size_t>().convert(result));
419
+
420
+ code = R"(my_class = MyClass4.new
421
+ my_class.variant_index(["x", "y", "z"]))";
422
+ result = m.module_eval(code);
423
+ ASSERT_EQUAL(0, detail::From_Ruby<size_t>().convert(result));
424
+
425
+ code = R"(my_class = MyClass4.new
426
+ my_class.variant_index([5, 6]))";
427
+
428
+ ASSERT_EXCEPTION_CHECK(
429
+ Exception,
430
+ m.module_eval(code),
431
+ ASSERT_EQUAL("wrong argument type Integer (expected String)", ex.what())
432
+ );
433
+ }
434
+
435
+ namespace
436
+ {
437
+ class MyClass5
438
+ {
439
+ public:
440
+ static inline int a = 10;
441
+ static inline float b = 11.0;
442
+ public:
443
+ std::variant<Buffer<int>, Buffer<float>> variantBuffer(int index)
444
+ {
445
+ if (index == 0)
446
+ {
447
+ return Buffer<int>(&a);
448
+ }
449
+ else
450
+ {
451
+ return Buffer<float>(&b);
452
+ }
453
+ }
454
+ };
455
+ }
456
+
457
+ TESTCASE(Buffer)
458
+ {
459
+ define_buffer<int>();
460
+ define_buffer<float>();
461
+ using namespace std::complex_literals;
462
+
463
+ define_class<MyClass5>("MyClass5").
464
+ define_constructor(Constructor<MyClass5>()).
465
+ define_method("buffer", &MyClass5::variantBuffer);
466
+
467
+ Module m = define_module("Testing");
468
+
469
+ std::string code = R"(myclass = MyClass5.new
470
+ myclass.buffer(0).to_ary(1).first)";
471
+
472
+ Object result = m.module_eval(code);
473
+ ASSERT_EQUAL(10, detail::From_Ruby<int>().convert(result));
474
+
475
+ code = R"(myclass = MyClass5.new
476
+ myclass.buffer(1).to_ary(1).first)";
477
+ result = m.module_eval(code);
478
+ ASSERT_EQUAL(11.0, detail::From_Ruby<float>().convert(result));
479
+ }