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.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  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/Rakefile +5 -4
  8. data/include/rice/rice.hpp +5436 -3201
  9. data/include/rice/stl.hpp +2355 -1269
  10. data/lib/make_rice_headers.rb +79 -0
  11. data/lib/mkmf-rice.rb +4 -0
  12. data/lib/rice/version.rb +3 -0
  13. data/lib/rice.rb +1 -0
  14. data/lib/rubygems/builder.rb +11 -0
  15. data/lib/rubygems/cmake_builder.rb +113 -0
  16. data/lib/rubygems_plugin.rb +9 -0
  17. data/rice/Arg.hpp +7 -1
  18. data/rice/Arg.ipp +11 -2
  19. data/rice/Buffer.hpp +123 -0
  20. data/rice/Buffer.ipp +599 -0
  21. data/rice/Constructor.ipp +3 -3
  22. data/rice/Data_Object.hpp +2 -3
  23. data/rice/Data_Object.ipp +188 -188
  24. data/rice/Data_Type.hpp +4 -5
  25. data/rice/Data_Type.ipp +42 -26
  26. data/rice/Enum.hpp +0 -1
  27. data/rice/Enum.ipp +26 -23
  28. data/rice/Init.hpp +8 -0
  29. data/rice/Init.ipp +8 -0
  30. data/rice/MemoryView.ipp +1 -41
  31. data/rice/Return.hpp +1 -1
  32. data/rice/Return.ipp +6 -0
  33. data/rice/cpp_api/Array.hpp +209 -0
  34. data/rice/cpp_api/Array.ipp +304 -0
  35. data/rice/cpp_api/Builtin_Object.hpp +31 -0
  36. data/rice/cpp_api/Builtin_Object.ipp +37 -0
  37. data/rice/cpp_api/Class.hpp +70 -0
  38. data/rice/cpp_api/Class.ipp +97 -0
  39. data/rice/cpp_api/Encoding.hpp +32 -0
  40. data/rice/cpp_api/Encoding.ipp +59 -0
  41. data/rice/cpp_api/Hash.hpp +194 -0
  42. data/rice/cpp_api/Hash.ipp +257 -0
  43. data/rice/cpp_api/Identifier.hpp +46 -0
  44. data/rice/cpp_api/Identifier.ipp +31 -0
  45. data/rice/cpp_api/Module.hpp +72 -0
  46. data/rice/cpp_api/Module.ipp +101 -0
  47. data/rice/cpp_api/Object.hpp +272 -0
  48. data/rice/cpp_api/Object.ipp +235 -0
  49. data/rice/cpp_api/String.hpp +74 -0
  50. data/rice/cpp_api/String.ipp +120 -0
  51. data/rice/cpp_api/Struct.hpp +113 -0
  52. data/rice/cpp_api/Struct.ipp +92 -0
  53. data/rice/cpp_api/Symbol.hpp +46 -0
  54. data/rice/cpp_api/Symbol.ipp +93 -0
  55. data/rice/cpp_api/shared_methods.hpp +134 -0
  56. data/rice/detail/MethodInfo.hpp +1 -9
  57. data/rice/detail/MethodInfo.ipp +5 -72
  58. data/rice/detail/Native.hpp +3 -2
  59. data/rice/detail/Native.ipp +32 -4
  60. data/rice/detail/NativeAttributeGet.hpp +3 -2
  61. data/rice/detail/NativeAttributeGet.ipp +8 -2
  62. data/rice/detail/NativeAttributeSet.hpp +3 -2
  63. data/rice/detail/NativeAttributeSet.ipp +8 -2
  64. data/rice/detail/NativeCallbackFFI.ipp +1 -1
  65. data/rice/detail/NativeFunction.hpp +17 -6
  66. data/rice/detail/NativeFunction.ipp +168 -64
  67. data/rice/detail/NativeIterator.hpp +3 -2
  68. data/rice/detail/NativeIterator.ipp +8 -2
  69. data/rice/detail/RubyType.hpp +2 -5
  70. data/rice/detail/RubyType.ipp +50 -5
  71. data/rice/detail/Type.hpp +3 -1
  72. data/rice/detail/Type.ipp +61 -31
  73. data/rice/detail/Wrapper.hpp +68 -33
  74. data/rice/detail/Wrapper.ipp +103 -113
  75. data/rice/detail/from_ruby.hpp +5 -4
  76. data/rice/detail/from_ruby.ipp +737 -365
  77. data/rice/detail/to_ruby.ipp +1092 -186
  78. data/rice/global_function.ipp +1 -1
  79. data/rice/libc/file.hpp +11 -0
  80. data/rice/libc/file.ipp +32 -0
  81. data/rice/rice.hpp +23 -16
  82. data/rice/stl/complex.hpp +6 -0
  83. data/rice/stl/complex.ipp +93 -0
  84. data/rice/stl/exception.hpp +11 -0
  85. data/rice/stl/exception.ipp +29 -0
  86. data/rice/stl/exception_ptr.hpp +6 -0
  87. data/rice/stl/exception_ptr.ipp +27 -0
  88. data/rice/stl/map.hpp +12 -0
  89. data/rice/stl/map.ipp +469 -0
  90. data/rice/stl/monostate.hpp +6 -0
  91. data/rice/stl/monostate.ipp +80 -0
  92. data/rice/stl/multimap.hpp +14 -0
  93. data/rice/stl/multimap.ipp +448 -0
  94. data/rice/stl/optional.hpp +6 -0
  95. data/rice/stl/optional.ipp +118 -0
  96. data/rice/stl/pair.hpp +13 -0
  97. data/rice/stl/pair.ipp +155 -0
  98. data/rice/stl/reference_wrapper.hpp +6 -0
  99. data/rice/stl/reference_wrapper.ipp +41 -0
  100. data/rice/stl/set.hpp +12 -0
  101. data/rice/stl/set.ipp +495 -0
  102. data/rice/stl/shared_ptr.hpp +28 -0
  103. data/rice/stl/shared_ptr.ipp +224 -0
  104. data/rice/stl/string.hpp +6 -0
  105. data/rice/stl/string.ipp +158 -0
  106. data/rice/stl/string_view.hpp +6 -0
  107. data/rice/stl/string_view.ipp +65 -0
  108. data/rice/stl/tuple.hpp +6 -0
  109. data/rice/stl/tuple.ipp +128 -0
  110. data/rice/stl/type_index.hpp +6 -0
  111. data/rice/stl/type_index.ipp +30 -0
  112. data/rice/stl/type_info.hpp +6 -0
  113. data/rice/stl/type_info.ipp +29 -0
  114. data/rice/stl/unique_ptr.hpp +22 -0
  115. data/rice/stl/unique_ptr.ipp +139 -0
  116. data/rice/stl/unordered_map.hpp +12 -0
  117. data/rice/stl/unordered_map.ipp +469 -0
  118. data/rice/stl/variant.hpp +6 -0
  119. data/rice/stl/variant.ipp +242 -0
  120. data/rice/stl/vector.hpp +12 -0
  121. data/rice/stl/vector.ipp +590 -0
  122. data/rice/stl.hpp +7 -3
  123. data/rice/traits/attribute_traits.hpp +26 -0
  124. data/rice/traits/function_traits.hpp +95 -0
  125. data/rice/traits/method_traits.hpp +47 -0
  126. data/rice/traits/rice_traits.hpp +160 -0
  127. data/rice.gemspec +85 -0
  128. data/test/embed_ruby.cpp +3 -0
  129. data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
  130. data/test/test_Array.cpp +6 -3
  131. data/test/test_Attribute.cpp +34 -1
  132. data/test/test_Buffer.cpp +285 -0
  133. data/test/test_Callback.cpp +2 -3
  134. data/test/test_Data_Object.cpp +88 -34
  135. data/test/test_Data_Type.cpp +106 -65
  136. data/test/test_Director.cpp +7 -3
  137. data/test/test_Enum.cpp +5 -2
  138. data/test/test_File.cpp +1 -1
  139. data/test/test_From_Ruby.cpp +181 -114
  140. data/test/test_Iterator.cpp +1 -1
  141. data/test/{test_JumpException.cpp → test_Jump_Exception.cpp} +1 -0
  142. data/test/test_Keep_Alive.cpp +7 -18
  143. data/test/test_Keep_Alive_No_Wrapper.cpp +0 -1
  144. data/test/test_Module.cpp +13 -6
  145. data/test/test_Native_Registry.cpp +0 -1
  146. data/test/test_Overloads.cpp +180 -5
  147. data/test/test_Ownership.cpp +100 -57
  148. data/test/test_Proc.cpp +0 -1
  149. data/test/test_Self.cpp +4 -4
  150. data/test/test_Stl_Map.cpp +37 -39
  151. data/test/test_Stl_Multimap.cpp +693 -0
  152. data/test/test_Stl_Pair.cpp +8 -8
  153. data/test/test_Stl_Reference_Wrapper.cpp +4 -2
  154. data/test/test_Stl_Set.cpp +790 -0
  155. data/test/{test_Stl_SmartPointer.cpp → test_Stl_SharedPtr.cpp} +97 -127
  156. data/test/test_Stl_Tuple.cpp +116 -0
  157. data/test/test_Stl_Type.cpp +1 -1
  158. data/test/test_Stl_UniquePtr.cpp +202 -0
  159. data/test/test_Stl_Unordered_Map.cpp +28 -34
  160. data/test/test_Stl_Variant.cpp +217 -89
  161. data/test/test_Stl_Vector.cpp +209 -83
  162. data/test/test_To_Ruby.cpp +373 -1
  163. data/test/test_Type.cpp +85 -14
  164. data/test/test_global_functions.cpp +17 -4
  165. metadata +94 -10
  166. 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(SmartPointer);
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(SmartPointer)
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<int(Sink::*)(std::unique_ptr<MyClass>&, MyClass*)>("update_pointer", &Sink::updatePointer,
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(SmartPointer)
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(UniquePtrRefParameter)
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(SharedPtrRefParameter)
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(SharedPtrDefaultParameter)
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(SharedPtrRefDefaultParameter)
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
- // ASSERT_EQUAL(1, MyClass::destructorCalls);
302
+ ASSERT_EQUAL(1, MyClass::destructorCalls);
372
303
  }
