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 <complex>
1
+ #include <complex>
2
2
 
3
3
  #include "unittest.hpp"
4
4
  #include "embed_ruby.hpp"
@@ -45,9 +45,9 @@ TESTCASE(StringVector)
45
45
  {
46
46
  Module m = define_module("Testing");
47
47
 
48
- Class c = define_vector<std::vector<std::string>>("StringVector");
48
+ Class c = define_vector<std::string>("StringVector");
49
49
 
50
- Object vec = m.module_eval("$vector = StringVector.new");
50
+ Object vec = m.module_eval("$vector = Std::StringVector.new");
51
51
  Object result = vec.call("size");
52
52
  ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
53
53
 
@@ -66,13 +66,64 @@ TESTCASE(StringVector)
66
66
  ASSERT_EQUAL("four", detail::From_Ruby<std::string>().convert(result));
67
67
  }
68
68
 
69
- TESTCASE(WrongType)
69
+ TESTCASE(Constructors)
70
70
  {
71
71
  Module m = define_module("Testing");
72
72
 
73
- Class c = define_vector<std::vector<std::string>>("StringVector");
73
+ Class c = define_vector<int>("IntVector");
74
74
 
75
- Object vec = m.module_eval("$vector = StringVector.new");
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)
121
+ {
122
+ Module m = define_module("Testing");
123
+
124
+ Class c = define_vector<std::string>("StringVector");
125
+
126
+ Object vec = m.module_eval("$vector = Std::StringVector.new");
76
127
  ASSERT_EXCEPTION_CHECK(
77
128
  Exception,
78
129
  m.module_eval("$vector << 1"),
@@ -83,7 +134,7 @@ TESTCASE(Empty)
83
134
  {
84
135
  Module m = define_module("Testing");
85
136
 
86
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
137
+ Class c = define_vector<std::int32_t>("IntVector");
87
138
  Object vec = c.call("new");
88
139
 
89
140
  Object result = vec.call("size");
@@ -99,11 +150,50 @@ TESTCASE(Empty)
99
150
  ASSERT_EQUAL(Qnil, result.value());
100
151
  }
101
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
+
102
192
  TESTCASE(Indexing)
103
193
  {
104
194
  Module m = define_module("Testing");
105
195
 
106
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
196
+ Class c = define_vector<std::int32_t>("IntVector");
107
197
  Object vec = c.call("new");
108
198
  vec.call("push", 0);
109
199
  vec.call("push", 1);
@@ -144,7 +234,7 @@ TESTCASE(Slice)
144
234
  {
145
235
  Module m = define_module("Testing");
146
236
 
147
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
237
+ Class c = define_vector<std::int32_t>("IntVector");
148
238
  Object vec = c.call("new");
149
239
  vec.call("push", 7);
150
240
  vec.call("push", 8);
@@ -180,7 +270,7 @@ TESTCASE(Sizing)
180
270
  {
181
271
  Module m = define_module("Testing");
182
272
 
183
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
273
+ Class c = define_vector<std::int32_t>("IntVector");
184
274
  Object vec = c.call("new");
185
275
  vec.call("resize", 10);
186
276
 
@@ -197,7 +287,7 @@ TESTCASE(ToString)
197
287
  {
198
288
  Module m = define_module("Testing");
199
289
 
200
- Class c = define_vector<std::vector<std::int32_t>>("IntVector");
290
+ Class c = define_vector<std::int32_t>("IntVector");
201
291
  Object vec = c.call("new");
202
292
  vec.call("resize", 3);
203
293
 
@@ -214,7 +304,7 @@ TESTCASE(Update)
214
304
  {
215
305
  Module m = define_module("Testing");
216
306
 
217
- Class c = define_vector<std::vector<std::string>>("StringVector");
307
+ Class c = define_vector<std::string>("StringVector");
218
308
  Object vec = c.call("new");
219
309
  vec.call("push", "original 1");
220
310
  vec.call("push", "original 2");
@@ -238,7 +328,7 @@ TESTCASE(Modify)
238
328
  {
239
329
  Module m = define_module("Testing");
240
330
 
241
- Class c = define_vector<std::vector<int64_t>>("Int64Vector");
331
+ Class c = define_vector<int64_t>("Int64Vector");
242
332
  Object vec = c.call("new");
243
333
 
244
334
  Object result = vec.call("push", 11);
@@ -278,26 +368,26 @@ TESTCASE(Modify)
278
368
  ASSERT_EQUAL(Qnil, result.value());
279
369
  }
280
370
 
281
- TESTCASE(Copy)
371
+ TESTCASE(Clone)
282
372
  {
283
373
  Module m = define_module("Testing");
284
374
 
285
- Class c = define_vector<std::vector<double>>("DoubleVector");
375
+ Class c = define_vector<double>("DoubleVector");
286
376
  Object object = c.call("new");
287
377
 
288
378
  object.call("push", 11.1);
289
379
  object.call("push", 22.2);
290
380
  std::vector<double>& vec = detail::From_Ruby<std::vector<double>&>().convert(object);
291
381
 
292
- Object result = object.call("copy");
293
- 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);
294
384
 
295
- ASSERT_EQUAL(vec.size(), vecCopy.size());
296
- ASSERT_EQUAL(vec[0], vecCopy[0]);
297
- 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]);
298
388
 
299
- vecCopy.push_back(33.3);
300
- ASSERT_NOT_EQUAL(vec.size(), vecCopy.size());
389
+ vecClone.push_back(33.3);
390
+ ASSERT_NOT_EQUAL(vec.size(), vecClone.size());
301
391
  }
302
392
 
303
393
  namespace
@@ -318,7 +408,7 @@ TESTCASE(NotComparable)
318
408
  define_class<NotComparable>("NotComparable").
319
409
  define_constructor(Constructor<NotComparable, uint32_t>());
320
410
 
321
- Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
411
+ Class c = define_vector<NotComparable>("NotComparableVector");
322
412
 
323
413
  Object vec = c.call("new");
324
414
  vec.call("push", NotComparable(1));
@@ -343,7 +433,7 @@ TESTCASE(NotDefaultConstructable)
343
433
  define_class<NotComparable>("NotComparable").
344
434
  define_constructor(Constructor<NotComparable, uint32_t>());
345
435
 
346
- Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
436
+ Class c = define_vector<NotComparable>("NotComparableVector");
347
437
  Object vec = c.call("new");
348
438
 
349
439
  Object result = vec.call("resize", 10);
@@ -358,7 +448,7 @@ TESTCASE(NotPrintable)
358
448
  define_class<NotComparable>("NotComparable").
359
449
  define_constructor(Constructor<NotComparable, uint32_t>());
360
450
 
361
- Class c = define_vector<std::vector<NotComparable>>("NotComparableVector");
451
+ Class c = define_vector<NotComparable>("NotComparableVector");
362
452
 
363
453
  Object vec = c.call("new");
364
454
  vec.call("push", NotComparable(1));
@@ -378,7 +468,7 @@ namespace
378
468
  {
379
469
  };
380
470
 
381
- bool operator==(const Comparable& other)
471
+ bool operator==(const Comparable& other) const
382
472
  {
383
473
  return this->value_ == other.value_;
384
474
  }
@@ -398,7 +488,7 @@ TESTCASE(Comparable)
398
488
  define_class<Comparable>("IsComparable").
399
489
  define_constructor(Constructor<Comparable, uint32_t>());
400
490
 
401
- Class c = define_vector<std::vector<Comparable>>("ComparableVector");
491
+ Class c = define_vector<Comparable>("ComparableVector");
402
492
 
403
493
  Object vec = c.call("new");
404
494
 
@@ -448,7 +538,7 @@ TESTCASE(ComparableButNotBool)
448
538
  define_class<ComparableButNotBool>("IsComparableButNotBool").
449
539
  define_constructor(Constructor<ComparableButNotBool, uint32_t>());
450
540
 
451
- Class c = define_vector<std::vector<ComparableButNotBool>>("ComparableButNotBoolVector");
541
+ Class c = define_vector<ComparableButNotBool>("ComparableButNotBoolVector");
452
542
 
453
543
  Object vec = c.call("new");
454
544
  vec.call("push", ComparableButNotBool(1));
@@ -473,7 +563,7 @@ TESTCASE(DefaultConstructable)
473
563
  define_class<Comparable>("IsComparable").
474
564
  define_constructor(Constructor<Comparable, uint32_t>());
475
565
 
476
- Class c = define_vector<std::vector<Comparable>>("ComparableVector");
566
+ Class c = define_vector<Comparable>("ComparableVector");
477
567
  Object vec = c.call("new");
478
568
 
479
569
  Object result = vec.call("resize", 10);
@@ -488,7 +578,7 @@ TESTCASE(Printable)
488
578
  define_class<Comparable>("IsComparable").
489
579
  define_constructor(Constructor<Comparable, uint32_t>());
490
580
 
491
- Class c = define_vector<std::vector<Comparable>>("ComparableVector");
581
+ Class c = define_vector<Comparable>("ComparableVector");
492
582
 
493
583
  Object vec = c.call("new");
494
584
  vec.call("push", Comparable(1));
@@ -526,7 +616,7 @@ TESTCASE(AutoRegisterReturn)
526
616
 
527
617
  Module m = define_module("Testing");
528
618
  Object vec = m.module_eval("return_complex_vector");
529
- ASSERT_EQUAL(u8"Rice::Std::Vector≺complex≺double≻≻", vec.class_name().str());
619
+ ASSERT_EQUAL("Std::Vector≺complex≺double≻≻", vec.class_name().str());
530
620
 
531
621
  std::string code = R"(vector = return_complex_vector
532
622
  complex = vector.last
@@ -536,14 +626,8 @@ TESTCASE(AutoRegisterReturn)
536
626
  ASSERT_EQUAL(Qtrue, result.value());
537
627
 
538
628
  // Now register this same vector
539
- define_vector<std::vector<std::complex<double>>>("ComplexVector");
540
- code = R"(vector = ComplexVector.new)";
541
- result = m.module_eval(code);
542
- ASSERT(result.is_instance_of(vec.class_of()));
543
-
544
- // Now register it again in the module
545
- define_vector_under<std::vector<std::complex<double>>>(m, "ComplexVector2");
546
- code = R"(vector = Testing::ComplexVector2.new)";
629
+ define_vector<std::complex<double>>("ComplexVector");
630
+ code = R"(vector = Std::ComplexVector.new)";
547
631
  result = m.module_eval(code);
548
632
  ASSERT(result.is_instance_of(vec.class_of()));
549
633
  }
@@ -552,7 +636,7 @@ TESTCASE(AutoRegisterParameter)
552
636
  {
553
637
  define_global_function("pass_complex_vector", &passComplexVector);
554
638
 
555
- std::string code = u8R"(vector = Rice::Std::Vector≺complex≺double≻≻.new
639
+ std::string code = R"(vector = Std::Vector≺complex≺double≻≻.new
556
640
  vector << Complex(4.0, 4.0)
557
641
  vector << Complex(5.0, 5.0)
558
642
  pass_complex_vector(vector))";
@@ -561,7 +645,7 @@ TESTCASE(AutoRegisterParameter)
561
645
  Object vec = m.module_eval(code);
562
646
 
563
647
  Object result = vec.call("size");
564
- ASSERT_EQUAL(u8"Rice::Std::Vector≺complex≺double≻≻", vec.class_name().str());
648
+ ASSERT_EQUAL("Std::Vector≺complex≺double≻≻", vec.class_name().str());
565
649
  ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
566
650
 
567
651
  std::vector<std::complex<double>> complexes = detail::From_Ruby<std::vector<std::complex<double>>>().convert(vec);
@@ -579,7 +663,7 @@ namespace
579
663
 
580
664
  TESTCASE(DefaultValue)
581
665
  {
582
- define_vector<std::vector<std::string>>("StringVector");
666
+ define_vector<std::string>("StringVector");
583
667
  define_global_function("default_vector", &defaultVector, Arg("strings") = std::vector<std::string> { "one", "two", "three" });
584
668
 
585
669
  Module m = define_module("Testing");
@@ -598,10 +682,10 @@ TESTCASE(ToArray)
598
682
  {
599
683
  Module m = define_module("Testing");
600
684
 
601
- Class c = define_vector<std::vector<std::string>>("StringVector").
685
+ Class c = define_vector<std::string>("StringVector").
602
686
  define_constructor(Constructor<std::vector<std::string>>());
603
687
 
604
- std::string code = R"(vector = StringVector.new
688
+ std::string code = R"(vector = Std::StringVector.new
605
689
  vector << "abc"
606
690
  vector << "def"
607
691
  vector << "ghi"
@@ -777,15 +861,15 @@ namespace
777
861
  stream << "Vector";
778
862
  return stream;
779
863
  }
780
- }
781
864
 
782
- void createFactoryClass()
783
- {
784
- define_class<Factory>("Factory").
785
- define_constructor(Constructor<Factory>()).
786
- define_method("pointer", &Factory::returnPointer).
787
- define_method("reference", &Factory::returnReference).
788
- 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
+ }
789
873
  }
790
874
 
791
875
  TESTCASE(Returns)
@@ -809,9 +893,9 @@ TESTCASE(Returns)
809
893
  TESTCASE(Iterate)
810
894
  {
811
895
  Module m = define_module("Testing");
812
- Class c = define_vector<std::vector<double>>("DoubleVector");
896
+ Class c = define_vector<double>("DoubleVector");
813
897
 
814
- std::string code = R"(vector = DoubleVector.new
898
+ std::string code = R"(vector = Std::DoubleVector.new
815
899
  vector << 5.0 << 6.0 << 7.0
816
900
  updated = vector.map do |value|
817
901
  value * 2.0
@@ -898,8 +982,12 @@ namespace
898
982
  std::vector<std::string*> vectorOfStringPointers()
899
983
  {
900
984
  std::vector<std::string*> result;
901
- std::string* pString = new std::string("Hello");
902
- 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
+
903
991
  return result;
904
992
  }
905
993
  }
@@ -910,11 +998,20 @@ TESTCASE(StringPointerVector)
910
998
 
911
999
  Module m(rb_mKernel);
912
1000
  Data_Object<std::vector<std::string*>> vec = m.call("vector_of_string_pointers");
913
- ASSERT_EQUAL(1, vec->size());
1001
+ ASSERT_EQUAL(2, vec->size());
914
1002
 
915
1003
  std::string expected("Hello");
916
1004
  std::string* actual = (*vec)[0];
917
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());
918
1015
  }
