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
@@ -0,0 +1,285 @@
|
|
1
|
+
#include "unittest.hpp"
|
2
|
+
#include "embed_ruby.hpp"
|
3
|
+
#include <rice/rice.hpp>
|
4
|
+
|
5
|
+
#include <limits>
|
6
|
+
#include <cmath>
|
7
|
+
|
8
|
+
using namespace Rice;
|
9
|
+
|
10
|
+
TESTSUITE(Buffer);
|
11
|
+
|
12
|
+
SETUP(Buffer)
|
13
|
+
{
|
14
|
+
embed_ruby();
|
15
|
+
}
|
16
|
+
|
17
|
+
TEARDOWN(Buffer)
|
18
|
+
{
|
19
|
+
rb_gc_start();
|
20
|
+
}
|
21
|
+
|
22
|
+
TESTCASE(Char)
|
23
|
+
{
|
24
|
+
define_buffer<char>();
|
25
|
+
|
26
|
+
Module m = define_module("BufferTesting");
|
27
|
+
|
28
|
+
std::string code = R"(Rice::Buffer≺char≻.new("my string"))";
|
29
|
+
Object result = m.instance_eval(code);
|
30
|
+
|
31
|
+
ASSERT_EQUAL("Rice::Buffer≺char≻", result.class_name().c_str());
|
32
|
+
ASSERT_EQUAL("my string", String(result.call("bytes")).c_str());
|
33
|
+
|
34
|
+
Array array = result.call("to_ary");
|
35
|
+
ASSERT_EQUAL("109, 121, 32, 115, 116, 114, 105, 110, 103", array.join(", ").c_str());
|
36
|
+
|
37
|
+
Object size = result.call("size");
|
38
|
+
ASSERT_EQUAL(9, detail::From_Ruby<int>().convert(size));
|
39
|
+
|
40
|
+
Data_Object<Buffer<char>> dataObject(result);
|
41
|
+
Buffer<char> buffer = std::move(*dataObject);
|
42
|
+
ASSERT_EQUAL("my string", buffer.ptr());
|
43
|
+
ASSERT_EQUAL(9, (int)buffer.size());
|
44
|
+
}
|
45
|
+
|
46
|
+
TESTCASE(CharArray)
|
47
|
+
{
|
48
|
+
define_buffer<char>();
|
49
|
+
|
50
|
+
Module m = define_module("BufferTesting");
|
51
|
+
|
52
|
+
std::string code = R"(Rice::Buffer≺char≻.new([0, 127, 128, 255, 256, -128, -129, -255]))";
|
53
|
+
Data_Object<Buffer<char>> result = m.instance_eval(code);
|
54
|
+
Buffer<char> buffer = std::move(*result);
|
55
|
+
char* data = buffer.ptr();
|
56
|
+
|
57
|
+
ASSERT_EQUAL(data[0], 0);
|
58
|
+
ASSERT_EQUAL(data[1], 127);
|
59
|
+
ASSERT_EQUAL(data[2], -128);
|
60
|
+
ASSERT_EQUAL(data[3], -1);
|
61
|
+
ASSERT_EQUAL(data[4], 0);
|
62
|
+
ASSERT_EQUAL(data[5], -128);
|
63
|
+
ASSERT_EQUAL(data[6], 127);
|
64
|
+
ASSERT_EQUAL(data[7], 1);
|
65
|
+
}
|
66
|
+
|
67
|
+
TESTCASE(signed_char_pointer)
|
68
|
+
{
|
69
|
+
define_buffer<signed char>();
|
70
|
+
Module m = define_module("Testing");
|
71
|
+
|
72
|
+
std::string code = R"(Rice::Buffer≺signed char≻.new("my string"))";
|
73
|
+
Data_Object<Buffer<signed char>> result = m.instance_eval(code);
|
74
|
+
Buffer<signed char> buffer = std::move(*result);
|
75
|
+
signed char* data = buffer.ptr();
|
76
|
+
|
77
|
+
signed char* expected = (signed char*)"my string";
|
78
|
+
ASSERT_EQUAL(*expected, *data);
|
79
|
+
|
80
|
+
code = R"(Rice::Buffer≺signed char≻.new([0, 127, 128, 255, 256, -128, -129, -255]))";
|
81
|
+
result = m.instance_eval(code);
|
82
|
+
buffer = std::move(*result);
|
83
|
+
data = buffer.ptr();
|
84
|
+
|
85
|
+
ASSERT_EQUAL(data[0], 0);
|
86
|
+
ASSERT_EQUAL(data[1], 127);
|
87
|
+
ASSERT_EQUAL(data[2], -128);
|
88
|
+
ASSERT_EQUAL(data[3], -1);
|
89
|
+
ASSERT_EQUAL(data[4], 0);
|
90
|
+
ASSERT_EQUAL(data[5], -128);
|
91
|
+
ASSERT_EQUAL(data[6], 127);
|
92
|
+
ASSERT_EQUAL(data[7], 1);
|
93
|
+
}
|
94
|
+
|
95
|
+
TESTCASE(char_pointer_const)
|
96
|
+
{
|
97
|
+
define_buffer<char>();
|
98
|
+
Module m = define_module("Testing");
|
99
|
+
|
100
|
+
std::string code = R"(Rice::Buffer≺char≻.new("my string"))";
|
101
|
+
|
102
|
+
Data_Object<Buffer<char>> result = m.instance_eval(code);
|
103
|
+
Buffer<char> buffer = std::move(*result);
|
104
|
+
char* data = buffer.ptr();
|
105
|
+
|
106
|
+
const char* expected = "my string";
|
107
|
+
ASSERT_EQUAL(expected, data);
|
108
|
+
|
109
|
+
code = R"(Rice::Buffer≺char≻.new(""))";
|
110
|
+
result = m.instance_eval(code);
|
111
|
+
buffer = std::move(*result);
|
112
|
+
data = buffer.ptr();
|
113
|
+
|
114
|
+
expected = "";
|
115
|
+
ASSERT_EQUAL(expected, data);
|
116
|
+
}
|
117
|
+
|
118
|
+
TESTCASE(unsigned_char_pointer)
|
119
|
+
{
|
120
|
+
define_buffer<unsigned char>();
|
121
|
+
Module m = define_module("Testing");
|
122
|
+
|
123
|
+
std::string code = R"(Rice::Buffer≺unsigned char≻.new([0, 127, 128, 255, 256, -128, -129, -255]))";
|
124
|
+
Data_Object<Buffer<unsigned char>> result = m.instance_eval(code);
|
125
|
+
Buffer<unsigned char> buffer = std::move(*result);
|
126
|
+
unsigned char* data = buffer.ptr();
|
127
|
+
|
128
|
+
ASSERT_EQUAL(data[0], 0x0);
|
129
|
+
ASSERT_EQUAL(data[1], 0x7F);
|
130
|
+
ASSERT_EQUAL(data[2], 0x80);
|
131
|
+
ASSERT_EQUAL(data[3], 0xFF);
|
132
|
+
ASSERT_EQUAL(data[4], 0x00);
|
133
|
+
ASSERT_EQUAL(data[5], 0x80);
|
134
|
+
ASSERT_EQUAL(data[6], 0x7F);
|
135
|
+
ASSERT_EQUAL(data[7], 0x01);
|
136
|
+
|
137
|
+
code = R"(array = [0, 127, 128, 255, 256, -128, -129, -255]
|
138
|
+
packed = array.pack("C*")
|
139
|
+
Rice::Buffer≺unsigned char≻.new(packed))";
|
140
|
+
result = m.instance_eval(code);
|
141
|
+
buffer = std::move(*result);
|
142
|
+
data = buffer.ptr();
|
143
|
+
|
144
|
+
ASSERT_EQUAL(data[0], 0x0);
|
145
|
+
ASSERT_EQUAL(data[1], 0x7F);
|
146
|
+
ASSERT_EQUAL(data[2], 0x80);
|
147
|
+
ASSERT_EQUAL(data[3], 0xFF);
|
148
|
+
ASSERT_EQUAL(data[4], 0x00);
|
149
|
+
ASSERT_EQUAL(data[5], 0x80);
|
150
|
+
ASSERT_EQUAL(data[6], 0x7F);
|
151
|
+
ASSERT_EQUAL(data[7], 0x01);
|
152
|
+
}
|
153
|
+
|
154
|
+
TESTCASE(float_array_array)
|
155
|
+
{
|
156
|
+
define_buffer<float*>();
|
157
|
+
Module m = define_module("Testing");
|
158
|
+
|
159
|
+
std::string code = R"(Rice::Buffer≺float∗≻.new([[1.1, 2.2], [3.3, 4.4], [5.5, 6.6]]))";
|
160
|
+
Data_Object<Buffer<float*>> result = m.instance_eval(code);
|
161
|
+
Buffer<float*> buffer = std::move(*result);
|
162
|
+
|
163
|
+
ASSERT_EQUAL(3, (int)buffer.size());
|
164
|
+
|
165
|
+
const Buffer<float>& bufferInner1 = buffer[0];
|
166
|
+
ASSERT_EQUAL(2, (int)bufferInner1.size());
|
167
|
+
|
168
|
+
const Buffer<float>& bufferInner2 = buffer[1];
|
169
|
+
ASSERT_EQUAL(2, (int)bufferInner2.size());
|
170
|
+
|
171
|
+
const Buffer<float>& bufferInner3 = buffer[2];
|
172
|
+
ASSERT_EQUAL(2, (int)bufferInner3.size());
|
173
|
+
}
|
174
|
+
|
175
|
+
TESTCASE(wrong_type)
|
176
|
+
{
|
177
|
+
define_buffer<float*>();
|
178
|
+
Module m = define_module("Testing");
|
179
|
+
|
180
|
+
std::string code = R"(Rice::Buffer≺float∗≻.new([[4, "bad"], [2, 1]]))";
|
181
|
+
|
182
|
+
ASSERT_EXCEPTION_CHECK(
|
183
|
+
Exception,
|
184
|
+
m.module_eval(code),
|
185
|
+
ASSERT_EQUAL("can't convert String into Float", ex.what())
|
186
|
+
);
|
187
|
+
}
|
188
|
+
|
189
|
+
namespace
|
190
|
+
{
|
191
|
+
void updateRef(int& ref)
|
192
|
+
{
|
193
|
+
ref = 4;
|
194
|
+
}
|
195
|
+
|
196
|
+
void updatePtr(int* ptr)
|
197
|
+
{
|
198
|
+
*ptr = 5;
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
TESTCASE(update_reference)
|
203
|
+
{
|
204
|
+
define_buffer<int>();
|
205
|
+
Module m = define_module("Testing");
|
206
|
+
m.define_module_function("update_reference", &updateRef);
|
207
|
+
|
208
|
+
std::string code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
209
|
+
update_reference(buffer)
|
210
|
+
buffer.to_ary(1).first)";
|
211
|
+
|
212
|
+
Object result = m.module_eval(code);
|
213
|
+
ASSERT_EQUAL(4, detail::From_Ruby<int>().convert(result));
|
214
|
+
|
215
|
+
code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
216
|
+
update_reference(buffer)
|
217
|
+
buffer[0])";
|
218
|
+
|
219
|
+
result = m.module_eval(code);
|
220
|
+
ASSERT_EQUAL(4, detail::From_Ruby<int>().convert(result));
|
221
|
+
|
222
|
+
code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
223
|
+
update_reference(buffer)
|
224
|
+
buffer[1])";
|
225
|
+
|
226
|
+
ASSERT_EXCEPTION_CHECK(
|
227
|
+
Exception,
|
228
|
+
m.module_eval(code),
|
229
|
+
ASSERT_EQUAL("index 1 outside of bounds: 0..1", ex.what())
|
230
|
+
);
|
231
|
+
}
|
232
|
+
|
233
|
+
TESTCASE(update_ptr)
|
234
|
+
{
|
235
|
+
define_buffer<int>();
|
236
|
+
Module m = define_module("Testing");
|
237
|
+
m.define_module_function("update_pointer", &updatePtr);
|
238
|
+
|
239
|
+
std::string code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
240
|
+
update_pointer(buffer)
|
241
|
+
buffer.to_ary(1).first)";
|
242
|
+
|
243
|
+
Object result = m.module_eval(code);
|
244
|
+
ASSERT_EQUAL(5, detail::From_Ruby<int>().convert(result));
|
245
|
+
|
246
|
+
code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
247
|
+
update_pointer(buffer)
|
248
|
+
buffer[0])";
|
249
|
+
|
250
|
+
result = m.module_eval(code);
|
251
|
+
ASSERT_EQUAL(5, detail::From_Ruby<int>().convert(result));
|
252
|
+
|
253
|
+
code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
254
|
+
update_pointer(buffer)
|
255
|
+
buffer[1])";
|
256
|
+
|
257
|
+
ASSERT_EXCEPTION_CHECK(
|
258
|
+
Exception,
|
259
|
+
m.module_eval(code),
|
260
|
+
ASSERT_EQUAL("index 1 outside of bounds: 0..1", ex.what())
|
261
|
+
);
|
262
|
+
}
|
263
|
+
|
264
|
+
TESTCASE(update_buffer)
|
265
|
+
{
|
266
|
+
define_buffer<int>();
|
267
|
+
Module m = define_module("Testing");
|
268
|
+
|
269
|
+
std::string code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
270
|
+
buffer[0] = 8
|
271
|
+
buffer[0])";
|
272
|
+
|
273
|
+
Object result = m.module_eval(code);
|
274
|
+
ASSERT_EQUAL(8, detail::From_Ruby<int>().convert(result));
|
275
|
+
|
276
|
+
code = R"(buffer = Rice::Buffer≺int≻.new(0)
|
277
|
+
buffer[1] = 9
|
278
|
+
buffer[1])";
|
279
|
+
|
280
|
+
ASSERT_EXCEPTION_CHECK(
|
281
|
+
Exception,
|
282
|
+
m.module_eval(code),
|
283
|
+
ASSERT_EQUAL("index 1 outside of bounds: 0..1", ex.what())
|
284
|
+
);
|
285
|
+
}
|
data/test/test_Callback.cpp
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
#include "unittest.hpp"
|
4
4
|
#include "embed_ruby.hpp"
|
5
5
|
#include <rice/rice.hpp>
|
6
|
-
#include <rice/stl.hpp>
|
7
6
|
|
8
7
|
using namespace Rice;
|
9
8
|
|
@@ -140,7 +139,7 @@ namespace
|
|
140
139
|
using Callback_T2 = char*(*)();
|
141
140
|
std::vector<Callback_T2> callbacks;
|
142
141
|
|
143
|
-
void
|
142
|
+
void registerTwoCallbacks(Callback_T2 callback1, Callback_T2 callback2)
|
144
143
|
{
|
145
144
|
callbacks.push_back(callback1);
|
146
145
|
callbacks.push_back(callback2);
|
@@ -157,7 +156,7 @@ namespace
|
|
157
156
|
TESTCASE(MultipleCallbacks)
|
158
157
|
{
|
159
158
|
Module m = define_module("TestingMultipleCallbacks");
|
160
|
-
m.define_module_function<void(*)(Callback_T2, Callback_T2)>("register_callback",
|
159
|
+
m.define_module_function<void(*)(Callback_T2, Callback_T2)>("register_callback", registerTwoCallbacks).
|
161
160
|
define_module_function<char*(*)(int)>("trigger_callback", triggerCallback);
|
162
161
|
|
163
162
|
std::string code = R"(proc1 = Proc.new do
|
data/test/test_Data_Object.cpp
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#include <ruby/version.h>
|
2
|
-
|
3
1
|
#include "unittest.hpp"
|
4
2
|
#include "embed_ruby.hpp"
|
5
3
|
#include <rice/rice.hpp>
|
@@ -15,7 +13,7 @@ namespace
|
|
15
13
|
|
16
14
|
struct MyDataType
|
17
15
|
{
|
18
|
-
MyDataType() : x(
|
16
|
+
MyDataType(int value) : x(value)
|
19
17
|
{
|
20
18
|
}
|
21
19
|
|
@@ -27,6 +25,17 @@ namespace
|
|
27
25
|
int x;
|
28
26
|
};
|
29
27
|
|
28
|
+
static MyDataType myDataTypes[] = { 1,2,3 };
|
29
|
+
MyDataType* dataTypes()
|
30
|
+
{
|
31
|
+
return myDataTypes;
|
32
|
+
}
|
33
|
+
|
34
|
+
int dataTypesCount()
|
35
|
+
{
|
36
|
+
return sizeof(myDataTypes)/sizeof(MyDataType);
|
37
|
+
}
|
38
|
+
|
30
39
|
struct Bar
|
31
40
|
{
|
32
41
|
};
|
@@ -63,18 +72,18 @@ TEARDOWN(Data_Object)
|
|
63
72
|
rb_gc_start();
|
64
73
|
}
|
65
74
|
|
66
|
-
TESTCASE(
|
75
|
+
TESTCASE(data_object_construct_from_pointer)
|
67
76
|
{
|
68
|
-
MyDataType* myDataType = new MyDataType;
|
77
|
+
MyDataType* myDataType = new MyDataType(42);
|
69
78
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
70
79
|
ASSERT_EQUAL(myDataType, wrapped_foo.get());
|
71
80
|
ASSERT_EQUAL(Data_Type<MyDataType>::klass(), wrapped_foo.class_of());
|
72
81
|
ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::ruby_data_type(), false));
|
73
82
|
}
|
74
83
|
|
75
|
-
TESTCASE(
|
84
|
+
TESTCASE(data_object_construct_from_ruby_object)
|
76
85
|
{
|
77
|
-
MyDataType * myDataType = new MyDataType;
|
86
|
+
MyDataType * myDataType = new MyDataType(42);
|
78
87
|
VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::ruby_data_type(), myDataType, true);
|
79
88
|
|
80
89
|
Data_Object<MyDataType> data_object_foo(wrapped_foo);
|
@@ -84,9 +93,9 @@ TESTCASE(construct_from_ruby_object)
|
|
84
93
|
ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::ruby_data_type(), false));
|
85
94
|
}
|
86
95
|
|
87
|
-
TESTCASE(
|
96
|
+
TESTCASE(data_object_construct_from_ruby_object_and_wrong_class)
|
88
97
|
{
|
89
|
-
MyDataType * myDataType = new MyDataType;
|
98
|
+
MyDataType * myDataType = new MyDataType(42);
|
90
99
|
VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::ruby_data_type(), myDataType, true);
|
91
100
|
|
92
101
|
ASSERT_EXCEPTION_CHECK(
|
@@ -100,9 +109,9 @@ TESTCASE(construct_from_ruby_object_and_wrong_class)
|
|
100
109
|
ASSERT_EQUAL("Wrong argument type. Expected: Bar. Received: MyDataType.", ex.what()));
|
101
110
|
}
|
102
111
|
|
103
|
-
TESTCASE(
|
112
|
+
TESTCASE(data_object_copy_construct)
|
104
113
|
{
|
105
|
-
MyDataType * myDataType = new MyDataType;
|
114
|
+
MyDataType * myDataType = new MyDataType(42);
|
106
115
|
VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::ruby_data_type(), myDataType, true);
|
107
116
|
Data_Object<MyDataType> orig_data_object_foo(wrapped_foo);
|
108
117
|
Data_Object<MyDataType> data_object_foo(orig_data_object_foo);
|
@@ -113,9 +122,9 @@ TESTCASE(copy_construct)
|
|
113
122
|
ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::ruby_data_type(), false));
|
114
123
|
}
|
115
124
|
|
116
|
-
TESTCASE(
|
125
|
+
TESTCASE(data_object_move_construct)
|
117
126
|
{
|
118
|
-
MyDataType* myDataType = new MyDataType;
|
127
|
+
MyDataType* myDataType = new MyDataType(42);
|
119
128
|
|
120
129
|
Data_Object<MyDataType> wrapper1(myDataType);
|
121
130
|
Data_Object<MyDataType> wrapper2(std::move(wrapper1));
|
@@ -124,12 +133,12 @@ TESTCASE(move_construct)
|
|
124
133
|
ASSERT((wrapper1.get() == nullptr));
|
125
134
|
}
|
126
135
|
|
127
|
-
TESTCASE(
|
136
|
+
TESTCASE(data_object_move_assign)
|
128
137
|
{
|
129
|
-
MyDataType* foo1 = new MyDataType;
|
138
|
+
MyDataType* foo1 = new MyDataType(42);
|
130
139
|
Data_Object<MyDataType> wrapper1(foo1);
|
131
140
|
|
132
|
-
MyDataType* foo2 = new MyDataType;
|
141
|
+
MyDataType* foo2 = new MyDataType(42);
|
133
142
|
Data_Object<MyDataType> wrapper2(foo2);
|
134
143
|
|
135
144
|
wrapper2 = std::move(wrapper1);
|
@@ -138,74 +147,119 @@ TESTCASE(move_assign)
|
|
138
147
|
ASSERT((wrapper1.get() == nullptr));
|
139
148
|
}
|
140
149
|
|
141
|
-
TESTCASE(
|
150
|
+
TESTCASE(data_object_dereference)
|
142
151
|
{
|
143
152
|
Data_Type<MyDataType> rb_cFoo;
|
144
|
-
MyDataType * myDataType = new MyDataType;
|
153
|
+
MyDataType * myDataType = new MyDataType(42);
|
145
154
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
146
155
|
ASSERT_EQUAL(myDataType, &*wrapped_foo);
|
147
156
|
}
|
148
157
|
|
149
|
-
TESTCASE(
|
158
|
+
TESTCASE(data_object_arrow)
|
150
159
|
{
|
151
160
|
Data_Type<MyDataType> rb_cFoo;
|
152
|
-
MyDataType * myDataType = new MyDataType;
|
161
|
+
MyDataType * myDataType = new MyDataType(42);
|
153
162
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
154
163
|
ASSERT_EQUAL(42, myDataType->x);
|
155
164
|
}
|
156
165
|
|
157
|
-
TESTCASE(
|
166
|
+
TESTCASE(data_object_get)
|
158
167
|
{
|
159
168
|
Data_Type<MyDataType> rb_cFoo;
|
160
|
-
MyDataType * myDataType = new MyDataType;
|
169
|
+
MyDataType * myDataType = new MyDataType(42);
|
161
170
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
162
171
|
ASSERT_EQUAL(myDataType, wrapped_foo.get());
|
163
172
|
}
|
164
173
|
|
165
|
-
TESTCASE(
|
174
|
+
TESTCASE(data_object_to_ruby)
|
166
175
|
{
|
167
176
|
Data_Type<MyDataType> rb_cFoo;
|
168
|
-
MyDataType * myDataType = new MyDataType;
|
177
|
+
MyDataType * myDataType = new MyDataType(42);
|
169
178
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
170
179
|
ASSERT_EQUAL(String("MyDataType"), wrapped_foo.class_name());
|
171
180
|
}
|
172
181
|
|
173
|
-
TESTCASE(
|
182
|
+
TESTCASE(data_object_from_ruby)
|
174
183
|
{
|
175
184
|
Data_Type<MyDataType> rb_cFoo;
|
176
|
-
MyDataType* myDataType = new MyDataType();
|
185
|
+
MyDataType* myDataType = new MyDataType(42);
|
177
186
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
178
187
|
ASSERT_EQUAL(myDataType, wrapped_foo.get());
|
179
188
|
}
|
180
189
|
|
181
|
-
TESTCASE(
|
190
|
+
TESTCASE(data_object_from_ruby_const_ref)
|
182
191
|
{
|
183
192
|
Data_Type<MyDataType> rb_cFoo;
|
184
|
-
MyDataType * myDataType = new MyDataType;
|
193
|
+
MyDataType * myDataType = new MyDataType(42);
|
185
194
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
186
195
|
ASSERT_EQUAL(myDataType->x, detail::From_Ruby<MyDataType const &>().convert(wrapped_foo).x);
|
187
196
|
}
|
188
197
|
|
189
|
-
TESTCASE(
|
198
|
+
TESTCASE(data_object_from_ruby_copy)
|
190
199
|
{
|
191
200
|
Data_Type<MyDataType> rb_cFoo;
|
192
|
-
MyDataType * myDataType = new MyDataType;
|
201
|
+
MyDataType * myDataType = new MyDataType(42);
|
193
202
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
194
203
|
ASSERT_EQUAL(myDataType->x, detail::From_Ruby<MyDataType>().convert(wrapped_foo).x);
|
195
204
|
}
|
196
205
|
|
197
|
-
TESTCASE(
|
206
|
+
TESTCASE(data_object_return_array)
|
207
|
+
{
|
208
|
+
define_buffer<MyDataType>();
|
209
|
+
|
210
|
+
Module m = define_module("DataObjectTest").
|
211
|
+
define_module_function("data_types", &dataTypes, Return().setArray()).
|
212
|
+
define_module_function("data_types_count", &dataTypesCount);
|
213
|
+
|
214
|
+
std::string code = R"(buffer = data_types
|
215
|
+
count = data_types_count
|
216
|
+
buffer.to_ary(count))";
|
217
|
+
|
218
|
+
Array dataTypes = m.module_eval(code);
|
219
|
+
ASSERT_EQUAL(3, dataTypes.size());
|
220
|
+
|
221
|
+
std::vector<MyDataType> vector = dataTypes.to_vector<MyDataType>();
|
222
|
+
ASSERT_EQUAL(1, vector[0].x);
|
223
|
+
ASSERT_EQUAL(2, vector[1].x);
|
224
|
+
ASSERT_EQUAL(3, vector[2].x);
|
225
|
+
}
|
226
|
+
|
227
|
+
TESTCASE(data_object_update_buffer)
|
228
|
+
{
|
229
|
+
define_buffer<MyDataType>();
|
230
|
+
|
231
|
+
Class c = define_class<MyDataType>("MyDataType")
|
232
|
+
.define_constructor(Constructor<MyDataType, int>());
|
233
|
+
|
234
|
+
Module m = define_module("DataObjectTest").
|
235
|
+
define_module_function("data_types", &dataTypes, Return().setArray()).
|
236
|
+
define_module_function("data_types_count", &dataTypesCount);
|
237
|
+
|
238
|
+
std::string code = R"(buffer = data_types
|
239
|
+
my_data_type = MyDataType.new(100)
|
240
|
+
buffer.size = 3
|
241
|
+
buffer[2] = my_data_type
|
242
|
+
buffer)";
|
243
|
+
|
244
|
+
Object result = m.module_eval(code);
|
245
|
+
Data_Object<Buffer<MyDataType>> dataObject(result);
|
246
|
+
Buffer<MyDataType>* buffer = dataObject.get();
|
247
|
+
MyDataType myDataType = buffer->get(2);
|
248
|
+
ASSERT_EQUAL(100, myDataType.x);
|
249
|
+
}
|
250
|
+
|
251
|
+
TESTCASE(data_object_ruby_custom_mark)
|
198
252
|
{
|
199
253
|
test_ruby_mark_called = false;
|
200
254
|
|
201
|
-
MyDataType* myDataType = new MyDataType;
|
255
|
+
MyDataType* myDataType = new MyDataType(42);
|
202
256
|
Data_Object<MyDataType> wrapped_foo(myDataType);
|
203
257
|
rb_gc_start();
|
204
258
|
|
205
259
|
ASSERT_EQUAL(true, test_ruby_mark_called);
|
206
260
|
}
|
207
261
|
|
208
|
-
TESTCASE(
|
262
|
+
TESTCASE(data_object_ruby_custom_free)
|
209
263
|
{
|
210
264
|
test_ruby_mark_called = false;
|
211
265
|
test_destructor_called = false;
|
@@ -213,7 +267,7 @@ TESTCASE(ruby_custom_free)
|
|
213
267
|
{
|
214
268
|
// Put this code in a block so wrapped_foo is destroyed at the end of it.
|
215
269
|
// That will set its value field to Qnil allowing myDataType to be freed
|
216
|
-
MyDataType* myDataType = new MyDataType;
|
270
|
+
MyDataType* myDataType = new MyDataType(42);
|
217
271
|
Data_Object<MyDataType> wrapped_foo(myDataType, true);
|
218
272
|
|
219
273
|
// Force a mark
|