rice 4.3.3 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +86 -26
- data/CMakeLists.txt +31 -0
- data/CMakePresets.json +75 -0
- data/COPYING +3 -2
- data/FindRuby.cmake +437 -0
- data/README.md +7 -2
- data/Rakefile +12 -5
- data/include/rice/rice.hpp +9522 -4426
- data/include/rice/stl.hpp +2831 -1198
- data/lib/make_rice_headers.rb +79 -0
- data/lib/mkmf-rice.rb +40 -94
- data/lib/rice/version.rb +3 -0
- data/lib/rice.rb +1 -0
- data/lib/rubygems/builder.rb +11 -0
- data/lib/rubygems/cmake_builder.rb +113 -0
- data/lib/rubygems_plugin.rb +9 -0
- data/rice/Address_Registration_Guard.hpp +72 -3
- data/rice/Arg.hpp +26 -6
- data/rice/Arg.ipp +35 -2
- data/rice/Buffer.hpp +123 -0
- data/rice/Buffer.ipp +599 -0
- data/rice/Callback.hpp +21 -0
- data/rice/Callback.ipp +13 -0
- data/rice/Constructor.hpp +4 -27
- data/rice/Constructor.ipp +79 -0
- data/rice/Data_Object.hpp +73 -3
- data/rice/Data_Object.ipp +388 -96
- data/rice/Data_Type.hpp +214 -3
- data/rice/Data_Type.ipp +144 -67
- data/rice/Director.hpp +0 -2
- data/rice/Enum.hpp +4 -7
- data/rice/Enum.ipp +102 -55
- data/rice/Exception.hpp +62 -2
- data/rice/Exception.ipp +7 -12
- data/rice/Init.hpp +8 -0
- data/rice/Init.ipp +8 -0
- data/rice/JumpException.hpp +44 -0
- data/rice/JumpException.ipp +48 -0
- data/rice/MemoryView.hpp +11 -0
- data/rice/MemoryView.ipp +3 -0
- data/rice/Return.hpp +7 -27
- data/rice/Return.ipp +13 -13
- data/rice/cpp_api/Array.hpp +209 -0
- data/rice/cpp_api/Array.ipp +304 -0
- data/rice/cpp_api/Builtin_Object.hpp +31 -0
- data/rice/cpp_api/Builtin_Object.ipp +37 -0
- data/rice/cpp_api/Class.hpp +70 -0
- data/rice/cpp_api/Class.ipp +97 -0
- data/rice/cpp_api/Encoding.hpp +32 -0
- data/rice/cpp_api/Encoding.ipp +59 -0
- data/rice/cpp_api/Hash.hpp +194 -0
- data/rice/cpp_api/Hash.ipp +257 -0
- data/rice/{Identifier.hpp → cpp_api/Identifier.hpp} +2 -6
- data/rice/{Identifier.ipp → cpp_api/Identifier.ipp} +4 -2
- data/rice/cpp_api/Module.hpp +72 -0
- data/rice/cpp_api/Module.ipp +101 -0
- data/rice/cpp_api/Object.hpp +272 -0
- data/rice/cpp_api/Object.ipp +235 -0
- data/rice/cpp_api/String.hpp +74 -0
- data/rice/cpp_api/String.ipp +120 -0
- data/rice/cpp_api/Struct.hpp +113 -0
- data/rice/cpp_api/Struct.ipp +92 -0
- data/rice/cpp_api/Symbol.hpp +46 -0
- data/rice/cpp_api/Symbol.ipp +93 -0
- data/rice/cpp_api/shared_methods.hpp +134 -0
- data/rice/detail/DefaultHandler.hpp +12 -0
- data/rice/detail/DefaultHandler.ipp +8 -0
- data/rice/detail/HandlerRegistry.hpp +5 -35
- data/rice/detail/HandlerRegistry.ipp +7 -11
- data/rice/detail/InstanceRegistry.hpp +1 -4
- data/rice/detail/MethodInfo.hpp +12 -10
- data/rice/detail/MethodInfo.ipp +26 -21
- data/rice/detail/Native.hpp +33 -0
- data/rice/detail/Native.ipp +157 -0
- data/rice/detail/NativeAttributeGet.hpp +52 -0
- data/rice/detail/NativeAttributeGet.ipp +57 -0
- data/rice/detail/NativeAttributeSet.hpp +44 -0
- data/rice/detail/NativeAttributeSet.ipp +88 -0
- data/rice/detail/NativeCallbackFFI.hpp +55 -0
- data/rice/detail/NativeCallbackFFI.ipp +151 -0
- data/rice/detail/NativeCallbackSimple.hpp +30 -0
- data/rice/detail/NativeCallbackSimple.ipp +29 -0
- data/rice/detail/NativeFunction.hpp +33 -23
- data/rice/detail/NativeFunction.ipp +309 -70
- data/rice/detail/NativeIterator.hpp +9 -11
- data/rice/detail/NativeIterator.ipp +33 -31
- data/rice/detail/NativeRegistry.hpp +24 -15
- data/rice/detail/NativeRegistry.ipp +23 -48
- data/rice/detail/Proc.hpp +4 -0
- data/rice/detail/Proc.ipp +85 -0
- data/rice/detail/Registries.hpp +0 -7
- data/rice/detail/Registries.ipp +0 -18
- data/rice/detail/RubyFunction.hpp +0 -3
- data/rice/detail/RubyFunction.ipp +4 -8
- data/rice/detail/RubyType.hpp +16 -0
- data/rice/detail/RubyType.ipp +232 -0
- data/rice/detail/Type.hpp +7 -6
- data/rice/detail/Type.ipp +192 -45
- data/rice/detail/TypeRegistry.hpp +15 -7
- data/rice/detail/TypeRegistry.ipp +105 -12
- data/rice/detail/Wrapper.hpp +68 -32
- data/rice/detail/Wrapper.ipp +121 -109
- data/rice/detail/cpp_protect.hpp +5 -6
- data/rice/detail/default_allocation_func.ipp +0 -2
- data/rice/detail/from_ruby.hpp +38 -3
- data/rice/detail/from_ruby.ipp +1321 -492
- data/rice/detail/ruby.hpp +18 -0
- data/rice/detail/to_ruby.hpp +41 -3
- data/rice/detail/to_ruby.ipp +1424 -194
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +0 -1
- data/rice/libc/file.hpp +11 -0
- data/rice/libc/file.ipp +32 -0
- data/rice/rice.hpp +116 -26
- data/rice/ruby_mark.hpp +4 -3
- data/rice/stl/complex.hpp +6 -0
- data/rice/stl/complex.ipp +93 -0
- data/rice/stl/exception.hpp +11 -0
- data/rice/stl/exception.ipp +29 -0
- data/rice/stl/exception_ptr.hpp +6 -0
- data/rice/stl/exception_ptr.ipp +27 -0
- data/rice/stl/map.hpp +12 -0
- data/rice/stl/map.ipp +469 -0
- data/rice/stl/monostate.hpp +6 -0
- data/rice/stl/monostate.ipp +80 -0
- data/rice/stl/multimap.hpp +14 -0
- data/rice/stl/multimap.ipp +448 -0
- data/rice/stl/optional.hpp +6 -0
- data/rice/stl/optional.ipp +118 -0
- data/rice/stl/pair.hpp +13 -0
- data/rice/stl/pair.ipp +155 -0
- data/rice/stl/reference_wrapper.hpp +6 -0
- data/rice/stl/reference_wrapper.ipp +41 -0
- data/rice/stl/set.hpp +12 -0
- data/rice/stl/set.ipp +495 -0
- data/rice/stl/shared_ptr.hpp +28 -0
- data/rice/stl/shared_ptr.ipp +224 -0
- data/rice/stl/string.hpp +6 -0
- data/rice/stl/string.ipp +158 -0
- data/rice/stl/string_view.hpp +6 -0
- data/rice/stl/string_view.ipp +65 -0
- data/rice/stl/tuple.hpp +6 -0
- data/rice/stl/tuple.ipp +128 -0
- data/rice/stl/type_index.hpp +6 -0
- data/rice/stl/type_index.ipp +30 -0
- data/rice/stl/type_info.hpp +6 -0
- data/rice/stl/type_info.ipp +29 -0
- data/rice/stl/unique_ptr.hpp +22 -0
- data/rice/stl/unique_ptr.ipp +139 -0
- data/rice/stl/unordered_map.hpp +12 -0
- data/rice/stl/unordered_map.ipp +469 -0
- data/rice/stl/variant.hpp +6 -0
- data/rice/stl/variant.ipp +242 -0
- data/rice/stl/vector.hpp +12 -0
- data/rice/stl/vector.ipp +590 -0
- data/rice/stl.hpp +11 -3
- data/rice/traits/attribute_traits.hpp +26 -0
- data/rice/traits/function_traits.hpp +95 -0
- data/rice/traits/method_traits.hpp +47 -0
- data/rice/traits/rice_traits.hpp +160 -0
- data/rice.gemspec +85 -0
- data/test/embed_ruby.cpp +7 -1
- data/test/extconf.rb +2 -0
- data/test/test_Address_Registration_Guard.cpp +5 -0
- data/test/test_Array.cpp +18 -4
- data/test/test_Attribute.cpp +136 -21
- data/test/test_Buffer.cpp +285 -0
- data/test/test_Builtin_Object.cpp +5 -0
- data/test/test_Callback.cpp +230 -0
- data/test/test_Class.cpp +5 -31
- data/test/test_Constructor.cpp +69 -6
- data/test/test_Data_Object.cpp +97 -38
- data/test/test_Data_Type.cpp +470 -65
- data/test/test_Director.cpp +17 -8
- data/test/test_Enum.cpp +155 -40
- data/test/test_Exception.cpp +235 -0
- data/test/test_File.cpp +70 -0
- data/test/test_From_Ruby.cpp +609 -0
- data/test/test_Hash.cpp +5 -0
- data/test/test_Identifier.cpp +5 -0
- data/test/test_Inheritance.cpp +6 -1
- data/test/test_Iterator.cpp +6 -1
- data/test/test_Jump_Exception.cpp +23 -0
- data/test/test_Keep_Alive.cpp +13 -19
- data/test/test_Keep_Alive_No_Wrapper.cpp +5 -1
- data/test/test_Memory_Management.cpp +5 -0
- data/test/test_Module.cpp +128 -67
- data/test/test_Native_Registry.cpp +2 -34
- data/test/test_Object.cpp +5 -0
- data/test/test_Overloads.cpp +806 -0
- data/test/test_Ownership.cpp +160 -54
- data/test/test_Proc.cpp +44 -0
- data/test/test_Self.cpp +9 -4
- data/test/test_Stl_Exception.cpp +109 -0
- data/test/test_Stl_Map.cpp +54 -42
- data/test/test_Stl_Multimap.cpp +693 -0
- data/test/test_Stl_Optional.cpp +5 -0
- data/test/test_Stl_Pair.cpp +14 -9
- data/test/test_Stl_Reference_Wrapper.cpp +9 -2
- data/test/test_Stl_Set.cpp +790 -0
- data/test/test_Stl_SharedPtr.cpp +458 -0
- data/test/test_Stl_String.cpp +5 -0
- data/test/test_Stl_String_View.cpp +5 -0
- data/test/test_Stl_Tuple.cpp +116 -0
- data/test/test_Stl_Type.cpp +147 -0
- data/test/test_Stl_UniquePtr.cpp +202 -0
- data/test/test_Stl_Unordered_Map.cpp +43 -38
- data/test/test_Stl_Variant.cpp +217 -84
- data/test/test_Stl_Vector.cpp +306 -58
- data/test/test_String.cpp +5 -0
- data/test/test_Struct.cpp +5 -0
- data/test/test_Symbol.cpp +5 -0
- data/test/test_Template.cpp +192 -0
- data/test/test_To_Ruby.cpp +524 -0
- data/test/test_Tracking.cpp +1 -0
- data/test/test_Type.cpp +171 -0
- data/test/test_global_functions.cpp +67 -7
- data/test/unittest.cpp +8 -0
- metadata +127 -26
- data/lib/version.rb +0 -3
- data/rice/Address_Registration_Guard_defn.hpp +0 -79
- data/rice/Data_Object_defn.hpp +0 -84
- data/rice/Data_Type_defn.hpp +0 -190
- data/rice/Exception_defn.hpp +0 -68
- data/rice/HandlerRegistration.hpp +0 -15
- data/rice/detail/ExceptionHandler.hpp +0 -8
- data/rice/detail/ExceptionHandler.ipp +0 -28
- data/rice/detail/ExceptionHandler_defn.hpp +0 -77
- data/rice/detail/Jump_Tag.hpp +0 -21
- data/rice/detail/NativeAttribute.hpp +0 -64
- data/rice/detail/NativeAttribute.ipp +0 -112
- data/rice/detail/from_ruby_defn.hpp +0 -38
- data/rice/detail/to_ruby_defn.hpp +0 -48
- data/test/test_Jump_Tag.cpp +0 -17
- data/test/test_Stl_SmartPointer.cpp +0 -283
- data/test/test_To_From_Ruby.cpp +0 -399
data/test/test_Stl_Vector.cpp
CHANGED
@@ -14,9 +14,13 @@ SETUP(Vector)
|
|
14
14
|
embed_ruby();
|
15
15
|
}
|
16
16
|
|
17
|
-
|
17
|
+
TEARDOWN(Vector)
|
18
18
|
{
|
19
|
+
rb_gc_start();
|
20
|
+
}
|
19
21
|
|
22
|
+
namespace
|
23
|
+
{
|
20
24
|
class MyClass
|
21
25
|
{
|
22
26
|
public:
|
@@ -41,9 +45,9 @@ TESTCASE(StringVector)
|
|
41
45
|
{
|
42
46
|
Module m = define_module("Testing");
|
43
47
|
|
44
|
-
Class c = define_vector<std::
|
48
|
+
Class c = define_vector<std::string>("StringVector");
|
45
49
|
|
46
|
-
Object vec = m.module_eval("$vector = StringVector.new");
|
50
|
+
Object vec = m.module_eval("$vector = Std::StringVector.new");
|
47
51
|
Object result = vec.call("size");
|
48
52
|
ASSERT_EQUAL(0, detail::From_Ruby<int32_t>().convert(result));
|
49
53
|
|
@@ -62,13 +66,64 @@ TESTCASE(StringVector)
|
|
62
66
|
ASSERT_EQUAL("four", detail::From_Ruby<std::string>().convert(result));
|
63
67
|
}
|
64
68
|
|
65
|
-
TESTCASE(
|
69
|
+
TESTCASE(Constructors)
|
70
|
+
{
|
71
|
+
Module m = define_module("Testing");
|
72
|
+
|
73
|
+
Class c = define_vector<int>("IntVector");
|
74
|
+
|
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)
|
66
121
|
{
|
67
122
|
Module m = define_module("Testing");
|
68
123
|
|
69
|
-
Class c = define_vector<std::
|
124
|
+
Class c = define_vector<std::string>("StringVector");
|
70
125
|
|
71
|
-
Object vec = m.module_eval("$vector = StringVector.new");
|
126
|
+
Object vec = m.module_eval("$vector = Std::StringVector.new");
|
72
127
|
ASSERT_EXCEPTION_CHECK(
|
73
128
|
Exception,
|
74
129
|
m.module_eval("$vector << 1"),
|
@@ -79,7 +134,7 @@ TESTCASE(Empty)
|
|
79
134
|
{
|
80
135
|
Module m = define_module("Testing");
|
81
136
|
|
82
|
-
Class c = define_vector<std::
|
137
|
+
Class c = define_vector<std::int32_t>("IntVector");
|
83
138
|
Object vec = c.call("new");
|
84
139
|
|
85
140
|
Object result = vec.call("size");
|
@@ -95,11 +150,50 @@ TESTCASE(Empty)
|
|
95
150
|
ASSERT_EQUAL(Qnil, result.value());
|
96
151
|
}
|
97
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
|
+
|
98
192
|
TESTCASE(Indexing)
|
99
193
|
{
|
100
194
|
Module m = define_module("Testing");
|
101
195
|
|
102
|
-
Class c = define_vector<std::
|
196
|
+
Class c = define_vector<std::int32_t>("IntVector");
|
103
197
|
Object vec = c.call("new");
|
104
198
|
vec.call("push", 0);
|
105
199
|
vec.call("push", 1);
|
@@ -136,11 +230,47 @@ TESTCASE(Indexing)
|
|
136
230
|
ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
|
137
231
|
}
|
138
232
|
|
233
|
+
TESTCASE(Slice)
|
234
|
+
{
|
235
|
+
Module m = define_module("Testing");
|
236
|
+
|
237
|
+
Class c = define_vector<std::int32_t>("IntVector");
|
238
|
+
Object vec = c.call("new");
|
239
|
+
vec.call("push", 7);
|
240
|
+
vec.call("push", 8);
|
241
|
+
vec.call("push", 9);
|
242
|
+
vec.call("push", 10);
|
243
|
+
vec.call("push", 11);
|
244
|
+
vec.call("push", 12);
|
245
|
+
|
246
|
+
Array result = vec.call("[]", 3, 1);
|
247
|
+
std::vector<std::int32_t> slice = result.to_vector<int32_t>();
|
248
|
+
ASSERT_EQUAL(1, slice.size());
|
249
|
+
ASSERT_EQUAL(10, slice[0]);
|
250
|
+
|
251
|
+
result = vec.call("[]", 3, 2);
|
252
|
+
slice = result.to_vector<int32_t>();
|
253
|
+
ASSERT_EQUAL(2, slice.size());
|
254
|
+
ASSERT_EQUAL(10, slice[0]);
|
255
|
+
ASSERT_EQUAL(11, slice[1]);
|
256
|
+
|
257
|
+
result = vec.call("[]", 4, 10);
|
258
|
+
slice = result.to_vector<int32_t>();
|
259
|
+
ASSERT_EQUAL(2, slice.size());
|
260
|
+
ASSERT_EQUAL(11, slice[0]);
|
261
|
+
ASSERT_EQUAL(12, slice[1]);
|
262
|
+
|
263
|
+
result = vec.call("[]", -1, 2);
|
264
|
+
slice = result.to_vector<int32_t>();
|
265
|
+
ASSERT_EQUAL(1, slice.size());
|
266
|
+
ASSERT_EQUAL(12, slice[0]);
|
267
|
+
}
|
268
|
+
|
139
269
|
TESTCASE(Sizing)
|
140
270
|
{
|
141
271
|
Module m = define_module("Testing");
|
142
272
|
|
143
|
-
Class c = define_vector<std::
|
273
|
+
Class c = define_vector<std::int32_t>("IntVector");
|
144
274
|
Object vec = c.call("new");
|
145
275
|
vec.call("resize", 10);
|
146
276
|
|
@@ -157,7 +287,7 @@ TESTCASE(ToString)
|
|
157
287
|
{
|
158
288
|
Module m = define_module("Testing");
|
159
289
|
|
160
|
-
Class c = define_vector<std::
|
290
|
+
Class c = define_vector<std::int32_t>("IntVector");
|
161
291
|
Object vec = c.call("new");
|
162
292
|
vec.call("resize", 3);
|
163
293
|
|
@@ -174,7 +304,7 @@ TESTCASE(Update)
|
|
174
304
|
{
|
175
305
|
Module m = define_module("Testing");
|
176
306
|
|
177
|
-
Class c = define_vector<std::
|
307
|
+
Class c = define_vector<std::string>("StringVector");
|
178
308
|
Object vec = c.call("new");
|
179
309
|
vec.call("push", "original 1");
|
180
310
|
vec.call("push", "original 2");
|
@@ -198,7 +328,7 @@ TESTCASE(Modify)
|
|
198
328
|
{
|
199
329
|
Module m = define_module("Testing");
|
200
330
|
|
201
|
-
Class c = define_vector<
|
331
|
+
Class c = define_vector<int64_t>("Int64Vector");
|
202
332
|
Object vec = c.call("new");
|
203
333
|
|
204
334
|
Object result = vec.call("push", 11);
|
@@ -238,26 +368,26 @@ TESTCASE(Modify)
|
|
238
368
|
ASSERT_EQUAL(Qnil, result.value());
|
239
369
|
}
|
240
370
|
|
241
|
-
TESTCASE(
|
371
|
+
TESTCASE(Clone)
|
242
372
|
{
|
243
373
|
Module m = define_module("Testing");
|
244
374
|
|
245
|
-
Class c = define_vector<
|
375
|
+
Class c = define_vector<double>("DoubleVector");
|
246
376
|
Object object = c.call("new");
|
247
377
|
|
248
378
|
object.call("push", 11.1);
|
249
379
|
object.call("push", 22.2);
|
250
380
|
std::vector<double>& vec = detail::From_Ruby<std::vector<double>&>().convert(object);
|
251
381
|
|
252
|
-
Object result = object.call("
|
253
|
-
std::vector<double>&
|
382
|
+
Object result = object.call("clone");
|
383
|
+
std::vector<double>& vecClone = detail::From_Ruby<std::vector<double>&>().convert(result);
|
254
384
|
|
255
|
-
ASSERT_EQUAL(vec.size(),
|
256
|
-
ASSERT_EQUAL(vec[0],
|
257
|
-
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]);
|
258
388
|
|
259
|
-
|
260
|
-
ASSERT_NOT_EQUAL(vec.size(),
|
389
|
+
vecClone.push_back(33.3);
|
390
|
+
ASSERT_NOT_EQUAL(vec.size(), vecClone.size());
|
261
391
|
}
|
262
392
|
|
263
393
|
namespace
|
@@ -278,7 +408,7 @@ TESTCASE(NotComparable)
|
|
278
408
|
define_class<NotComparable>("NotComparable").
|
279
409
|
define_constructor(Constructor<NotComparable, uint32_t>());
|
280
410
|
|
281
|
-
Class c = define_vector<
|
411
|
+
Class c = define_vector<NotComparable>("NotComparableVector");
|
282
412
|
|
283
413
|
Object vec = c.call("new");
|
284
414
|
vec.call("push", NotComparable(1));
|
@@ -303,7 +433,7 @@ TESTCASE(NotDefaultConstructable)
|
|
303
433
|
define_class<NotComparable>("NotComparable").
|
304
434
|
define_constructor(Constructor<NotComparable, uint32_t>());
|
305
435
|
|
306
|
-
Class c = define_vector<
|
436
|
+
Class c = define_vector<NotComparable>("NotComparableVector");
|
307
437
|
Object vec = c.call("new");
|
308
438
|
|
309
439
|
Object result = vec.call("resize", 10);
|
@@ -318,7 +448,7 @@ TESTCASE(NotPrintable)
|
|
318
448
|
define_class<NotComparable>("NotComparable").
|
319
449
|
define_constructor(Constructor<NotComparable, uint32_t>());
|
320
450
|
|
321
|
-
Class c = define_vector<
|
451
|
+
Class c = define_vector<NotComparable>("NotComparableVector");
|
322
452
|
|
323
453
|
Object vec = c.call("new");
|
324
454
|
vec.call("push", NotComparable(1));
|
@@ -338,7 +468,7 @@ namespace
|
|
338
468
|
{
|
339
469
|
};
|
340
470
|
|
341
|
-
bool operator==(const Comparable& other)
|
471
|
+
bool operator==(const Comparable& other) const
|
342
472
|
{
|
343
473
|
return this->value_ == other.value_;
|
344
474
|
}
|
@@ -358,7 +488,7 @@ TESTCASE(Comparable)
|
|
358
488
|
define_class<Comparable>("IsComparable").
|
359
489
|
define_constructor(Constructor<Comparable, uint32_t>());
|
360
490
|
|
361
|
-
Class c = define_vector<
|
491
|
+
Class c = define_vector<Comparable>("ComparableVector");
|
362
492
|
|
363
493
|
Object vec = c.call("new");
|
364
494
|
|
@@ -385,12 +515,55 @@ TESTCASE(Comparable)
|
|
385
515
|
ASSERT_EQUAL(1, detail::From_Ruby<size_t>().convert(result.value()));
|
386
516
|
}
|
387
517
|
|
518
|
+
namespace
|
519
|
+
{
|
520
|
+
class ComparableButNotBool
|
521
|
+
{
|
522
|
+
public:
|
523
|
+
ComparableButNotBool(uint32_t value) : value_(value)
|
524
|
+
{
|
525
|
+
};
|
526
|
+
|
527
|
+
std::string operator==(const ComparableButNotBool& other)
|
528
|
+
{
|
529
|
+
return "not a boolean";
|
530
|
+
}
|
531
|
+
|
532
|
+
uint32_t value_;
|
533
|
+
};
|
534
|
+
}
|
535
|
+
|
536
|
+
TESTCASE(ComparableButNotBool)
|
537
|
+
{
|
538
|
+
define_class<ComparableButNotBool>("IsComparableButNotBool").
|
539
|
+
define_constructor(Constructor<ComparableButNotBool, uint32_t>());
|
540
|
+
|
541
|
+
Class c = define_vector<ComparableButNotBool>("ComparableButNotBoolVector");
|
542
|
+
|
543
|
+
Object vec = c.call("new");
|
544
|
+
vec.call("push", ComparableButNotBool(1));
|
545
|
+
vec.call("push", ComparableButNotBool(2));
|
546
|
+
vec.call("push", ComparableButNotBool(3));
|
547
|
+
|
548
|
+
Object result = vec.call("delete", ComparableButNotBool(1));
|
549
|
+
ASSERT_EQUAL(Qnil, result.value());
|
550
|
+
|
551
|
+
result = vec.call("length");
|
552
|
+
ASSERT_EQUAL(3u, detail::From_Ruby<size_t>().convert(result));
|
553
|
+
|
554
|
+
result = vec.call("include?", ComparableButNotBool(2));
|
555
|
+
ASSERT_EQUAL(Qfalse, result.value());
|
556
|
+
|
557
|
+
result = vec.call("index", ComparableButNotBool(3));
|
558
|
+
ASSERT_EQUAL(Qnil, result.value());
|
559
|
+
}
|
560
|
+
|
388
561
|
TESTCASE(DefaultConstructable)
|
389
562
|
{
|
390
563
|
define_class<Comparable>("IsComparable").
|
391
564
|
define_constructor(Constructor<Comparable, uint32_t>());
|
392
565
|
|
393
|
-
Class c = define_vector<
|
566
|
+
Class c = define_vector<Comparable>("ComparableVector");
|
394
567
|
Object vec = c.call("new");
|
395
568
|
|
396
569
|
Object result = vec.call("resize", 10);
|
@@ -405,7 +578,7 @@ TESTCASE(Printable)
|
|
405
578
|
define_class<Comparable>("IsComparable").
|
406
579
|
define_constructor(Constructor<Comparable, uint32_t>());
|
407
580
|
|
408
|
-
Class c = define_vector<
|
581
|
+
Class c = define_vector<Comparable>("ComparableVector");
|
409
582
|
|
410
583
|
Object vec = c.call("new");
|
411
584
|
vec.call("push", Comparable(1));
|
@@ -443,7 +616,7 @@ TESTCASE(AutoRegisterReturn)
|
|
443
616
|
|
444
617
|
Module m = define_module("Testing");
|
445
618
|
Object vec = m.module_eval("return_complex_vector");
|
446
|
-
ASSERT_EQUAL("
|
619
|
+
ASSERT_EQUAL("Std::Vector≺complex≺double≻≻", vec.class_name().str());
|
447
620
|
|
448
621
|
std::string code = R"(vector = return_complex_vector
|
449
622
|
complex = vector.last
|
@@ -453,14 +626,8 @@ TESTCASE(AutoRegisterReturn)
|
|
453
626
|
ASSERT_EQUAL(Qtrue, result.value());
|
454
627
|
|
455
628
|
// Now register this same vector
|
456
|
-
define_vector<std::
|
457
|
-
code = R"(vector = ComplexVector.new)";
|
458
|
-
result = m.module_eval(code);
|
459
|
-
ASSERT(result.is_instance_of(vec.class_of()));
|
460
|
-
|
461
|
-
// Now register it again in the module
|
462
|
-
define_vector_under<std::vector<std::complex<double>>>(m, "ComplexVector2");
|
463
|
-
code = R"(vector = Testing::ComplexVector2.new)";
|
629
|
+
define_vector<std::complex<double>>("ComplexVector");
|
630
|
+
code = R"(vector = Std::ComplexVector.new)";
|
464
631
|
result = m.module_eval(code);
|
465
632
|
ASSERT(result.is_instance_of(vec.class_of()));
|
466
633
|
}
|
@@ -469,16 +636,16 @@ TESTCASE(AutoRegisterParameter)
|
|
469
636
|
{
|
470
637
|
define_global_function("pass_complex_vector", &passComplexVector);
|
471
638
|
|
472
|
-
std::string code = R"(vector =
|
473
|
-
|
474
|
-
|
475
|
-
|
639
|
+
std::string code = R"(vector = Std::Vector≺complex≺double≻≻.new
|
640
|
+
vector << Complex(4.0, 4.0)
|
641
|
+
vector << Complex(5.0, 5.0)
|
642
|
+
pass_complex_vector(vector))";
|
476
643
|
|
477
644
|
Module m = define_module("Testing");
|
478
645
|
Object vec = m.module_eval(code);
|
479
646
|
|
480
647
|
Object result = vec.call("size");
|
481
|
-
ASSERT_EQUAL("
|
648
|
+
ASSERT_EQUAL("Std::Vector≺complex≺double≻≻", vec.class_name().str());
|
482
649
|
ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
|
483
650
|
|
484
651
|
std::vector<std::complex<double>> complexes = detail::From_Ruby<std::vector<std::complex<double>>>().convert(vec);
|
@@ -496,7 +663,7 @@ namespace
|
|
496
663
|
|
497
664
|
TESTCASE(DefaultValue)
|
498
665
|
{
|
499
|
-
define_vector<std::
|
666
|
+
define_vector<std::string>("StringVector");
|
500
667
|
define_global_function("default_vector", &defaultVector, Arg("strings") = std::vector<std::string> { "one", "two", "three" });
|
501
668
|
|
502
669
|
Module m = define_module("Testing");
|
@@ -515,10 +682,10 @@ TESTCASE(ToArray)
|
|
515
682
|
{
|
516
683
|
Module m = define_module("Testing");
|
517
684
|
|
518
|
-
Class c = define_vector<std::
|
685
|
+
Class c = define_vector<std::string>("StringVector").
|
519
686
|
define_constructor(Constructor<std::vector<std::string>>());
|
520
687
|
|
521
|
-
std::string code = R"(vector = StringVector.new
|
688
|
+
std::string code = R"(vector = Std::StringVector.new
|
522
689
|
vector << "abc"
|
523
690
|
vector << "def"
|
524
691
|
vector << "ghi"
|
@@ -694,15 +861,15 @@ namespace
|
|
694
861
|
stream << "Vector";
|
695
862
|
return stream;
|
696
863
|
}
|
697
|
-
}
|
698
864
|
|
699
|
-
void createFactoryClass()
|
700
|
-
{
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
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
|
+
}
|
706
873
|
}
|
707
874
|
|
708
875
|
TESTCASE(Returns)
|
@@ -726,9 +893,9 @@ TESTCASE(Returns)
|
|
726
893
|
TESTCASE(Iterate)
|
727
894
|
{
|
728
895
|
Module m = define_module("Testing");
|
729
|
-
Class c = define_vector<
|
896
|
+
Class c = define_vector<double>("DoubleVector");
|
730
897
|
|
731
|
-
std::string code = R"(vector = DoubleVector.new
|
898
|
+
std::string code = R"(vector = Std::DoubleVector.new
|
732
899
|
vector << 5.0 << 6.0 << 7.0
|
733
900
|
updated = vector.map do |value|
|
734
901
|
value * 2.0
|
@@ -815,8 +982,12 @@ namespace
|
|
815
982
|
std::vector<std::string*> vectorOfStringPointers()
|
816
983
|
{
|
817
984
|
std::vector<std::string*> result;
|
818
|
-
std::string*
|
819
|
-
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
|
+
|
820
991
|
return result;
|
821
992
|
}
|
822
993
|
}
|
@@ -827,11 +998,20 @@ TESTCASE(StringPointerVector)
|
|
827
998
|
|
828
999
|
Module m(rb_mKernel);
|
829
1000
|
Data_Object<std::vector<std::string*>> vec = m.call("vector_of_string_pointers");
|
830
|
-
ASSERT_EQUAL(
|
1001
|
+
ASSERT_EQUAL(2, vec->size());
|
831
1002
|
|
832
1003
|
std::string expected("Hello");
|
833
1004
|
std::string* actual = (*vec)[0];
|
834
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());
|
835
1015
|
}
|
836
1016
|
|
837
1017
|
namespace
|
@@ -869,3 +1049,71 @@ TESTCASE(MyClass2PointerVector)
|
|
869
1049
|
MyClass2* pMyClass = (*result)[0];
|
870
1050
|
ASSERT_EQUAL("Hello MyClass2", pMyClass->name);
|
871
1051
|
}
|
1052
|
+
|
1053
|
+
namespace
|
1054
|
+
{
|
1055
|
+
bool typeCheckValue(std::vector<std::string> vec)
|
1056
|
+
{
|
1057
|
+
return true;
|
1058
|
+
}
|
1059
|
+
|
1060
|
+
bool typeCheckRef(std::vector<std::string>& vec)
|
1061
|
+
{
|
1062
|
+
return true;
|
1063
|
+
}
|
1064
|
+
|
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);
|
1084
|
+
ASSERT_EQUAL(Qtrue, result.value());
|
1085
|
+
|
1086
|
+
code = R"(vec = Std::Vector≺string≻.new
|
1087
|
+
check_ref(vec))";
|
1088
|
+
result = m.module_eval(code);
|
1089
|
+
ASSERT_EQUAL(Qtrue, result.value());
|
1090
|
+
|
1091
|
+
code = R"(vec = Std::Vector≺string≻.new
|
1092
|
+
check_ptr(vec))";
|
1093
|
+
result = m.module_eval(code);
|
1094
|
+
ASSERT_EQUAL(Qtrue, result.value());
|
1095
|
+
|
1096
|
+
code = R"(vec = Std::Vector≺int≻.new
|
1097
|
+
check_value(vec))";
|
1098
|
+
|
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()));
|
1103
|
+
|
1104
|
+
code = R"(vec = Std::Vector≺int≻.new
|
1105
|
+
check_ref(vec))";
|
1106
|
+
|
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()));
|
1111
|
+
|
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
|
+
}
|
data/test/test_String.cpp
CHANGED
data/test/test_Struct.cpp
CHANGED