919
1016
 
920
1017
  namespace
@@ -953,41 +1050,70 @@ TESTCASE(MyClass2PointerVector)
953
1050
  ASSERT_EQUAL("Hello MyClass2", pMyClass->name);
954
1051
  }
955
1052
 
956
- TESTCASE(BoolVector)
1053
+ namespace
957
1054
  {
958
- Class boolVecClass = define_vector<std::vector<bool>>("BoolVector");
1055
+ bool typeCheckValue(std::vector<std::string> vec)
1056
+ {
1057
+ return true;
1058
+ }
959
1059
 
960
- Object vec = boolVecClass.call("new");
961
- vec.call("resize", 3, true);
1060
+ bool typeCheckRef(std::vector<std::string>& vec)
1061
+ {
1062
+ return true;
1063
+ }
962
1064
 
963
- Object result = vec.call("size");
964
- ASSERT_EQUAL(3, detail::From_Ruby<int32_t>().convert(result));
965
- result = vec.call("first");
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);
966
1084
  ASSERT_EQUAL(Qtrue, result.value());
967
1085
 
968
- Object enumerable = vec.call("each");
969
- Object arr = enumerable.call("to_a");
970
- Object size = arr.call("size");
971
- ASSERT_EQUAL(3, detail::From_Ruby<int32_t>().convert(size));
1086
+ code = R"(vec = Std::Vector≺string≻.new
1087
+ check_ref(vec))";
1088
+ result = m.module_eval(code);
1089
+ ASSERT_EQUAL(Qtrue, result.value());
972
1090
 
973
- result = vec.call("[]", 0);
1091
+ code = R"(vec = Std::Vector≺string≻.new
1092
+ check_ptr(vec))";
1093
+ result = m.module_eval(code);
974
1094
  ASSERT_EQUAL(Qtrue, result.value());
975
1095
 
976
- result = vec.call("[]=", 1, false);
977
- ASSERT_EQUAL(Qfalse, result.value());
1096
+ code = R"(vec = Std::Vector≺int≻.new
1097
+ check_value(vec))";
978
1098
 
979
- std::string code = R"(array = self.each.to_a
980
- array == [true, false, true])";
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()));
981
1103
 
982
- result = vec.instance_eval(code);
983
- ASSERT_EQUAL(Qtrue, result.value());
1104
+ code = R"(vec = Std::Vector≺int≻.new
1105
+ check_ref(vec))";
984
1106
 
985
- result = vec.call("delete", 1);
986
- ASSERT_EQUAL(Qtrue, result.value());
987
- result = vec.call("size");
988
- ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
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()));
989
1111
 
990
- vec.call("clear");
991
- result = vec.call("size");
992
- ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
993
- }
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
+ }