rice 4.5.0 → 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 +23 -0
- data/CMakeLists.txt +31 -0
- data/CMakePresets.json +75 -0
- data/COPYING +3 -2
- data/FindRuby.cmake +437 -0
- data/Rakefile +5 -4
- data/include/rice/rice.hpp +5436 -3201
- data/include/rice/stl.hpp +2355 -1269
- data/lib/make_rice_headers.rb +79 -0
- data/lib/mkmf-rice.rb +4 -0
- 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/Arg.hpp +7 -1
- data/rice/Arg.ipp +11 -2
- data/rice/Buffer.hpp +123 -0
- data/rice/Buffer.ipp +599 -0
- data/rice/Constructor.ipp +3 -3
- data/rice/Data_Object.hpp +2 -3
- data/rice/Data_Object.ipp +188 -188
- data/rice/Data_Type.hpp +4 -5
- data/rice/Data_Type.ipp +42 -26
- data/rice/Enum.hpp +0 -1
- data/rice/Enum.ipp +26 -23
- data/rice/Init.hpp +8 -0
- data/rice/Init.ipp +8 -0
- data/rice/MemoryView.ipp +1 -41
- data/rice/Return.hpp +1 -1
- data/rice/Return.ipp +6 -0
- 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/cpp_api/Identifier.hpp +46 -0
- data/rice/cpp_api/Identifier.ipp +31 -0
- 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/MethodInfo.hpp +1 -9
- data/rice/detail/MethodInfo.ipp +5 -72
- data/rice/detail/Native.hpp +3 -2
- data/rice/detail/Native.ipp +32 -4
- data/rice/detail/NativeAttributeGet.hpp +3 -2
- data/rice/detail/NativeAttributeGet.ipp +8 -2
- data/rice/detail/NativeAttributeSet.hpp +3 -2
- data/rice/detail/NativeAttributeSet.ipp +8 -2
- data/rice/detail/NativeCallbackFFI.ipp +1 -1
- data/rice/detail/NativeFunction.hpp +17 -6
- data/rice/detail/NativeFunction.ipp +168 -64
- data/rice/detail/NativeIterator.hpp +3 -2
- data/rice/detail/NativeIterator.ipp +8 -2
- data/rice/detail/RubyType.hpp +2 -5
- data/rice/detail/RubyType.ipp +50 -5
- data/rice/detail/Type.hpp +3 -1
- data/rice/detail/Type.ipp +61 -31
- data/rice/detail/Wrapper.hpp +68 -33
- data/rice/detail/Wrapper.ipp +103 -113
- data/rice/detail/from_ruby.hpp +5 -4
- data/rice/detail/from_ruby.ipp +737 -365
- data/rice/detail/to_ruby.ipp +1092 -186
- data/rice/global_function.ipp +1 -1
- data/rice/libc/file.hpp +11 -0
- data/rice/libc/file.ipp +32 -0
- data/rice/rice.hpp +23 -16
- 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 +7 -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 +3 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
- data/test/test_Array.cpp +6 -3
- data/test/test_Attribute.cpp +34 -1
- data/test/test_Buffer.cpp +285 -0
- data/test/test_Callback.cpp +2 -3
- data/test/test_Data_Object.cpp +88 -34
- data/test/test_Data_Type.cpp +106 -65
- data/test/test_Director.cpp +7 -3
- data/test/test_Enum.cpp +5 -2
- data/test/test_File.cpp +1 -1
- data/test/test_From_Ruby.cpp +181 -114
- data/test/test_Iterator.cpp +1 -1
- data/test/{test_JumpException.cpp → test_Jump_Exception.cpp} +1 -0
- data/test/test_Keep_Alive.cpp +7 -18
- data/test/test_Keep_Alive_No_Wrapper.cpp +0 -1
- data/test/test_Module.cpp +13 -6
- data/test/test_Native_Registry.cpp +0 -1
- data/test/test_Overloads.cpp +180 -5
- data/test/test_Ownership.cpp +100 -57
- data/test/test_Proc.cpp +0 -1
- data/test/test_Self.cpp +4 -4
- data/test/test_Stl_Map.cpp +37 -39
- data/test/test_Stl_Multimap.cpp +693 -0
- data/test/test_Stl_Pair.cpp +8 -8
- data/test/test_Stl_Reference_Wrapper.cpp +4 -2
- data/test/test_Stl_Set.cpp +790 -0
- data/test/{test_Stl_SmartPointer.cpp → test_Stl_SharedPtr.cpp} +97 -127
- data/test/test_Stl_Tuple.cpp +116 -0
- data/test/test_Stl_Type.cpp +1 -1
- data/test/test_Stl_UniquePtr.cpp +202 -0
- data/test/test_Stl_Unordered_Map.cpp +28 -34
- data/test/test_Stl_Variant.cpp +217 -89
- data/test/test_Stl_Vector.cpp +209 -83
- data/test/test_To_Ruby.cpp +373 -1
- data/test/test_Type.cpp +85 -14
- data/test/test_global_functions.cpp +17 -4
- metadata +94 -10
- data/rice/detail/TupleIterator.hpp +0 -14
@@ -1,4 +1,4 @@
|
|
1
|
-
#include "unittest.hpp"
|
1
|
+
#include "unittest.hpp"
|
2
2
|
#include "embed_ruby.hpp"
|
3
3
|
#include <rice/rice.hpp>
|
4
4
|
#include <rice/stl.hpp>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
using namespace Rice;
|
9
9
|
|
10
|
-
TESTSUITE(
|
10
|
+
TESTSUITE(SharedPtr);
|
11
11
|
|
12
12
|
namespace
|
13
13
|
{
|
@@ -69,11 +69,6 @@ namespace
|
|
69
69
|
{
|
70
70
|
}
|
71
71
|
|
72
|
-
std::unique_ptr<MyClass> transfer()
|
73
|
-
{
|
74
|
-
return std::make_unique<MyClass>();
|
75
|
-
}
|
76
|
-
|
77
72
|
std::shared_ptr<MyClass> share()
|
78
73
|
{
|
79
74
|
if (!instance_)
|
@@ -99,22 +94,11 @@ namespace
|
|
99
94
|
class Sink
|
100
95
|
{
|
101
96
|
public:
|
102
|
-
int takeOwnership(std::unique_ptr<MyClass> ptr)
|
103
|
-
{
|
104
|
-
return ptr->flag;
|
105
|
-
}
|
106
|
-
|
107
97
|
long shareOwnership(std::shared_ptr<MyClass> ptr)
|
108
98
|
{
|
109
99
|
return ptr.use_count();
|
110
100
|
}
|
111
101
|
|
112
|
-
int updatePointer(std::unique_ptr<MyClass>& ptr, MyClass* myClass)
|
113
|
-
{
|
114
|
-
ptr.reset(myClass);
|
115
|
-
return ptr->flag;
|
116
|
-
}
|
117
|
-
|
118
102
|
int updatePointer(std::shared_ptr<MyClass>& ptr, MyClass* myClass)
|
119
103
|
{
|
120
104
|
ptr.reset(myClass);
|
@@ -133,11 +117,6 @@ namespace
|
|
133
117
|
}
|
134
118
|
};
|
135
119
|
|
136
|
-
int extractFlagUniquePtrRef(std::unique_ptr<MyClass>& myClass)
|
137
|
-
{
|
138
|
-
return myClass->flag;
|
139
|
-
}
|
140
|
-
|
141
120
|
int extractFlagSharedPtr(std::shared_ptr<MyClass> myClass)
|
142
121
|
{
|
143
122
|
return myClass->flag;
|
@@ -149,7 +128,7 @@ namespace
|
|
149
128
|
}
|
150
129
|
}
|
151
130
|
|
152
|
-
SETUP(
|
131
|
+
SETUP(SharedPtr)
|
153
132
|
{
|
154
133
|
embed_ruby();
|
155
134
|
|
@@ -163,26 +142,18 @@ SETUP(SmartPointer)
|
|
163
142
|
|
164
143
|
define_class<Factory>("Factory").
|
165
144
|
define_constructor(Constructor<Factory>()).
|
166
|
-
define_method("transfer", &Factory::transfer).
|
167
145
|
define_method("share", &Factory::share).
|
168
146
|
define_method("share_ref", &Factory::share_ref);
|
169
147
|
|
170
148
|
define_class<Sink>("Sink").
|
171
149
|
define_constructor(Constructor<Sink>()).
|
172
|
-
define_method("take_ownership", &Sink::takeOwnership).
|
173
150
|
define_method("share_ownership", &Sink::shareOwnership).
|
174
|
-
define_method
|
175
|
-
Arg("ptr"), Arg("myClass").takeOwnership()).
|
176
|
-
define_method<int(Sink::*)(std::shared_ptr<MyClass>&, MyClass*)>("update_pointer", &Sink::updatePointer,
|
151
|
+
define_method("update_pointer", &Sink::updatePointer,
|
177
152
|
Arg("ptr"), Arg("myClass").takeOwnership()).
|
178
153
|
define_method("make_void_shared", &Sink::makeVoidShared,
|
179
154
|
Arg("myClass").takeOwnership()).
|
180
155
|
define_method<int(Sink::*)(std::shared_ptr<void>&)>("handle_void", &Sink::handleVoid);
|
181
156
|
|
182
|
-
// Needed for shared_ptr<void>
|
183
|
-
define_class<void>("Void");
|
184
|
-
|
185
|
-
define_global_function("extract_flag_unique_ptr_ref", &extractFlagUniquePtrRef);
|
186
157
|
define_global_function("extract_flag_shared_ptr", &extractFlagSharedPtr);
|
187
158
|
define_global_function("extract_flag_shared_ptr_ref", &extractFlagSharedPtrRef);
|
188
159
|
|
@@ -192,7 +163,7 @@ SETUP(SmartPointer)
|
|
192
163
|
Arg("myClass") = std::make_shared<MyClass>());
|
193
164
|
}
|
194
165
|
|
195
|
-
TEARDOWN(
|
166
|
+
TEARDOWN(SharedPtr)
|
196
167
|
{
|
197
168
|
rb_gc_start();
|
198
169
|
#if RUBY_API_VERSION_MAJOR == 3 && RUBY_API_VERSION_MINOR >= 2
|
@@ -200,30 +171,6 @@ TEARDOWN(SmartPointer)
|
|
200
171
|
#endif
|
201
172
|
}
|
202
173
|
|
203
|
-
TESTCASE(takeOwnership)
|
204
|
-
{
|
205
|
-
MyClass::reset();
|
206
|
-
Factory::reset();
|
207
|
-
|
208
|
-
Module m = define_module("TestingModule");
|
209
|
-
|
210
|
-
std::string code = R"(factory = Factory.new
|
211
|
-
10.times do |i|
|
212
|
-
my_class = factory.transfer
|
213
|
-
my_class.set_flag(i)
|
214
|
-
my_class = nil
|
215
|
-
end)";
|
216
|
-
|
217
|
-
m.module_eval(code);
|
218
|
-
rb_gc_start();
|
219
|
-
|
220
|
-
ASSERT_EQUAL(10, MyClass::constructorCalls);
|
221
|
-
ASSERT_EQUAL(0, MyClass::copyConstructorCalls);
|
222
|
-
ASSERT_EQUAL(0, MyClass::moveConstructorCalls);
|
223
|
-
ASSERT_EQUAL(10, MyClass::destructorCalls);
|
224
|
-
ASSERT(!Factory::instance_);
|
225
|
-
}
|
226
|
-
|
227
174
|
TESTCASE(ShareOwnership)
|
228
175
|
{
|
229
176
|
MyClass::reset();
|
@@ -282,23 +229,7 @@ TESTCASE(ShareOwnership2)
|
|
282
229
|
ASSERT_EQUAL(2, Factory::instance_.use_count());
|
283
230
|
}
|
284
231
|
|
285
|
-
TESTCASE(
|
286
|
-
{
|
287
|
-
MyClass::reset();
|
288
|
-
Factory::reset();
|
289
|
-
|
290
|
-
Module m = define_module("TestingModule");
|
291
|
-
|
292
|
-
std::string code = R"(factory = Factory.new
|
293
|
-
my_class = factory.transfer
|
294
|
-
my_class.set_flag(7)
|
295
|
-
extract_flag_unique_ptr_ref(my_class))";
|
296
|
-
|
297
|
-
Object result = m.module_eval(code);
|
298
|
-
ASSERT_EQUAL(7, detail::From_Ruby<int>().convert(result));
|
299
|
-
}
|
300
|
-
|
301
|
-
TESTCASE(SharedPtrParameter)
|
232
|
+
TESTCASE(PtrParameter)
|
302
233
|
{
|
303
234
|
MyClass::reset();
|
304
235
|
Factory::reset();
|
@@ -314,7 +245,7 @@ TESTCASE(SharedPtrParameter)
|
|
314
245
|
ASSERT_EQUAL(8, detail::From_Ruby<int>().convert(result));
|
315
246
|
}
|
316
247
|
|
317
|
-
TESTCASE(
|
248
|
+
TESTCASE(RefParameter)
|
318
249
|
{
|
319
250
|
MyClass::reset();
|
320
251
|
Factory::reset();
|
@@ -330,7 +261,7 @@ TESTCASE(SharedPtrRefParameter)
|
|
330
261
|
ASSERT_EQUAL(9, detail::From_Ruby<int>().convert(result));
|
331
262
|
}
|
332
263
|
|
333
|
-
TESTCASE(
|
264
|
+
TESTCASE(DefaultParameter)
|
334
265
|
{
|
335
266
|
MyClass::reset();
|
336
267
|
Factory::reset();
|
@@ -347,7 +278,7 @@ TESTCASE(SharedPtrDefaultParameter)
|
|
347
278
|
ASSERT_EQUAL(0, detail::From_Ruby<int>().convert(result));
|
348
279
|
}
|
349
280
|
|
350
|
-
TESTCASE(
|
281
|
+
TESTCASE(RefDefaultParameter)
|
351
282
|
{
|
352
283
|
MyClass::reset();
|
353
284
|
Factory::reset();
|
@@ -368,10 +299,10 @@ TESTCASE(SharedPtrRefDefaultParameter)
|
|
368
299
|
ASSERT_EQUAL(1, MyClass::constructorCalls);
|
369
300
|
ASSERT_EQUAL(0, MyClass::copyConstructorCalls);
|
370
301
|
ASSERT_EQUAL(0, MyClass::moveConstructorCalls);
|
371
|
-
|
302
|
+
ASSERT_EQUAL(1, MyClass::destructorCalls);
|
372
303
|
}
|
373
304
|
|
374
|
-
TESTCASE(
|
305
|
+
TESTCASE(RoundTrip)
|
375
306
|
{
|
376
307
|
MyClass::reset();
|
377
308
|
Factory::reset();
|
@@ -380,22 +311,21 @@ TESTCASE(UniquePtrRoundTrip)
|
|
380
311
|
|
381
312
|
// Create ruby objects that point to the same instance of MyClass
|
382
313
|
std::string code = R"(factory = Factory.new
|
383
|
-
my_class = factory.
|
384
|
-
my_class.set_flag(5)
|
314
|
+
my_class = factory.share
|
385
315
|
|
386
316
|
sink = Sink.new
|
387
|
-
sink.
|
317
|
+
sink.share_ownership(my_class))";
|
388
318
|
|
389
319
|
Object result = m.instance_eval(code);
|
390
|
-
ASSERT_EQUAL(
|
320
|
+
ASSERT_EQUAL(3, detail::From_Ruby<long>().convert(result.value()));
|
391
321
|
|
392
322
|
ASSERT_EQUAL(1, MyClass::constructorCalls);
|
393
323
|
ASSERT_EQUAL(0, MyClass::copyConstructorCalls);
|
394
324
|
ASSERT_EQUAL(0, MyClass::moveConstructorCalls);
|
395
|
-
|
325
|
+
ASSERT_EQUAL(1, MyClass::destructorCalls);
|
396
326
|
}
|
397
327
|
|
398
|
-
TESTCASE(
|
328
|
+
TESTCASE(Update)
|
399
329
|
{
|
400
330
|
MyClass::reset();
|
401
331
|
Factory::reset();
|
@@ -404,85 +334,125 @@ TESTCASE(UniquePtrUpdate)
|
|
404
334
|
|
405
335
|
// Create ruby objects that point to the same instance of MyClass
|
406
336
|
std::string code = R"(factory = Factory.new
|
407
|
-
my_class1 = factory.
|
408
|
-
my_class1.set_flag(
|
409
|
-
|
337
|
+
my_class1 = factory.share
|
338
|
+
my_class1.set_flag(7)
|
339
|
+
|
410
340
|
my_class2 = MyClass.new
|
411
|
-
my_class2.set_flag(
|
341
|
+
my_class2.set_flag(14)
|
412
342
|
|
413
343
|
sink = Sink.new
|
414
344
|
sink.update_pointer(my_class1, my_class2))";
|
415
345
|
|
416
346
|
Object result = m.instance_eval(code);
|
417
|
-
ASSERT_EQUAL(
|
347
|
+
ASSERT_EQUAL(14, detail::From_Ruby<long>().convert(result.value()));
|
418
348
|
}
|
419
349
|
|
420
|
-
TESTCASE(
|
350
|
+
TESTCASE(Void)
|
421
351
|
{
|
422
352
|
MyClass::reset();
|
423
353
|
Factory::reset();
|
424
354
|
|
355
|
+
detail::Type<Buffer<void>>::verify();
|
356
|
+
|
425
357
|
Module m = define_module("TestingModule");
|
426
358
|
|
427
359
|
// Create ruby objects that point to the same instance of MyClass
|
428
|
-
std::string code = R"(
|
429
|
-
my_class
|
430
|
-
|
360
|
+
std::string code = R"(my_class = MyClass.new
|
361
|
+
my_class.set_flag(9)
|
431
362
|
sink = Sink.new
|
432
|
-
sink.
|
363
|
+
void_ptr = sink.make_void_shared(my_class)
|
364
|
+
sink.handle_void(void_ptr))";
|
433
365
|
|
434
366
|
Object result = m.instance_eval(code);
|
435
|
-
ASSERT_EQUAL(
|
367
|
+
ASSERT_EQUAL(9, detail::From_Ruby<long>().convert(result.value()));
|
368
|
+
|
369
|
+
rb_gc_start();
|
436
370
|
|
437
371
|
ASSERT_EQUAL(1, MyClass::constructorCalls);
|
438
372
|
ASSERT_EQUAL(0, MyClass::copyConstructorCalls);
|
439
373
|
ASSERT_EQUAL(0, MyClass::moveConstructorCalls);
|
440
|
-
// ASSERT_EQUAL(
|
374
|
+
// ASSERT_EQUAL(1, MyClass::destructorCalls);
|
441
375
|
}
|
442
376
|
|
443
|
-
|
377
|
+
namespace
|
444
378
|
{
|
445
|
-
|
446
|
-
|
379
|
+
std::shared_ptr<int> createPointer(int value)
|
380
|
+
{
|
381
|
+
int* sharedInt = new int(value);
|
382
|
+
std::shared_ptr<int> shared(sharedInt);
|
383
|
+
return shared;
|
384
|
+
}
|
447
385
|
|
448
|
-
|
386
|
+
int getPointerValue(std::shared_ptr<int> ptr)
|
387
|
+
{
|
388
|
+
return *ptr;
|
389
|
+
}
|
449
390
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
391
|
+
int updatePointerValue(std::shared_ptr<int> ptr)
|
392
|
+
{
|
393
|
+
*ptr = *ptr + 1;
|
394
|
+
return *ptr;
|
395
|
+
}
|
396
|
+
}
|
454
397
|
|
455
|
-
|
456
|
-
|
398
|
+
TESTCASE(PointerToInt)
|
399
|
+
{
|
400
|
+
detail::Type<Buffer<int>>::verify();
|
457
401
|
|
458
|
-
|
459
|
-
|
402
|
+
Module m = define_module("SharedPtrInt").
|
403
|
+
define_module_function("create_pointer", &createPointer).
|
404
|
+
define_module_function("get_pointer_value", &getPointerValue);
|
405
|
+
|
406
|
+
std::string code = R"(ptr = create_pointer(44)
|
407
|
+
get_pointer_value(ptr))";
|
460
408
|
|
461
409
|
Object result = m.instance_eval(code);
|
462
|
-
ASSERT_EQUAL(
|
410
|
+
ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(result.value()));
|
463
411
|
}
|
464
412
|
|
465
|
-
TESTCASE(
|
413
|
+
TESTCASE(CreatePointerToInt)
|
466
414
|
{
|
467
|
-
|
468
|
-
|
415
|
+
Module m = define_module("CreatePointerToInt").
|
416
|
+
define_module_function("get_pointer_value", &getPointerValue);
|
469
417
|
|
470
|
-
|
418
|
+
define_shared_ptr<int>("SharedPtrInt");
|
471
419
|
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
sink = Sink.new
|
476
|
-
void_ptr = sink.make_void_shared(my_class)
|
477
|
-
sink.handle_void(void_ptr))";
|
420
|
+
std::string code = R"(buffer = Rice::Buffer≺int≻.new(45)
|
421
|
+
ptr = Std::SharedPtrInt.new(buffer)
|
422
|
+
get_pointer_value(ptr))";
|
478
423
|
|
479
424
|
Object result = m.instance_eval(code);
|
480
|
-
ASSERT_EQUAL(
|
425
|
+
ASSERT_EQUAL(45, detail::From_Ruby<int>().convert(result.value()));
|
426
|
+
}
|
481
427
|
|
482
|
-
|
428
|
+
TESTCASE(UpdatePointerToInt)
|
429
|
+
{
|
430
|
+
Module m = define_module("UpdatePointerToInt").
|
431
|
+
define_module_function("update_pointer_value", &updatePointerValue);
|
483
432
|
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
433
|
+
define_shared_ptr<int>();
|
434
|
+
|
435
|
+
std::string code = R"(buffer = Rice::Buffer≺int≻.new(45)
|
436
|
+
ptr = Std::SharedPtr≺int≻.new(buffer)
|
437
|
+
update_pointer_value(ptr))";
|
438
|
+
|
439
|
+
Object result = m.instance_eval(code);
|
440
|
+
ASSERT_EQUAL(46, detail::From_Ruby<int>().convert(result.value()));
|
488
441
|
}
|
442
|
+
|
443
|
+
TESTCASE(ReadPointerToInt)
|
444
|
+
{
|
445
|
+
detail::Type<Buffer<int>>::verify();
|
446
|
+
|
447
|
+
Module m = define_module("ReadPointerToInt").
|
448
|
+
define_module_function("create_pointer", &createPointer);
|
449
|
+
|
450
|
+
std::string code = R"(ptr = create_pointer(50)
|
451
|
+
buffer = Rice::Buffer≺int≻.new(ptr)
|
452
|
+
buffer.to_ary(1))";
|
453
|
+
|
454
|
+
Array array = m.instance_eval(code);
|
455
|
+
std::vector<int> actual = array.to_vector<int>();
|
456
|
+
std::vector<int> expected { 50 };
|
457
|
+
ASSERT_EQUAL(expected, actual);
|
458
|
+
}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#include "unittest.hpp"
|
2
|
+
#include "embed_ruby.hpp"
|
3
|
+
#include <rice/rice.hpp>
|
4
|
+
#include <rice/stl.hpp>
|
5
|
+
|
6
|
+
#include <tuple>
|
7
|
+
#include <complex>
|
8
|
+
|
9
|
+
using namespace Rice;
|
10
|
+
using namespace std::complex_literals;
|
11
|
+
|
12
|
+
TESTSUITE(Tuple);
|
13
|
+
|
14
|
+
SETUP(Tuple)
|
15
|
+
{
|
16
|
+
embed_ruby();
|
17
|
+
}
|
18
|
+
|
19
|
+
TEARDOWN(Tuple)
|
20
|
+
{
|
21
|
+
rb_gc_start();
|
22
|
+
}
|
23
|
+
|
24
|
+
namespace
|
25
|
+
{
|
26
|
+
/*inline std::ostream& operator<<(std::ostream& stream, Tuple_T const& tuple)
|
27
|
+
{
|
28
|
+
stream << "Tuple(" << "index: " << tuple.index() << ")";
|
29
|
+
return stream;
|
30
|
+
}*/
|
31
|
+
|
32
|
+
class MyTupleClass
|
33
|
+
{
|
34
|
+
public:
|
35
|
+
using Tuple_T = std::tuple<std::string,
|
36
|
+
std::complex<double>,
|
37
|
+
std::vector<int>,
|
38
|
+
double,
|
39
|
+
bool,
|
40
|
+
int>;
|
41
|
+
|
42
|
+
Tuple_T someTuple()
|
43
|
+
{
|
44
|
+
Tuple_T result{ "Hello", 1i, std::vector<int>{1, 2, 3}, 3.3, true, 5 };
|
45
|
+
return result;
|
46
|
+
}
|
47
|
+
|
48
|
+
bool validateTuple(Tuple_T tuple)
|
49
|
+
{
|
50
|
+
ASSERT_EQUAL("Ruby", std::get<0>(tuple).c_str());
|
51
|
+
|
52
|
+
std::complex<double> complex = std::get<1>(tuple);
|
53
|
+
ASSERT_EQUAL(2, complex.real());
|
54
|
+
ASSERT_EQUAL(3, complex.imag());
|
55
|
+
|
56
|
+
std::vector<int> vec = std::get<2>(tuple);
|
57
|
+
ASSERT_EQUAL(3, vec.size());
|
58
|
+
ASSERT_EQUAL(3, vec[0]);
|
59
|
+
ASSERT_EQUAL(4, vec[1]);
|
60
|
+
ASSERT_EQUAL(5, vec[2]);
|
61
|
+
|
62
|
+
|
63
|
+
ASSERT_EQUAL(4.4, std::get<3>(tuple));
|
64
|
+
ASSERT_EQUAL(false, std::get<4>(tuple));
|
65
|
+
ASSERT_EQUAL(9, std::get<5>(tuple));
|
66
|
+
|
67
|
+
return true;
|
68
|
+
}
|
69
|
+
};
|
70
|
+
}
|
71
|
+
|
72
|
+
Data_Type<MyTupleClass> defineMyTupleClass()
|
73
|
+
{
|
74
|
+
return define_class<MyTupleClass>("MyTupleClass").
|
75
|
+
define_constructor(Constructor<MyTupleClass>()).
|
76
|
+
define_method("some_tuple", &MyTupleClass::someTuple).
|
77
|
+
define_method("validate_tuple", &MyTupleClass::validateTuple);
|
78
|
+
}
|
79
|
+
|
80
|
+
TESTCASE(TupleToRuby)
|
81
|
+
{
|
82
|
+
Data_Type<MyTupleClass> klass = defineMyTupleClass();
|
83
|
+
|
84
|
+
Module m = define_module("TupleTesting");
|
85
|
+
|
86
|
+
std::string code = R"(my_class = MyTupleClass.new
|
87
|
+
my_class.some_tuple)";
|
88
|
+
|
89
|
+
Array result = m.module_eval(code);
|
90
|
+
|
91
|
+
ASSERT_EQUAL(6, result.size());
|
92
|
+
|
93
|
+
ASSERT_EQUAL("Hello", detail::From_Ruby<std::string>().convert(result[0].value()).c_str());
|
94
|
+
ASSERT_EQUAL(1i, detail::From_Ruby<std::complex<double>>().convert(result[1].value()));
|
95
|
+
|
96
|
+
std::vector<int> converted = detail::From_Ruby<std::vector<int>>().convert(result[2].value());
|
97
|
+
ASSERT_EQUAL(3, converted.size());
|
98
|
+
|
99
|
+
ASSERT_EQUAL(3.3, detail::From_Ruby<double>().convert(result[3].value()));
|
100
|
+
ASSERT_EQUAL(Qtrue, result[4].value());
|
101
|
+
ASSERT_EQUAL(5, detail::From_Ruby<int>().convert(result[5].value()));
|
102
|
+
}
|
103
|
+
|
104
|
+
TESTCASE(TupleFromRuby)
|
105
|
+
{
|
106
|
+
Data_Type<MyTupleClass> klass = defineMyTupleClass();
|
107
|
+
|
108
|
+
Module m = define_module("TupleTesting");
|
109
|
+
|
110
|
+
std::string code = R"(my_class = MyTupleClass.new
|
111
|
+
array = ["Ruby", Complex(2, 3), [3, 4, 5], 4.4, false, 9]
|
112
|
+
my_class.validate_tuple(array))";
|
113
|
+
|
114
|
+
Object result = m.module_eval(code);
|
115
|
+
ASSERT_EQUAL(Qtrue, result.value());
|
116
|
+
}
|
data/test/test_Stl_Type.cpp
CHANGED