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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +86 -26
- data/CMakeLists.txt +31 -0
- data/CMakePresets.json +75 -0
- data/COPYING +3 -2
- data/FindRuby.cmake +437 -0
- data/README.md +7 -2
- data/Rakefile +12 -5
- data/include/rice/rice.hpp +9522 -4426
- data/include/rice/stl.hpp +2831 -1198
- data/lib/make_rice_headers.rb +79 -0
- data/lib/mkmf-rice.rb +40 -94
- data/lib/rice/version.rb +3 -0
- data/lib/rice.rb +1 -0
- data/lib/rubygems/builder.rb +11 -0
- data/lib/rubygems/cmake_builder.rb +113 -0
- data/lib/rubygems_plugin.rb +9 -0
- data/rice/Address_Registration_Guard.hpp +72 -3
- data/rice/Arg.hpp +26 -6
- data/rice/Arg.ipp +35 -2
- data/rice/Buffer.hpp +123 -0
- data/rice/Buffer.ipp +599 -0
- data/rice/Callback.hpp +21 -0
- data/rice/Callback.ipp +13 -0
- data/rice/Constructor.hpp +4 -27
- data/rice/Constructor.ipp +79 -0
- data/rice/Data_Object.hpp +73 -3
- data/rice/Data_Object.ipp +388 -96
- data/rice/Data_Type.hpp +214 -3
- data/rice/Data_Type.ipp +144 -67
- data/rice/Director.hpp +0 -2
- data/rice/Enum.hpp +4 -7
- data/rice/Enum.ipp +102 -55
- data/rice/Exception.hpp +62 -2
- data/rice/Exception.ipp +7 -12
- data/rice/Init.hpp +8 -0
- data/rice/Init.ipp +8 -0
- data/rice/JumpException.hpp +44 -0
- data/rice/JumpException.ipp +48 -0
- data/rice/MemoryView.hpp +11 -0
- data/rice/MemoryView.ipp +3 -0
- data/rice/Return.hpp +7 -27
- data/rice/Return.ipp +13 -13
- data/rice/cpp_api/Array.hpp +209 -0
- data/rice/cpp_api/Array.ipp +304 -0
- data/rice/cpp_api/Builtin_Object.hpp +31 -0
- data/rice/cpp_api/Builtin_Object.ipp +37 -0
- data/rice/cpp_api/Class.hpp +70 -0
- data/rice/cpp_api/Class.ipp +97 -0
- data/rice/cpp_api/Encoding.hpp +32 -0
- data/rice/cpp_api/Encoding.ipp +59 -0
- data/rice/cpp_api/Hash.hpp +194 -0
- data/rice/cpp_api/Hash.ipp +257 -0
- data/rice/{Identifier.hpp → cpp_api/Identifier.hpp} +2 -6
- data/rice/{Identifier.ipp → cpp_api/Identifier.ipp} +4 -2
- data/rice/cpp_api/Module.hpp +72 -0
- data/rice/cpp_api/Module.ipp +101 -0
- data/rice/cpp_api/Object.hpp +272 -0
- data/rice/cpp_api/Object.ipp +235 -0
- data/rice/cpp_api/String.hpp +74 -0
- data/rice/cpp_api/String.ipp +120 -0
- data/rice/cpp_api/Struct.hpp +113 -0
- data/rice/cpp_api/Struct.ipp +92 -0
- data/rice/cpp_api/Symbol.hpp +46 -0
- data/rice/cpp_api/Symbol.ipp +93 -0
- data/rice/cpp_api/shared_methods.hpp +134 -0
- data/rice/detail/DefaultHandler.hpp +12 -0
- data/rice/detail/DefaultHandler.ipp +8 -0
- data/rice/detail/HandlerRegistry.hpp +5 -35
- data/rice/detail/HandlerRegistry.ipp +7 -11
- data/rice/detail/InstanceRegistry.hpp +1 -4
- data/rice/detail/MethodInfo.hpp +12 -10
- data/rice/detail/MethodInfo.ipp +26 -21
- data/rice/detail/Native.hpp +33 -0
- data/rice/detail/Native.ipp +157 -0
- data/rice/detail/NativeAttributeGet.hpp +52 -0
- data/rice/detail/NativeAttributeGet.ipp +57 -0
- data/rice/detail/NativeAttributeSet.hpp +44 -0
- data/rice/detail/NativeAttributeSet.ipp +88 -0
- data/rice/detail/NativeCallbackFFI.hpp +55 -0
- data/rice/detail/NativeCallbackFFI.ipp +151 -0
- data/rice/detail/NativeCallbackSimple.hpp +30 -0
- data/rice/detail/NativeCallbackSimple.ipp +29 -0
- data/rice/detail/NativeFunction.hpp +33 -23
- data/rice/detail/NativeFunction.ipp +309 -70
- data/rice/detail/NativeIterator.hpp +9 -11
- data/rice/detail/NativeIterator.ipp +33 -31
- data/rice/detail/NativeRegistry.hpp +24 -15
- data/rice/detail/NativeRegistry.ipp +23 -48
- data/rice/detail/Proc.hpp +4 -0
- data/rice/detail/Proc.ipp +85 -0
- data/rice/detail/Registries.hpp +0 -7
- data/rice/detail/Registries.ipp +0 -18
- data/rice/detail/RubyFunction.hpp +0 -3
- data/rice/detail/RubyFunction.ipp +4 -8
- data/rice/detail/RubyType.hpp +16 -0
- data/rice/detail/RubyType.ipp +232 -0
- data/rice/detail/Type.hpp +7 -6
- data/rice/detail/Type.ipp +192 -45
- data/rice/detail/TypeRegistry.hpp +15 -7
- data/rice/detail/TypeRegistry.ipp +105 -12
- data/rice/detail/Wrapper.hpp +68 -32
- data/rice/detail/Wrapper.ipp +121 -109
- data/rice/detail/cpp_protect.hpp +5 -6
- data/rice/detail/default_allocation_func.ipp +0 -2
- data/rice/detail/from_ruby.hpp +38 -3
- data/rice/detail/from_ruby.ipp +1321 -492
- data/rice/detail/ruby.hpp +18 -0
- data/rice/detail/to_ruby.hpp +41 -3
- data/rice/detail/to_ruby.ipp +1424 -194
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +0 -1
- data/rice/libc/file.hpp +11 -0
- data/rice/libc/file.ipp +32 -0
- data/rice/rice.hpp +116 -26
- data/rice/ruby_mark.hpp +4 -3
- data/rice/stl/complex.hpp +6 -0
- data/rice/stl/complex.ipp +93 -0
- data/rice/stl/exception.hpp +11 -0
- data/rice/stl/exception.ipp +29 -0
- data/rice/stl/exception_ptr.hpp +6 -0
- data/rice/stl/exception_ptr.ipp +27 -0
- data/rice/stl/map.hpp +12 -0
- data/rice/stl/map.ipp +469 -0
- data/rice/stl/monostate.hpp +6 -0
- data/rice/stl/monostate.ipp +80 -0
- data/rice/stl/multimap.hpp +14 -0
- data/rice/stl/multimap.ipp +448 -0
- data/rice/stl/optional.hpp +6 -0
- data/rice/stl/optional.ipp +118 -0
- data/rice/stl/pair.hpp +13 -0
- data/rice/stl/pair.ipp +155 -0
- data/rice/stl/reference_wrapper.hpp +6 -0
- data/rice/stl/reference_wrapper.ipp +41 -0
- data/rice/stl/set.hpp +12 -0
- data/rice/stl/set.ipp +495 -0
- data/rice/stl/shared_ptr.hpp +28 -0
- data/rice/stl/shared_ptr.ipp +224 -0
- data/rice/stl/string.hpp +6 -0
- data/rice/stl/string.ipp +158 -0
- data/rice/stl/string_view.hpp +6 -0
- data/rice/stl/string_view.ipp +65 -0
- data/rice/stl/tuple.hpp +6 -0
- data/rice/stl/tuple.ipp +128 -0
- data/rice/stl/type_index.hpp +6 -0
- data/rice/stl/type_index.ipp +30 -0
- data/rice/stl/type_info.hpp +6 -0
- data/rice/stl/type_info.ipp +29 -0
- data/rice/stl/unique_ptr.hpp +22 -0
- data/rice/stl/unique_ptr.ipp +139 -0
- data/rice/stl/unordered_map.hpp +12 -0
- data/rice/stl/unordered_map.ipp +469 -0
- data/rice/stl/variant.hpp +6 -0
- data/rice/stl/variant.ipp +242 -0
- data/rice/stl/vector.hpp +12 -0
- data/rice/stl/vector.ipp +590 -0
- data/rice/stl.hpp +11 -3
- data/rice/traits/attribute_traits.hpp +26 -0
- data/rice/traits/function_traits.hpp +95 -0
- data/rice/traits/method_traits.hpp +47 -0
- data/rice/traits/rice_traits.hpp +160 -0
- data/rice.gemspec +85 -0
- data/test/embed_ruby.cpp +7 -1
- data/test/extconf.rb +2 -0
- data/test/test_Address_Registration_Guard.cpp +5 -0
- data/test/test_Array.cpp +18 -4
- data/test/test_Attribute.cpp +136 -21
- data/test/test_Buffer.cpp +285 -0
- data/test/test_Builtin_Object.cpp +5 -0
- data/test/test_Callback.cpp +230 -0
- data/test/test_Class.cpp +5 -31
- data/test/test_Constructor.cpp +69 -6
- data/test/test_Data_Object.cpp +97 -38
- data/test/test_Data_Type.cpp +470 -65
- data/test/test_Director.cpp +17 -8
- data/test/test_Enum.cpp +155 -40
- data/test/test_Exception.cpp +235 -0
- data/test/test_File.cpp +70 -0
- data/test/test_From_Ruby.cpp +609 -0
- data/test/test_Hash.cpp +5 -0
- data/test/test_Identifier.cpp +5 -0
- data/test/test_Inheritance.cpp +6 -1
- data/test/test_Iterator.cpp +6 -1
- data/test/test_Jump_Exception.cpp +23 -0
- data/test/test_Keep_Alive.cpp +13 -19
- data/test/test_Keep_Alive_No_Wrapper.cpp +5 -1
- data/test/test_Memory_Management.cpp +5 -0
- data/test/test_Module.cpp +128 -67
- data/test/test_Native_Registry.cpp +2 -34
- data/test/test_Object.cpp +5 -0
- data/test/test_Overloads.cpp +806 -0
- data/test/test_Ownership.cpp +160 -54
- data/test/test_Proc.cpp +44 -0
- data/test/test_Self.cpp +9 -4
- data/test/test_Stl_Exception.cpp +109 -0
- data/test/test_Stl_Map.cpp +54 -42
- data/test/test_Stl_Multimap.cpp +693 -0
- data/test/test_Stl_Optional.cpp +5 -0
- data/test/test_Stl_Pair.cpp +14 -9
- data/test/test_Stl_Reference_Wrapper.cpp +9 -2
- data/test/test_Stl_Set.cpp +790 -0
- data/test/test_Stl_SharedPtr.cpp +458 -0
- data/test/test_Stl_String.cpp +5 -0
- data/test/test_Stl_String_View.cpp +5 -0
- data/test/test_Stl_Tuple.cpp +116 -0
- data/test/test_Stl_Type.cpp +147 -0
- data/test/test_Stl_UniquePtr.cpp +202 -0
- data/test/test_Stl_Unordered_Map.cpp +43 -38
- data/test/test_Stl_Variant.cpp +217 -84
- data/test/test_Stl_Vector.cpp +306 -58
- data/test/test_String.cpp +5 -0
- data/test/test_Struct.cpp +5 -0
- data/test/test_Symbol.cpp +5 -0
- data/test/test_Template.cpp +192 -0
- data/test/test_To_Ruby.cpp +524 -0
- data/test/test_Tracking.cpp +1 -0
- data/test/test_Type.cpp +171 -0
- data/test/test_global_functions.cpp +67 -7
- data/test/unittest.cpp +8 -0
- metadata +127 -26
- data/lib/version.rb +0 -3
- data/rice/Address_Registration_Guard_defn.hpp +0 -79
- data/rice/Data_Object_defn.hpp +0 -84
- data/rice/Data_Type_defn.hpp +0 -190
- data/rice/Exception_defn.hpp +0 -68
- data/rice/HandlerRegistration.hpp +0 -15
- data/rice/detail/ExceptionHandler.hpp +0 -8
- data/rice/detail/ExceptionHandler.ipp +0 -28
- data/rice/detail/ExceptionHandler_defn.hpp +0 -77
- data/rice/detail/Jump_Tag.hpp +0 -21
- data/rice/detail/NativeAttribute.hpp +0 -64
- data/rice/detail/NativeAttribute.ipp +0 -112
- data/rice/detail/from_ruby_defn.hpp +0 -38
- data/rice/detail/to_ruby_defn.hpp +0 -48
- data/test/test_Jump_Tag.cpp +0 -17
- data/test/test_Stl_SmartPointer.cpp +0 -283
- data/test/test_To_From_Ruby.cpp +0 -399
data/test/test_Stl_Variant.cpp
CHANGED
@@ -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(
|
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("
|
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("
|
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
|
343
|
+
a reference to a variant in a tuple? */
|
330
344
|
|
331
345
|
#ifdef _MSC_VER
|
332
|
-
TESTCASE(
|
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("
|
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("
|
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
|
+
}
|