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
data/test/test_Stl_Vector.cpp
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
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::
|
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(
|
69
|
+
TESTCASE(Constructors)
|
70
70
|
{
|
71
71
|
Module m = define_module("Testing");
|
72
72
|
|
73
|
-
Class c = define_vector<
|
73
|
+
Class c = define_vector<int>("IntVector");
|
74
74
|
|
75
|
-
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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<
|
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(
|
371
|
+
TESTCASE(Clone)
|
282
372
|
{
|
283
373
|
Module m = define_module("Testing");
|
284
374
|
|
285
|
-
Class c = define_vector<
|
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("
|
293
|
-
std::vector<double>&
|
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(),
|
296
|
-
ASSERT_EQUAL(vec[0],
|
297
|
-
ASSERT_EQUAL(vec[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
|
-
|
300
|
-
ASSERT_NOT_EQUAL(vec.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<
|
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<
|
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<
|
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<
|
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<
|
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<
|
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<
|
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(
|
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::
|
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 =
|
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(
|
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::
|
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::
|
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
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
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<
|
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*
|
902
|
-
result.push_back(
|
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(
|
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
|
-
|
1053
|
+
namespace
|
957
1054
|
{
|
958
|
-
|
1055
|
+
bool typeCheckValue(std::vector<std::string> vec)
|
1056
|
+
{
|
1057
|
+
return true;
|
1058
|
+
}
|
959
1059
|
|
960
|
-
|
961
|
-
|
1060
|
+
bool typeCheckRef(std::vector<std::string>& vec)
|
1061
|
+
{
|
1062
|
+
return true;
|
1063
|
+
}
|
962
1064
|
|
963
|
-
|
964
|
-
|
965
|
-
|
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
|
-
|
969
|
-
|
970
|
-
|
971
|
-
ASSERT_EQUAL(
|
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
|
-
|
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
|
-
|
977
|
-
|
1096
|
+
code = R"(vec = Std::Vector≺int≻.new
|
1097
|
+
check_value(vec))";
|
978
1098
|
|
979
|
-
|
980
|
-
|
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
|
-
|
983
|
-
|
1104
|
+
code = R"(vec = Std::Vector≺int≻.new
|
1105
|
+
check_ref(vec))";
|
984
1106
|
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
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
|
991
|
-
|
992
|
-
|
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
|
+
}
|