373
304
 
374
- TESTCASE(UniquePtrRoundTrip)
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.transfer
384
- my_class.set_flag(5)
314
+ my_class = factory.share
385
315
 
386
316
  sink = Sink.new
387
- sink.take_ownership(my_class))";
317
+ sink.share_ownership(my_class))";
388
318
 
389
319
  Object result = m.instance_eval(code);
390
- ASSERT_EQUAL(5, detail::From_Ruby<int>().convert(result.value()));
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
- // ASSERT_EQUAL(1, MyClass::destructorCalls);
325
+ ASSERT_EQUAL(1, MyClass::destructorCalls);
396
326
  }
397
327
 
398
- TESTCASE(UniquePtrUpdate)
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.transfer
408
- my_class1.set_flag(5)
409
-
337
+ my_class1 = factory.share
338
+ my_class1.set_flag(7)
339
+
410
340
  my_class2 = MyClass.new
411
- my_class2.set_flag(11)
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(11, detail::From_Ruby<long>().convert(result.value()));
347
+ ASSERT_EQUAL(14, detail::From_Ruby<long>().convert(result.value()));
418
348
  }
419
349
 
420
- TESTCASE(SharedPtrRoundTrip)
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"(factory = Factory.new
429
- my_class = factory.share
430
-
360
+ std::string code = R"(my_class = MyClass.new
361
+ my_class.set_flag(9)
431
362
  sink = Sink.new
