rice 4.0.4 → 4.2.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 +37 -0
- data/CONTRIBUTORS.md +2 -0
- data/Rakefile +1 -1
- data/include/rice/rice.hpp +2851 -1955
- data/include/rice/stl.hpp +1654 -287
- data/lib/mkmf-rice.rb +5 -2
- data/lib/version.rb +1 -1
- data/rice/Arg.hpp +6 -6
- data/rice/Arg.ipp +8 -9
- data/rice/Constructor.hpp +2 -2
- data/rice/Data_Object.ipp +69 -15
- data/rice/Data_Object_defn.hpp +1 -15
- data/rice/Data_Type.ipp +56 -86
- data/rice/Data_Type_defn.hpp +14 -17
- data/rice/Director.hpp +0 -1
- data/rice/Enum.ipp +31 -22
- data/rice/Exception.ipp +2 -3
- data/rice/Exception_defn.hpp +5 -5
- data/rice/HandlerRegistration.hpp +15 -0
- data/rice/Return.hpp +5 -4
- data/rice/Return.ipp +8 -3
- data/rice/detail/ExceptionHandler.hpp +8 -0
- data/rice/detail/ExceptionHandler.ipp +28 -0
- data/rice/detail/{Exception_Handler_defn.hpp → ExceptionHandler_defn.hpp} +17 -21
- data/rice/detail/HandlerRegistry.hpp +51 -0
- data/rice/detail/HandlerRegistry.ipp +20 -0
- data/rice/detail/InstanceRegistry.hpp +34 -0
- data/rice/detail/InstanceRegistry.ipp +50 -0
- data/rice/detail/MethodInfo.ipp +1 -1
- data/rice/detail/NativeAttribute.hpp +26 -15
- data/rice/detail/NativeAttribute.ipp +76 -47
- data/rice/detail/NativeFunction.hpp +64 -14
- data/rice/detail/NativeFunction.ipp +138 -86
- data/rice/detail/NativeIterator.hpp +49 -0
- data/rice/detail/NativeIterator.ipp +102 -0
- data/rice/detail/NativeRegistry.hpp +31 -0
- data/rice/detail/{method_data.ipp → NativeRegistry.ipp} +20 -16
- data/rice/detail/Registries.hpp +26 -0
- data/rice/detail/Registries.ipp +23 -0
- data/rice/detail/RubyFunction.hpp +6 -11
- data/rice/detail/RubyFunction.ipp +10 -22
- data/rice/detail/Type.hpp +1 -1
- data/rice/detail/Type.ipp +2 -2
- data/rice/detail/TypeRegistry.hpp +8 -11
- data/rice/detail/TypeRegistry.ipp +3 -28
- data/rice/detail/Wrapper.hpp +0 -2
- data/rice/detail/Wrapper.ipp +74 -24
- data/rice/detail/cpp_protect.hpp +93 -0
- data/rice/detail/default_allocation_func.ipp +1 -1
- data/rice/detail/from_ruby.ipp +206 -2
- data/rice/detail/to_ruby.ipp +39 -5
- data/rice/detail/to_ruby_defn.hpp +1 -1
- data/rice/forward_declares.ipp +6 -0
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +0 -6
- data/rice/rice.hpp +29 -24
- data/rice/stl.hpp +6 -1
- data/sample/callbacks/extconf.rb +0 -1
- data/sample/enum/extconf.rb +0 -1
- data/sample/inheritance/extconf.rb +0 -1
- data/sample/map/extconf.rb +0 -1
- data/test/embed_ruby.cpp +6 -15
- data/test/ext/t1/extconf.rb +0 -1
- data/test/ext/t2/extconf.rb +0 -1
- data/test/extconf.rb +0 -1
- data/test/test_Array.cpp +20 -24
- data/test/test_Attribute.cpp +6 -6
- data/test/test_Class.cpp +8 -47
- data/test/test_Constructor.cpp +0 -2
- data/test/test_Data_Object.cpp +25 -11
- data/test/test_Data_Type.cpp +124 -28
- data/test/test_Director.cpp +12 -13
- data/test/test_Enum.cpp +65 -26
- data/test/test_Inheritance.cpp +9 -9
- data/test/test_Iterator.cpp +134 -5
- data/test/test_Keep_Alive.cpp +7 -7
- data/test/test_Keep_Alive_No_Wrapper.cpp +80 -0
- data/test/test_Memory_Management.cpp +1 -1
- data/test/test_Module.cpp +25 -62
- data/test/test_Object.cpp +75 -3
- data/test/test_Ownership.cpp +12 -13
- data/test/test_Self.cpp +12 -13
- data/test/test_Stl_Map.cpp +696 -0
- data/test/test_Stl_Optional.cpp +3 -3
- data/test/test_Stl_Pair.cpp +38 -2
- data/test/test_Stl_Reference_Wrapper.cpp +102 -0
- data/test/test_Stl_SmartPointer.cpp +49 -9
- data/test/test_Stl_String.cpp +5 -2
- data/test/test_Stl_Unordered_Map.cpp +697 -0
- data/test/test_Stl_Variant.cpp +346 -0
- data/test/test_Stl_Vector.cpp +200 -41
- data/test/test_Struct.cpp +3 -3
- data/test/test_To_From_Ruby.cpp +8 -2
- data/test/test_Tracking.cpp +239 -0
- data/test/unittest.hpp +21 -4
- metadata +24 -13
- data/rice/detail/Exception_Handler.hpp +0 -8
- data/rice/detail/Exception_Handler.ipp +0 -28
- data/rice/detail/Iterator.hpp +0 -23
- data/rice/detail/Iterator.ipp +0 -47
- data/rice/detail/function_traits.hpp +0 -124
- data/rice/detail/method_data.hpp +0 -29
- data/rice/detail/rice_traits.hpp +0 -116
- data/rice/ruby_try_catch.hpp +0 -86
data/test/test_Struct.cpp
CHANGED
@@ -159,7 +159,7 @@ TESTCASE(instance_bracket_index)
|
|
159
159
|
ASSERT_EQUAL(detail::to_ruby(3), p[2].value());
|
160
160
|
}
|
161
161
|
|
162
|
-
|
162
|
+
TESTCASE(instance_swap)
|
163
163
|
{
|
164
164
|
Struct s(define_3d_point());
|
165
165
|
|
@@ -171,7 +171,7 @@ TESTCASE(instance_bracket_index)
|
|
171
171
|
Array args2(a2);
|
172
172
|
Struct::Instance p2(s, args2);
|
173
173
|
|
174
|
-
|
174
|
+
std::swap(p1, p2);
|
175
175
|
|
176
176
|
ASSERT_EQUAL(detail::to_ruby(4), rb_struct_getmember(p1, rb_intern("x")));
|
177
177
|
ASSERT_EQUAL(detail::to_ruby(5), rb_struct_getmember(p1, rb_intern("y")));
|
@@ -180,7 +180,7 @@ TESTCASE(instance_bracket_index)
|
|
180
180
|
ASSERT_EQUAL(detail::to_ruby(1), rb_struct_getmember(p2, rb_intern("x")));
|
181
181
|
ASSERT_EQUAL(detail::to_ruby(2), rb_struct_getmember(p2, rb_intern("y")));
|
182
182
|
ASSERT_EQUAL(detail::to_ruby(3), rb_struct_getmember(p2, rb_intern("z")));
|
183
|
-
}
|
183
|
+
}
|
184
184
|
|
185
185
|
/**
|
186
186
|
* Issue 59 - Copy constructor compilation problem.
|
data/test/test_To_From_Ruby.cpp
CHANGED
@@ -229,7 +229,7 @@ TESTCASE(unsigned_long_long_from_ruby)
|
|
229
229
|
ASSERT_EXCEPTION_CHECK(
|
230
230
|
Exception,
|
231
231
|
detail::From_Ruby<unsigned long long>().convert(rb_str_new2("bad value")),
|
232
|
-
|
232
|
+
ASSERT(std::string(ex.what()).find("no implicit conversion") == 0)
|
233
233
|
);
|
234
234
|
}
|
235
235
|
|
@@ -322,6 +322,12 @@ TESTCASE(char_const_ptr_to_ruby)
|
|
322
322
|
{
|
323
323
|
ASSERT(rb_equal(String("").value(), detail::to_ruby((char const *)"")));
|
324
324
|
ASSERT(rb_equal(String("foo").value(), detail::to_ruby((char const *)"foo")));
|
325
|
+
ASSERT(rb_equal(String("foo").value(), detail::to_ruby("foo")));
|
326
|
+
}
|
327
|
+
|
328
|
+
TESTCASE(char_const_array_to_ruby_symbol)
|
329
|
+
{
|
330
|
+
ASSERT(rb_equal(Symbol("foo").value(), detail::to_ruby(":foo")));
|
325
331
|
}
|
326
332
|
|
327
333
|
TESTCASE(char_const_ptr_from_ruby)
|
@@ -390,4 +396,4 @@ TESTCASE(char_star_from_ruby)
|
|
390
396
|
detail::From_Ruby<const char*>().convert(rb_float_new(11.11)),
|
391
397
|
ASSERT_EQUAL("wrong argument type Float (expected String)", ex.what())
|
392
398
|
);
|
393
|
-
}
|
399
|
+
}
|
@@ -0,0 +1,239 @@
|
|
1
|
+
#include "unittest.hpp"
|
2
|
+
#include "embed_ruby.hpp"
|
3
|
+
|
4
|
+
#include <rice/rice.hpp>
|
5
|
+
|
6
|
+
using namespace Rice;
|
7
|
+
|
8
|
+
TESTSUITE(Tracking);
|
9
|
+
|
10
|
+
namespace
|
11
|
+
{
|
12
|
+
class MyClass
|
13
|
+
{
|
14
|
+
};
|
15
|
+
|
16
|
+
class Factory
|
17
|
+
{
|
18
|
+
public:
|
19
|
+
static void reset()
|
20
|
+
{
|
21
|
+
delete Factory::instance_;
|
22
|
+
Factory::instance_ = nullptr;
|
23
|
+
}
|
24
|
+
|
25
|
+
public:
|
26
|
+
Factory* factory()
|
27
|
+
{
|
28
|
+
return this;
|
29
|
+
}
|
30
|
+
|
31
|
+
MyClass* transferPointer()
|
32
|
+
{
|
33
|
+
return new MyClass();
|
34
|
+
}
|
35
|
+
|
36
|
+
MyClass* keepPointer()
|
37
|
+
{
|
38
|
+
return this->instance();
|
39
|
+
}
|
40
|
+
|
41
|
+
MyClass& keepReference()
|
42
|
+
{
|
43
|
+
return *this->instance();
|
44
|
+
}
|
45
|
+
|
46
|
+
MyClass value()
|
47
|
+
{
|
48
|
+
return MyClass();
|
49
|
+
}
|
50
|
+
|
51
|
+
MyClass moveValue()
|
52
|
+
{
|
53
|
+
return std::move(MyClass());
|
54
|
+
}
|
55
|
+
|
56
|
+
MyClass* instance()
|
57
|
+
{
|
58
|
+
if (!instance_)
|
59
|
+
{
|
60
|
+
instance_ = new MyClass();
|
61
|
+
}
|
62
|
+
return instance_;
|
63
|
+
}
|
64
|
+
|
65
|
+
public:
|
66
|
+
static inline MyClass* instance_ = nullptr;
|
67
|
+
};
|
68
|
+
}
|
69
|
+
|
70
|
+
SETUP(Tracking)
|
71
|
+
{
|
72
|
+
embed_ruby();
|
73
|
+
|
74
|
+
define_class<MyClass>("MyClass");
|
75
|
+
|
76
|
+
define_class<Factory>("Factory").
|
77
|
+
define_constructor(Constructor<Factory>()).
|
78
|
+
define_method("factory", &Factory::factory).
|
79
|
+
define_method("value", &Factory::value).
|
80
|
+
define_method("move_value", &Factory::moveValue).
|
81
|
+
define_method("transfer_pointer", &Factory::transferPointer, Return().takeOwnership()).
|
82
|
+
define_method("keep_pointer", &Factory::keepPointer).
|
83
|
+
define_method("copy_reference", &Factory::keepReference, Return().takeOwnership()).
|
84
|
+
define_method("keep_reference", &Factory::keepReference);
|
85
|
+
}
|
86
|
+
|
87
|
+
TEARDOWN(Tracking)
|
88
|
+
{
|
89
|
+
detail::Registries::instance.instances.isEnabled = true;
|
90
|
+
}
|
91
|
+
|
92
|
+
TESTCASE(TransferPointer)
|
93
|
+
{
|
94
|
+
detail::Registries::instance.instances.isEnabled = true;
|
95
|
+
Factory::reset();
|
96
|
+
|
97
|
+
Module m = define_module("TestingModule");
|
98
|
+
Object factory = m.module_eval("Factory.new");
|
99
|
+
|
100
|
+
Data_Object<MyClass> my_class1 = factory.call("transfer_pointer");
|
101
|
+
Data_Object<MyClass> my_class2 = factory.call("transfer_pointer");
|
102
|
+
|
103
|
+
ASSERT(!my_class1.is_equal(my_class2));
|
104
|
+
ASSERT_NOT_EQUAL(my_class1.get(), my_class2.get());
|
105
|
+
}
|
106
|
+
|
107
|
+
TESTCASE(KeepPointer)
|
108
|
+
{
|
109
|
+
detail::Registries::instance.instances.isEnabled = true;
|
110
|
+
Factory::reset();
|
111
|
+
|
112
|
+
Module m = define_module("TestingModule");
|
113
|
+
|
114
|
+
Object factory = m.module_eval("Factory.new");
|
115
|
+
|
116
|
+
Data_Object<MyClass> my_class1 = factory.call("keep_pointer");
|
117
|
+
Data_Object<MyClass> my_class2 = factory.call("keep_pointer");
|
118
|
+
|
119
|
+
ASSERT(my_class1.is_equal(my_class2));
|
120
|
+
ASSERT_EQUAL(my_class1.get(), my_class2.get());
|
121
|
+
}
|
122
|
+
|
123
|
+
TESTCASE(KeepPointerWithoutTracking)
|
124
|
+
{
|
125
|
+
detail::Registries::instance.instances.isEnabled = false;
|
126
|
+
Factory::reset();
|
127
|
+
|
128
|
+
Module m = define_module("TestingModule");
|
129
|
+
|
130
|
+
Object factory = m.module_eval("Factory.new");
|
131
|
+
|
132
|
+
Data_Object<MyClass> my_class1 = factory.call("keep_pointer");
|
133
|
+
Data_Object<MyClass> my_class2 = factory.call("keep_pointer");
|
134
|
+
|
135
|
+
ASSERT(!my_class1.is_equal(my_class2));
|
136
|
+
ASSERT_EQUAL(my_class1.get(), my_class2.get());
|
137
|
+
}
|
138
|
+
|
139
|
+
TESTCASE(KeepReference)
|
140
|
+
{
|
141
|
+
detail::Registries::instance.instances.isEnabled = true;
|
142
|
+
Factory::reset();
|
143
|
+
|
144
|
+
Module m = define_module("TestingModule");
|
145
|
+
|
146
|
+
Object factory = m.module_eval("Factory.new");
|
147
|
+
|
148
|
+
Data_Object<MyClass> my_class1 = factory.call("keep_reference");
|
149
|
+
Data_Object<MyClass> my_class2 = factory.call("keep_reference");
|
150
|
+
|
151
|
+
ASSERT(my_class1.is_equal(my_class2));
|
152
|
+
ASSERT_EQUAL(my_class1.get(), my_class2.get());
|
153
|
+
}
|
154
|
+
|
155
|
+
TESTCASE(KeepReferenceWithoutTracking)
|
156
|
+
{
|
157
|
+
detail::Registries::instance.instances.isEnabled = false;
|
158
|
+
Factory::reset();
|
159
|
+
|
160
|
+
Module m = define_module("TestingModule");
|
161
|
+
|
162
|
+
Object factory = m.module_eval("Factory.new");
|
163
|
+
|
164
|
+
Data_Object<MyClass> my_class1 = factory.call("keep_reference");
|
165
|
+
Data_Object<MyClass> my_class2 = factory.call("keep_reference");
|
166
|
+
|
167
|
+
ASSERT(!my_class1.is_equal(my_class2));
|
168
|
+
ASSERT_EQUAL(my_class1.get(), my_class2.get());
|
169
|
+
}
|
170
|
+
|
171
|
+
TESTCASE(CopyReference)
|
172
|
+
{
|
173
|
+
detail::Registries::instance.instances.isEnabled = true;
|
174
|
+
Factory::reset();
|
175
|
+
|
176
|
+
Module m = define_module("TestingModule");
|
177
|
+
Object factory = m.module_eval("Factory.new");
|
178
|
+
|
179
|
+
Data_Object<MyClass> my_class1 = factory.call("copy_reference");
|
180
|
+
Data_Object<MyClass> my_class2 = factory.call("copy_reference");
|
181
|
+
|
182
|
+
ASSERT(!my_class1.is_equal(my_class2));
|
183
|
+
ASSERT_NOT_EQUAL(my_class1.get(), my_class2.get());
|
184
|
+
}
|
185
|
+
|
186
|
+
TESTCASE(TransferValue)
|
187
|
+
{
|
188
|
+
detail::Registries::instance.instances.isEnabled = true;
|
189
|
+
Factory::reset();
|
190
|
+
|
191
|
+
Module m = define_module("TestingModule");
|
192
|
+
Object factory = m.module_eval("Factory.new");
|
193
|
+
|
194
|
+
Data_Object<MyClass> my_class1 = factory.call("value");
|
195
|
+
Data_Object<MyClass> my_class2 = factory.call("value");
|
196
|
+
|
197
|
+
ASSERT(!my_class1.is_equal(my_class2));
|
198
|
+
ASSERT_NOT_EQUAL(my_class1.get(), my_class2.get());
|
199
|
+
}
|
200
|
+
|
201
|
+
TESTCASE(MoveValue)
|
202
|
+
{
|
203
|
+
detail::Registries::instance.instances.isEnabled = true;
|
204
|
+
Factory::reset();
|
205
|
+
|
206
|
+
Module m = define_module("TestingModule");
|
207
|
+
Object factory = m.module_eval("Factory.new");
|
208
|
+
|
209
|
+
Data_Object<MyClass> my_class1 = factory.call("move_value");
|
210
|
+
Data_Object<MyClass> my_class2 = factory.call("move_value");
|
211
|
+
|
212
|
+
ASSERT(!my_class1.is_equal(my_class2));
|
213
|
+
ASSERT_NOT_EQUAL(my_class1.get(), my_class2.get());
|
214
|
+
}
|
215
|
+
|
216
|
+
TESTCASE(RubyObjectGced)
|
217
|
+
{
|
218
|
+
detail::Registries::instance.instances.isEnabled = true;
|
219
|
+
Factory::reset();
|
220
|
+
|
221
|
+
Module m = define_module("TestingModule");
|
222
|
+
Object factory = m.module_eval("Factory.new");
|
223
|
+
|
224
|
+
{
|
225
|
+
// Track the C++ object returned by keepPointer
|
226
|
+
Data_Object<MyClass> my_class1 = factory.call("keep_pointer");
|
227
|
+
rb_gc_start();
|
228
|
+
}
|
229
|
+
|
230
|
+
// Make my_class1 invalid
|
231
|
+
rb_gc_start();
|
232
|
+
|
233
|
+
// Get the object again - this should *not* return the previous value
|
234
|
+
Data_Object<MyClass> my_class2 = factory.call("keep_pointer");
|
235
|
+
|
236
|
+
// Call a method on the ruby object
|
237
|
+
String className = my_class2.class_name();
|
238
|
+
ASSERT_EQUAL(std::string("MyClass"), className.str());
|
239
|
+
}
|
data/test/unittest.hpp
CHANGED
@@ -214,6 +214,12 @@ inline bool is_not_equal(T const & t, U const & u)
|
|
214
214
|
|
215
215
|
extern size_t assertions;
|
216
216
|
|
217
|
+
template<typename S, typename T, typename = void>
|
218
|
+
struct is_streamable: std::false_type {};
|
219
|
+
|
220
|
+
template<typename S, typename T>
|
221
|
+
struct is_streamable<S, T, std::void_t<decltype(std::declval<S&>()<<std::declval<T>())>>: std::true_type {};
|
222
|
+
|
217
223
|
template<typename T, typename U>
|
218
224
|
void assert_equal(
|
219
225
|
T const & t,
|
@@ -226,10 +232,13 @@ void assert_equal(
|
|
226
232
|
if(!is_equal(t, u))
|
227
233
|
{
|
228
234
|
std::stringstream strm;
|
229
|
-
strm << "Assertion failed: "
|
230
|
-
|
231
|
-
|
232
|
-
|
235
|
+
strm << "Assertion failed: ";
|
236
|
+
|
237
|
+
if constexpr (is_streamable<std::stringstream, T>::value && is_streamable<std::stringstream, U>::value)
|
238
|
+
{
|
239
|
+
strm << s_t << " != " << s_u << " (" << u << ") ";
|
240
|
+
}
|
241
|
+
strm << " at " << file << ":" << line;
|
233
242
|
throw Assertion_Failed(strm.str());
|
234
243
|
}
|
235
244
|
}
|
@@ -254,6 +263,14 @@ void assert_not_equal(
|
|
254
263
|
}
|
255
264
|
}
|
256
265
|
|
266
|
+
#define FAIL(message, expect, got) \
|
267
|
+
do \
|
268
|
+
{ \
|
269
|
+
std::stringstream strm; \
|
270
|
+
strm << message << " expected: " << (expect) << " got: " << (got); \
|
271
|
+
throw Assertion_Failed(strm.str()); \
|
272
|
+
} while(0)
|
273
|
+
|
257
274
|
#define ASSERT_EQUAL(x, y) \
|
258
275
|
do \
|
259
276
|
{ \
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Brannan
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-01-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -95,15 +95,18 @@ files:
|
|
95
95
|
- rice/Exception.hpp
|
96
96
|
- rice/Exception.ipp
|
97
97
|
- rice/Exception_defn.hpp
|
98
|
+
- rice/HandlerRegistration.hpp
|
98
99
|
- rice/Identifier.hpp
|
99
100
|
- rice/Identifier.ipp
|
100
101
|
- rice/Return.hpp
|
101
102
|
- rice/Return.ipp
|
102
|
-
- rice/detail/
|
103
|
-
- rice/detail/
|
104
|
-
- rice/detail/
|
105
|
-
- rice/detail/
|
106
|
-
- rice/detail/
|
103
|
+
- rice/detail/ExceptionHandler.hpp
|
104
|
+
- rice/detail/ExceptionHandler.ipp
|
105
|
+
- rice/detail/ExceptionHandler_defn.hpp
|
106
|
+
- rice/detail/HandlerRegistry.hpp
|
107
|
+
- rice/detail/HandlerRegistry.ipp
|
108
|
+
- rice/detail/InstanceRegistry.hpp
|
109
|
+
- rice/detail/InstanceRegistry.ipp
|
107
110
|
- rice/detail/Jump_Tag.hpp
|
108
111
|
- rice/detail/MethodInfo.hpp
|
109
112
|
- rice/detail/MethodInfo.ipp
|
@@ -111,6 +114,12 @@ files:
|
|
111
114
|
- rice/detail/NativeAttribute.ipp
|
112
115
|
- rice/detail/NativeFunction.hpp
|
113
116
|
- rice/detail/NativeFunction.ipp
|
117
|
+
- rice/detail/NativeIterator.hpp
|
118
|
+
- rice/detail/NativeIterator.ipp
|
119
|
+
- rice/detail/NativeRegistry.hpp
|
120
|
+
- rice/detail/NativeRegistry.ipp
|
121
|
+
- rice/detail/Registries.hpp
|
122
|
+
- rice/detail/Registries.ipp
|
114
123
|
- rice/detail/RubyFunction.hpp
|
115
124
|
- rice/detail/RubyFunction.ipp
|
116
125
|
- rice/detail/Type.hpp
|
@@ -119,15 +128,12 @@ files:
|
|
119
128
|
- rice/detail/TypeRegistry.ipp
|
120
129
|
- rice/detail/Wrapper.hpp
|
121
130
|
- rice/detail/Wrapper.ipp
|
131
|
+
- rice/detail/cpp_protect.hpp
|
122
132
|
- rice/detail/default_allocation_func.hpp
|
123
133
|
- rice/detail/default_allocation_func.ipp
|
124
134
|
- rice/detail/from_ruby.hpp
|
125
135
|
- rice/detail/from_ruby.ipp
|
126
136
|
- rice/detail/from_ruby_defn.hpp
|
127
|
-
- rice/detail/function_traits.hpp
|
128
|
-
- rice/detail/method_data.hpp
|
129
|
-
- rice/detail/method_data.ipp
|
130
|
-
- rice/detail/rice_traits.hpp
|
131
137
|
- rice/detail/ruby.hpp
|
132
138
|
- rice/detail/to_ruby.hpp
|
133
139
|
- rice/detail/to_ruby.ipp
|
@@ -137,7 +143,6 @@ files:
|
|
137
143
|
- rice/global_function.ipp
|
138
144
|
- rice/rice.hpp
|
139
145
|
- rice/ruby_mark.hpp
|
140
|
-
- rice/ruby_try_catch.hpp
|
141
146
|
- rice/stl.hpp
|
142
147
|
- sample/callbacks/extconf.rb
|
143
148
|
- sample/callbacks/sample_callbacks.cpp
|
@@ -180,20 +185,26 @@ files:
|
|
180
185
|
- test/test_Iterator.cpp
|
181
186
|
- test/test_Jump_Tag.cpp
|
182
187
|
- test/test_Keep_Alive.cpp
|
188
|
+
- test/test_Keep_Alive_No_Wrapper.cpp
|
183
189
|
- test/test_Memory_Management.cpp
|
184
190
|
- test/test_Module.cpp
|
185
191
|
- test/test_Object.cpp
|
186
192
|
- test/test_Ownership.cpp
|
187
193
|
- test/test_Self.cpp
|
194
|
+
- test/test_Stl_Map.cpp
|
188
195
|
- test/test_Stl_Optional.cpp
|
189
196
|
- test/test_Stl_Pair.cpp
|
197
|
+
- test/test_Stl_Reference_Wrapper.cpp
|
190
198
|
- test/test_Stl_SmartPointer.cpp
|
191
199
|
- test/test_Stl_String.cpp
|
200
|
+
- test/test_Stl_Unordered_Map.cpp
|
201
|
+
- test/test_Stl_Variant.cpp
|
192
202
|
- test/test_Stl_Vector.cpp
|
193
203
|
- test/test_String.cpp
|
194
204
|
- test/test_Struct.cpp
|
195
205
|
- test/test_Symbol.cpp
|
196
206
|
- test/test_To_From_Ruby.cpp
|
207
|
+
- test/test_Tracking.cpp
|
197
208
|
- test/test_global_functions.cpp
|
198
209
|
- test/unittest.cpp
|
199
210
|
- test/unittest.hpp
|
@@ -220,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
220
231
|
- !ruby/object:Gem::Version
|
221
232
|
version: '0'
|
222
233
|
requirements: []
|
223
|
-
rubygems_version: 3.3
|
234
|
+
rubygems_version: 3.5.3
|
224
235
|
signing_key:
|
225
236
|
specification_version: 4
|
226
237
|
summary: Ruby Interface for C++ Extensions
|
@@ -1,28 +0,0 @@
|
|
1
|
-
namespace Rice::detail
|
2
|
-
{
|
3
|
-
inline VALUE Rice::detail::Default_Exception_Handler::handle_exception() const
|
4
|
-
{
|
5
|
-
throw;
|
6
|
-
}
|
7
|
-
|
8
|
-
template <typename Exception_T, typename Functor_T>
|
9
|
-
inline Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::
|
10
|
-
Functor_Exception_Handler(Functor_T handler, std::shared_ptr<Exception_Handler> next_exception_handler)
|
11
|
-
: handler_(handler), next_exception_handler_(next_exception_handler)
|
12
|
-
{
|
13
|
-
}
|
14
|
-
|
15
|
-
template <typename Exception_T, typename Functor_T>
|
16
|
-
inline VALUE Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::handle_exception() const
|
17
|
-
{
|
18
|
-
try
|
19
|
-
{
|
20
|
-
return this->next_exception_handler_->handle_exception();
|
21
|
-
}
|
22
|
-
catch (Exception_T const& ex)
|
23
|
-
{
|
24
|
-
handler_(ex);
|
25
|
-
throw;
|
26
|
-
}
|
27
|
-
}
|
28
|
-
}
|
data/rice/detail/Iterator.hpp
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
#ifndef Rice_Iterator__hpp_
|
2
|
-
#define Rice_Iterator__hpp_
|
3
|
-
|
4
|
-
namespace Rice::detail
|
5
|
-
{
|
6
|
-
template<typename T, typename Iterator_T>
|
7
|
-
class Iterator
|
8
|
-
{
|
9
|
-
public:
|
10
|
-
static VALUE call(VALUE self);
|
11
|
-
|
12
|
-
public:
|
13
|
-
Iterator(Iterator_T(T::* begin)(), Iterator_T(T::* end)());
|
14
|
-
virtual ~Iterator() = default;
|
15
|
-
VALUE operator()(VALUE self);
|
16
|
-
|
17
|
-
private:
|
18
|
-
Iterator_T(T::* begin_)();
|
19
|
-
Iterator_T(T::* end_)();
|
20
|
-
};
|
21
|
-
}
|
22
|
-
|
23
|
-
#endif // Rice_Iterator__hpp_
|
data/rice/detail/Iterator.ipp
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
#ifndef Rice_Iterator__ipp_
|
2
|
-
#define Rice_Iterator__ipp_
|
3
|
-
|
4
|
-
#include <iterator>
|
5
|
-
#include <functional>
|
6
|
-
|
7
|
-
#include "../Data_Object_defn.hpp"
|
8
|
-
#include "method_data.hpp"
|
9
|
-
|
10
|
-
namespace Rice::detail
|
11
|
-
{
|
12
|
-
template <typename T, typename Iterator_T>
|
13
|
-
inline Iterator<T, Iterator_T>::
|
14
|
-
Iterator(Iterator_T(T::* begin)(), Iterator_T(T::* end)()) :
|
15
|
-
begin_(begin), end_(end)
|
16
|
-
{
|
17
|
-
}
|
18
|
-
|
19
|
-
template<typename T, typename Iterator_T>
|
20
|
-
inline VALUE Iterator<T, Iterator_T>::
|
21
|
-
call(VALUE self)
|
22
|
-
{
|
23
|
-
using Iter_T = Iterator<T, Iterator_T>;
|
24
|
-
Iter_T* iterator = detail::MethodData::data<Iter_T*>();
|
25
|
-
return iterator->operator()(self);
|
26
|
-
}
|
27
|
-
|
28
|
-
template<typename T, typename Iterator_T>
|
29
|
-
inline VALUE Iterator<T, Iterator_T>::
|
30
|
-
operator()(VALUE self)
|
31
|
-
{
|
32
|
-
using Value_T = typename std::iterator_traits<Iterator_T>::value_type;
|
33
|
-
|
34
|
-
Data_Object<T> obj(self);
|
35
|
-
Iterator_T it = std::invoke(this->begin_, *obj);
|
36
|
-
Iterator_T end = std::invoke(this->end_, *obj);
|
37
|
-
|
38
|
-
for (; it != end; ++it)
|
39
|
-
{
|
40
|
-
protect(rb_yield, detail::To_Ruby<Value_T>().convert(*it));
|
41
|
-
}
|
42
|
-
|
43
|
-
return self;
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
|
-
#endif // Rice_Iterator__ipp_
|
@@ -1,124 +0,0 @@
|
|
1
|
-
#ifndef Rice__detail__function_traits__hpp_
|
2
|
-
#define Rice__detail__function_traits__hpp_
|
3
|
-
|
4
|
-
#include <tuple>
|
5
|
-
|
6
|
-
namespace Rice::detail
|
7
|
-
{
|
8
|
-
// -------------- Function Traits --------------
|
9
|
-
// Base class
|
10
|
-
template<typename Function_T>
|
11
|
-
struct function_traits;
|
12
|
-
|
13
|
-
// Base definition that support functors and lambdas
|
14
|
-
template<class Function_T>
|
15
|
-
struct function_traits
|
16
|
-
{
|
17
|
-
private:
|
18
|
-
using functor_t = function_traits<decltype(&Function_T::operator())>;
|
19
|
-
|
20
|
-
public:
|
21
|
-
using arg_types = typename functor_t::arg_types;
|
22
|
-
|
23
|
-
static constexpr std::size_t arity = functor_t::arity - 1;
|
24
|
-
|
25
|
-
template<std::size_t N>
|
26
|
-
using nth_arg = typename std::tuple_element<N, typename functor_t::arg_types>::type;
|
27
|
-
|
28
|
-
using return_type = typename functor_t::return_type;
|
29
|
-
using class_type = std::nullptr_t;
|
30
|
-
};
|
31
|
-
|
32
|
-
// Specialization for functions, member functions and static member functions
|
33
|
-
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
34
|
-
struct function_traits<Return_T(Class_T, Arg_Ts...)>
|
35
|
-
{
|
36
|
-
using arg_types = std::tuple<Arg_Ts...>;
|
37
|
-
|
38
|
-
static constexpr std::size_t arity = sizeof...(Arg_Ts);
|
39
|
-
|
40
|
-
template<std::size_t N>
|
41
|
-
using nth_arg = typename std::tuple_element<N, arg_types>::type;
|
42
|
-
|
43
|
-
using return_type = Return_T;
|
44
|
-
using class_type = Class_T;
|
45
|
-
};
|
46
|
-
|
47
|
-
// Free functions and static member functions passed by pointer or reference
|
48
|
-
template<typename Return_T, typename ...Arg_Ts>
|
49
|
-
struct function_traits<Return_T(*)(Arg_Ts...)> : public function_traits<Return_T(std::nullptr_t, Arg_Ts...)>
|
50
|
-
{
|
51
|
-
};
|
52
|
-
|
53
|
-
template<typename Return_T, typename ...Arg_Ts>
|
54
|
-
struct function_traits<Return_T(&)(Arg_Ts...)> : public function_traits<Return_T(std::nullptr_t, Arg_Ts...)>
|
55
|
-
{
|
56
|
-
};
|
57
|
-
|
58
|
-
// Member Functions
|
59
|
-
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
60
|
-
struct function_traits<Return_T(Class_T::*)(Arg_Ts...)> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
61
|
-
{
|
62
|
-
};
|
63
|
-
|
64
|
-
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
65
|
-
struct function_traits<Return_T(Class_T::*)(Arg_Ts...) const> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
66
|
-
{
|
67
|
-
};
|
68
|
-
|
69
|
-
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
70
|
-
struct function_traits<Return_T(Class_T::*)(Arg_Ts...) noexcept> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
71
|
-
{
|
72
|
-
};
|
73
|
-
|
74
|
-
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
75
|
-
struct function_traits<Return_T(Class_T::*)(Arg_Ts...) const noexcept> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
76
|
-
{
|
77
|
-
};
|
78
|
-
|
79
|
-
// Functors and lambdas
|
80
|
-
template<class Function_T>
|
81
|
-
struct function_traits<Function_T&> : public function_traits<Function_T>
|
82
|
-
{
|
83
|
-
};
|
84
|
-
|
85
|
-
template<class Function_T>
|
86
|
-
struct function_traits<Function_T&&> : public function_traits<Function_T>
|
87
|
-
{
|
88
|
-
};
|
89
|
-
|
90
|
-
// -------------- Method Traits --------------
|
91
|
-
// Declare struct
|
92
|
-
template<typename Function_T, bool IsMethod, typename = void>
|
93
|
-
struct method_traits;
|
94
|
-
|
95
|
-
// Functions that do not have a self parameter
|
96
|
-
template<typename Function_T, bool IsMethod>
|
97
|
-
struct method_traits<Function_T, IsMethod, std::enable_if_t<!IsMethod>>
|
98
|
-
{
|
99
|
-
using Self_T = std::nullptr_t;
|
100
|
-
using Arg_Ts = typename function_traits<Function_T>::arg_types;
|
101
|
-
static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
|
102
|
-
};
|
103
|
-
|
104
|
-
// Functions that do have a self parameter (thus we call them methods)
|
105
|
-
template<typename Function_T, bool IsMethod>
|
106
|
-
struct method_traits<Function_T, IsMethod, std::enable_if_t<IsMethod && std::is_same_v<typename function_traits<Function_T>::class_type, std::nullptr_t>>>
|
107
|
-
{
|
108
|
-
using Self_T = typename function_traits<Function_T>::template nth_arg<0>;
|
109
|
-
using Arg_Ts = typename tuple_shift<typename function_traits<Function_T>::arg_types>::type;
|
110
|
-
static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
|
111
|
-
};
|
112
|
-
|
113
|
-
// Member functions that have an implied self parameter of an object instance
|
114
|
-
template<typename Function_T, bool IsMethod>
|
115
|
-
struct method_traits<Function_T, IsMethod, std::enable_if_t<IsMethod && !std::is_same_v<typename function_traits<Function_T>::class_type, std::nullptr_t>>>
|
116
|
-
{
|
117
|
-
using Self_T = typename function_traits<Function_T>::class_type;
|
118
|
-
using Arg_Ts = typename function_traits<Function_T>::arg_types;
|
119
|
-
static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
|
120
|
-
};
|
121
|
-
|
122
|
-
}
|
123
|
-
|
124
|
-
#endif // Rice__detail__function_traits__hpp_
|