432
- sink.share_ownership(my_class))";
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(3, detail::From_Ruby<long>().convert(result.value()));
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(0, MyClass::destructorCalls);
374
+ // ASSERT_EQUAL(1, MyClass::destructorCalls);
441
375
  }
442
376
 
443
- TESTCASE(SharedPtrUpdate)
377
+ namespace
444
378
  {
445
- MyClass::reset();
446
- Factory::reset();
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
- Module m = define_module("TestingModule");
386
+ int getPointerValue(std::shared_ptr<int> ptr)
387
+ {
388
+ return *ptr;
389
+ }
449
390
 
450
- // Create ruby objects that point to the same instance of MyClass
451
- std::string code = R"(factory = Factory.new
452
- my_class1 = factory.share
453
- my_class1.set_flag(7)
391
+ int updatePointerValue(std::shared_ptr<int> ptr)
392
+ {
393
+ *ptr = *ptr + 1;
394
+ return *ptr;
395
+ }
396
+ }
454
397
 
455
- my_class2 = MyClass.new
456
- my_class2.set_flag(14)
398
+ TESTCASE(PointerToInt)
399
+ {
400
+ detail::Type<Buffer<int>>::verify();
457
401
 
458
- sink = Sink.new
459
- sink.update_pointer(my_class1, my_class2))";
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(14, detail::From_Ruby<long>().convert(result.value()));
410
+ ASSERT_EQUAL(44, detail::From_Ruby<int>().convert(result.value()));
463
411
  }
464
412
 
465
- TESTCASE(SharedPtrVoid)
413
+ TESTCASE(CreatePointerToInt)
466
414
  {
467
- MyClass::reset();
468
- Factory::reset();
415
+ Module m = define_module("CreatePointerToInt").
416
+ define_module_function("get_pointer_value", &getPointerValue);
469
417
 
470
- Module m = define_module("TestingModule");
418
+ define_shared_ptr<int>("SharedPtrInt");
471
419
 
472
- // Create ruby objects that point to the same instance of MyClass
473
- std::string code = R"(my_class = MyClass.new
474
- my_class.set_flag(9)
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(9, detail::From_Ruby<long>().convert(result.value()));
425
+ ASSERT_EQUAL(45, detail::From_Ruby<int>().convert(result.value()));
426
+ }
481
427
 
482
- rb_gc_start();
428
+ TESTCASE(UpdatePointerToInt)
429
+ {
430
+ Module m = define_module("UpdatePointerToInt").
431
+ define_module_function("update_pointer_value", &updatePointerValue);
483
432
 
484
- ASSERT_EQUAL(1, MyClass::constructorCalls);
485
- ASSERT_EQUAL(0, MyClass::copyConstructorCalls);
486
- ASSERT_EQUAL(0, MyClass::moveConstructorCalls);
487
- // ASSERT_EQUAL(1, MyClass::destructorCalls);
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
+ }
@@ -97,7 +97,7 @@ TESTCASE(TypeIndexCreate)
97
97
 
98
98
  std::string code = R"(int = 5
99
99
  type_info = get_type_info(5)
100
- Rice::Std::TypeIndex.new(type_info))";
100
+ Std::TypeIndex.new(type_info))";
101
101
 
102
102
  #ifdef _MSC_VER
103
103
  const char* expected = "int";