rice 4.3.2 → 4.5.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 +66 -25
- data/README.md +7 -2
- data/Rakefile +7 -1
- data/include/rice/rice.hpp +7321 -4470
- data/include/rice/stl.hpp +769 -222
- data/lib/mkmf-rice.rb +37 -95
- data/rice/Address_Registration_Guard.hpp +72 -3
- data/rice/Arg.hpp +19 -5
- data/rice/Arg.ipp +24 -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 +74 -3
- data/rice/Data_Object.ipp +324 -32
- data/rice/Data_Type.hpp +215 -3
- data/rice/Data_Type.ipp +125 -64
- data/rice/Director.hpp +0 -2
- data/rice/Enum.hpp +4 -6
- data/rice/Enum.ipp +101 -57
- data/rice/Exception.hpp +62 -2
- data/rice/Exception.ipp +7 -12
- data/rice/JumpException.hpp +44 -0
- data/rice/JumpException.ipp +48 -0
- data/rice/MemoryView.hpp +11 -0
- data/rice/MemoryView.ipp +43 -0
- data/rice/Return.hpp +6 -26
- data/rice/Return.ipp +10 -16
- 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 +15 -5
- data/rice/detail/MethodInfo.ipp +78 -6
- data/rice/detail/Native.hpp +32 -0
- data/rice/detail/Native.ipp +129 -0
- data/rice/detail/NativeAttributeGet.hpp +51 -0
- data/rice/detail/NativeAttributeGet.ipp +51 -0
- data/rice/detail/NativeAttributeSet.hpp +43 -0
- data/rice/detail/NativeAttributeSet.ipp +82 -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 +20 -21
- data/rice/detail/NativeFunction.ipp +199 -64
- data/rice/detail/NativeIterator.hpp +8 -11
- data/rice/detail/NativeIterator.ipp +27 -31
- data/rice/detail/NativeRegistry.hpp +24 -17
- data/rice/detail/NativeRegistry.ipp +23 -56
- 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 +19 -0
- data/rice/detail/RubyType.ipp +187 -0
- data/rice/detail/TupleIterator.hpp +14 -0
- data/rice/detail/Type.hpp +5 -6
- data/rice/detail/Type.ipp +150 -33
- data/rice/detail/TypeRegistry.hpp +15 -7
- data/rice/detail/TypeRegistry.ipp +105 -12
- data/rice/detail/Wrapper.hpp +6 -5
- data/rice/detail/Wrapper.ipp +45 -23
- data/rice/detail/cpp_protect.hpp +5 -6
- data/rice/detail/default_allocation_func.ipp +0 -2
- data/rice/detail/from_ruby.hpp +37 -3
- data/rice/detail/from_ruby.ipp +911 -454
- data/rice/detail/ruby.hpp +18 -0
- data/rice/detail/to_ruby.hpp +41 -3
- data/rice/detail/to_ruby.ipp +437 -113
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +1 -2
- data/rice/rice.hpp +105 -22
- data/rice/ruby_mark.hpp +4 -3
- data/rice/stl.hpp +4 -0
- data/test/embed_ruby.cpp +4 -1
- data/test/extconf.rb +2 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
- data/test/test_Address_Registration_Guard.cpp +5 -0
- data/test/test_Array.cpp +12 -1
- data/test/test_Attribute.cpp +103 -21
- data/test/test_Builtin_Object.cpp +5 -0
- data/test/test_Callback.cpp +231 -0
- data/test/test_Class.cpp +5 -31
- data/test/test_Constructor.cpp +69 -6
- data/test/test_Data_Object.cpp +9 -4
- data/test/test_Data_Type.cpp +428 -64
- data/test/test_Director.cpp +10 -5
- data/test/test_Enum.cpp +152 -40
- data/test/test_Exception.cpp +235 -0
- data/test/test_File.cpp +70 -0
- data/test/test_From_Ruby.cpp +542 -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 +5 -0
- data/test/test_JumpException.cpp +22 -0
- data/test/test_Keep_Alive.cpp +6 -1
- data/test/test_Keep_Alive_No_Wrapper.cpp +5 -0
- data/test/test_Memory_Management.cpp +5 -0
- data/test/test_Module.cpp +118 -64
- data/test/test_Native_Registry.cpp +2 -33
- data/test/test_Object.cpp +5 -0
- data/test/test_Overloads.cpp +631 -0
- data/test/test_Ownership.cpp +67 -4
- data/test/test_Proc.cpp +45 -0
- data/test/test_Self.cpp +5 -0
- data/test/test_Stl_Exception.cpp +109 -0
- data/test/test_Stl_Map.cpp +22 -8
- data/test/test_Stl_Optional.cpp +5 -0
- data/test/test_Stl_Pair.cpp +7 -2
- data/test/test_Stl_Reference_Wrapper.cpp +5 -0
- data/test/test_Stl_SmartPointer.cpp +210 -5
- data/test/test_Stl_String.cpp +5 -0
- data/test/test_Stl_String_View.cpp +5 -0
- data/test/test_Stl_Type.cpp +147 -0
- data/test/test_Stl_Unordered_Map.cpp +18 -7
- data/test/test_Stl_Variant.cpp +5 -0
- data/test/test_Stl_Vector.cpp +130 -8
- 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 +152 -0
- data/test/test_Tracking.cpp +1 -0
- data/test/test_Type.cpp +100 -0
- data/test/test_global_functions.cpp +53 -6
- data/test/unittest.cpp +8 -0
- metadata +37 -20
- 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/Identifier.hpp +0 -50
- data/rice/Identifier.ipp +0 -29
- 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_To_From_Ruby.cpp +0 -399
@@ -11,6 +11,11 @@ SETUP(GlobalFunction)
|
|
11
11
|
embed_ruby();
|
12
12
|
}
|
13
13
|
|
14
|
+
TEARDOWN(GlobalFunctions)
|
15
|
+
{
|
16
|
+
rb_gc_start();
|
17
|
+
}
|
18
|
+
|
14
19
|
namespace {
|
15
20
|
|
16
21
|
bool no_args()
|
@@ -18,9 +23,9 @@ namespace {
|
|
18
23
|
return true;
|
19
24
|
}
|
20
25
|
|
21
|
-
int int_arg(int
|
26
|
+
int int_arg(int value)
|
22
27
|
{
|
23
|
-
return 2 *
|
28
|
+
return 2 * value;
|
24
29
|
}
|
25
30
|
}
|
26
31
|
|
@@ -52,6 +57,28 @@ TESTCASE(int_arg)
|
|
52
57
|
ASSERT_EQUAL(20, detail::From_Ruby<int>().convert(result));
|
53
58
|
}
|
54
59
|
|
60
|
+
TESTCASE(int_kw_arg)
|
61
|
+
{
|
62
|
+
define_global_function("method_with_kw_args_1", &int_arg, Arg("value"));
|
63
|
+
Module m = Module(rb_mKernel);
|
64
|
+
std::string code = R"(method_with_kw_args_1(value: 15))";
|
65
|
+
Object result = m.instance_eval(code);
|
66
|
+
ASSERT_EQUAL(30, detail::From_Ruby<int>().convert(result));
|
67
|
+
}
|
68
|
+
|
69
|
+
TESTCASE(int_kw_arg_invalid)
|
70
|
+
{
|
71
|
+
define_global_function("method_with_kw_args_2", &int_arg, Arg("value"));
|
72
|
+
Module m = Module(rb_mKernel);
|
73
|
+
std::string code = R"(method_with_kw_args_2(wrong: 15))";
|
74
|
+
|
75
|
+
ASSERT_EXCEPTION_CHECK(
|
76
|
+
Exception,
|
77
|
+
m.instance_eval(code),
|
78
|
+
ASSERT_EQUAL("Unknown keyword: wrong", ex.what())
|
79
|
+
);
|
80
|
+
}
|
81
|
+
|
55
82
|
TESTCASE(int_arg_lambda)
|
56
83
|
{
|
57
84
|
define_global_function("method_with_args", [](int value)
|
@@ -85,7 +112,7 @@ namespace
|
|
85
112
|
|
86
113
|
TESTCASE(default_arguments_for_define_global_function)
|
87
114
|
{
|
88
|
-
define_global_function("foo", &defaults_method_one, Arg("arg1"), Arg("arg2") = (int)3, Arg("arg3") =
|
115
|
+
define_global_function("foo", &defaults_method_one, Arg("arg1"), Arg("arg2") = (int)3, Arg("arg3") = true);
|
89
116
|
Module m(rb_mKernel);
|
90
117
|
|
91
118
|
m.call("foo", 2);
|
@@ -107,7 +134,26 @@ TESTCASE(default_arguments_for_define_global_function)
|
|
107
134
|
ASSERT(!defaults_method_one_arg3);
|
108
135
|
}
|
109
136
|
|
110
|
-
TESTCASE(
|
137
|
+
TESTCASE(default_arguments_kw)
|
138
|
+
{
|
139
|
+
define_global_function("defaults_method_one_kw", &defaults_method_one,
|
140
|
+
Arg("arg1"), Arg("arg2"), Arg("arg3") = true);
|
141
|
+
Module m = Module(rb_mKernel);
|
142
|
+
|
143
|
+
std::string code = R"(defaults_method_one_kw(4, arg2: 5))";
|
144
|
+
m.instance_eval(code);
|
145
|
+
ASSERT_EQUAL(4, defaults_method_one_arg1);
|
146
|
+
ASSERT_EQUAL(5, defaults_method_one_arg2);
|
147
|
+
ASSERT(defaults_method_one_arg3);
|
148
|
+
|
149
|
+
code = R"(defaults_method_one_kw(arg1: 9, arg2: 11, arg3: false))";
|
150
|
+
m.instance_eval(code);
|
151
|
+
ASSERT_EQUAL(9, defaults_method_one_arg1);
|
152
|
+
ASSERT_EQUAL(11, defaults_method_one_arg2);
|
153
|
+
ASSERT(!defaults_method_one_arg3);
|
154
|
+
}
|
155
|
+
|
156
|
+
TESTCASE(default_arguments_and_returning)
|
111
157
|
{
|
112
158
|
define_global_function("foo_ret", &defaults_returns, Arg("arg1"), Arg("arg2") = (int)3);
|
113
159
|
Module m(rb_mKernel);
|
@@ -119,7 +165,8 @@ TESTCASE(default_arguments_for_define_global_function_and_returning)
|
|
119
165
|
ASSERT_EQUAL(INT2NUM(50), o.value());
|
120
166
|
}
|
121
167
|
|
122
|
-
namespace
|
168
|
+
namespace
|
169
|
+
{
|
123
170
|
int the_one_default_arg = 0;
|
124
171
|
void method_with_one_default_arg(int num = 4) {
|
125
172
|
the_one_default_arg = num;
|
@@ -132,4 +179,4 @@ TESTCASE(single_default_argument)
|
|
132
179
|
Module m(rb_mKernel);
|
133
180
|
m.call("foo");
|
134
181
|
ASSERT_EQUAL(4, the_one_default_arg);
|
135
|
-
}
|
182
|
+
}
|
data/test/unittest.cpp
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
#include <map>
|
4
4
|
#include "unittest.hpp"
|
5
5
|
|
6
|
+
#ifdef _WIN32
|
7
|
+
#include <windows.h>
|
8
|
+
#endif
|
9
|
+
|
6
10
|
size_t assertions;
|
7
11
|
|
8
12
|
namespace
|
@@ -98,6 +102,10 @@ char* findOption(char** begin, char** end, const std::string& option)
|
|
98
102
|
|
99
103
|
int main(int argc, char** argv)
|
100
104
|
{
|
105
|
+
#ifdef _WIN32
|
106
|
+
SetConsoleOutputCP(CP_UTF8);
|
107
|
+
#endif
|
108
|
+
|
101
109
|
std::vector<Test_Suite> suites;
|
102
110
|
|
103
111
|
char* moduleName = findOption(argv, argv + argc, "--suite");
|
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.
|
4
|
+
version: 4.5.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: 2025-02-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -76,52 +76,62 @@ files:
|
|
76
76
|
- include/rice/rice.hpp
|
77
77
|
- include/rice/stl.hpp
|
78
78
|
- lib/mkmf-rice.rb
|
79
|
-
- lib/version.rb
|
80
79
|
- rice/Address_Registration_Guard.hpp
|
81
80
|
- rice/Address_Registration_Guard.ipp
|
82
|
-
- rice/Address_Registration_Guard_defn.hpp
|
83
81
|
- rice/Arg.hpp
|
84
82
|
- rice/Arg.ipp
|
83
|
+
- rice/Callback.hpp
|
84
|
+
- rice/Callback.ipp
|
85
85
|
- rice/Constructor.hpp
|
86
|
+
- rice/Constructor.ipp
|
86
87
|
- rice/Data_Object.hpp
|
87
88
|
- rice/Data_Object.ipp
|
88
|
-
- rice/Data_Object_defn.hpp
|
89
89
|
- rice/Data_Type.hpp
|
90
90
|
- rice/Data_Type.ipp
|
91
|
-
- rice/Data_Type_defn.hpp
|
92
91
|
- rice/Director.hpp
|
93
92
|
- rice/Enum.hpp
|
94
93
|
- rice/Enum.ipp
|
95
94
|
- rice/Exception.hpp
|
96
95
|
- rice/Exception.ipp
|
97
|
-
- rice/
|
98
|
-
- rice/
|
99
|
-
- rice/
|
100
|
-
- rice/
|
96
|
+
- rice/JumpException.hpp
|
97
|
+
- rice/JumpException.ipp
|
98
|
+
- rice/MemoryView.hpp
|
99
|
+
- rice/MemoryView.ipp
|
101
100
|
- rice/Return.hpp
|
102
101
|
- rice/Return.ipp
|
103
|
-
- rice/detail/
|
104
|
-
- rice/detail/
|
105
|
-
- rice/detail/ExceptionHandler_defn.hpp
|
102
|
+
- rice/detail/DefaultHandler.hpp
|
103
|
+
- rice/detail/DefaultHandler.ipp
|
106
104
|
- rice/detail/HandlerRegistry.hpp
|
107
105
|
- rice/detail/HandlerRegistry.ipp
|
108
106
|
- rice/detail/InstanceRegistry.hpp
|
109
107
|
- rice/detail/InstanceRegistry.ipp
|
110
|
-
- rice/detail/Jump_Tag.hpp
|
111
108
|
- rice/detail/MethodInfo.hpp
|
112
109
|
- rice/detail/MethodInfo.ipp
|
113
|
-
- rice/detail/
|
114
|
-
- rice/detail/
|
110
|
+
- rice/detail/Native.hpp
|
111
|
+
- rice/detail/Native.ipp
|
112
|
+
- rice/detail/NativeAttributeGet.hpp
|
113
|
+
- rice/detail/NativeAttributeGet.ipp
|
114
|
+
- rice/detail/NativeAttributeSet.hpp
|
115
|
+
- rice/detail/NativeAttributeSet.ipp
|
116
|
+
- rice/detail/NativeCallbackFFI.hpp
|
117
|
+
- rice/detail/NativeCallbackFFI.ipp
|
118
|
+
- rice/detail/NativeCallbackSimple.hpp
|
119
|
+
- rice/detail/NativeCallbackSimple.ipp
|
115
120
|
- rice/detail/NativeFunction.hpp
|
116
121
|
- rice/detail/NativeFunction.ipp
|
117
122
|
- rice/detail/NativeIterator.hpp
|
118
123
|
- rice/detail/NativeIterator.ipp
|
119
124
|
- rice/detail/NativeRegistry.hpp
|
120
125
|
- rice/detail/NativeRegistry.ipp
|
126
|
+
- rice/detail/Proc.hpp
|
127
|
+
- rice/detail/Proc.ipp
|
121
128
|
- rice/detail/Registries.hpp
|
122
129
|
- rice/detail/Registries.ipp
|
123
130
|
- rice/detail/RubyFunction.hpp
|
124
131
|
- rice/detail/RubyFunction.ipp
|
132
|
+
- rice/detail/RubyType.hpp
|
133
|
+
- rice/detail/RubyType.ipp
|
134
|
+
- rice/detail/TupleIterator.hpp
|
125
135
|
- rice/detail/Type.hpp
|
126
136
|
- rice/detail/Type.ipp
|
127
137
|
- rice/detail/TypeRegistry.hpp
|
@@ -133,11 +143,9 @@ files:
|
|
133
143
|
- rice/detail/default_allocation_func.ipp
|
134
144
|
- rice/detail/from_ruby.hpp
|
135
145
|
- rice/detail/from_ruby.ipp
|
136
|
-
- rice/detail/from_ruby_defn.hpp
|
137
146
|
- rice/detail/ruby.hpp
|
138
147
|
- rice/detail/to_ruby.hpp
|
139
148
|
- rice/detail/to_ruby.ipp
|
140
|
-
- rice/detail/to_ruby_defn.hpp
|
141
149
|
- rice/forward_declares.ipp
|
142
150
|
- rice/global_function.hpp
|
143
151
|
- rice/global_function.ipp
|
@@ -172,6 +180,7 @@ files:
|
|
172
180
|
- test/test_Array.cpp
|
173
181
|
- test/test_Attribute.cpp
|
174
182
|
- test/test_Builtin_Object.cpp
|
183
|
+
- test/test_Callback.cpp
|
175
184
|
- test/test_Class.cpp
|
176
185
|
- test/test_Constructor.cpp
|
177
186
|
- test/test_Data_Object.cpp
|
@@ -179,19 +188,24 @@ files:
|
|
179
188
|
- test/test_Director.cpp
|
180
189
|
- test/test_Enum.cpp
|
181
190
|
- test/test_Exception.cpp
|
191
|
+
- test/test_File.cpp
|
192
|
+
- test/test_From_Ruby.cpp
|
182
193
|
- test/test_Hash.cpp
|
183
194
|
- test/test_Identifier.cpp
|
184
195
|
- test/test_Inheritance.cpp
|
185
196
|
- test/test_Iterator.cpp
|
186
|
-
- test/
|
197
|
+
- test/test_JumpException.cpp
|
187
198
|
- test/test_Keep_Alive.cpp
|
188
199
|
- test/test_Keep_Alive_No_Wrapper.cpp
|
189
200
|
- test/test_Memory_Management.cpp
|
190
201
|
- test/test_Module.cpp
|
191
202
|
- test/test_Native_Registry.cpp
|
192
203
|
- test/test_Object.cpp
|
204
|
+
- test/test_Overloads.cpp
|
193
205
|
- test/test_Ownership.cpp
|
206
|
+
- test/test_Proc.cpp
|
194
207
|
- test/test_Self.cpp
|
208
|
+
- test/test_Stl_Exception.cpp
|
195
209
|
- test/test_Stl_Map.cpp
|
196
210
|
- test/test_Stl_Optional.cpp
|
197
211
|
- test/test_Stl_Pair.cpp
|
@@ -199,14 +213,17 @@ files:
|
|
199
213
|
- test/test_Stl_SmartPointer.cpp
|
200
214
|
- test/test_Stl_String.cpp
|
201
215
|
- test/test_Stl_String_View.cpp
|
216
|
+
- test/test_Stl_Type.cpp
|
202
217
|
- test/test_Stl_Unordered_Map.cpp
|
203
218
|
- test/test_Stl_Variant.cpp
|
204
219
|
- test/test_Stl_Vector.cpp
|
205
220
|
- test/test_String.cpp
|
206
221
|
- test/test_Struct.cpp
|
207
222
|
- test/test_Symbol.cpp
|
208
|
-
- test/
|
223
|
+
- test/test_Template.cpp
|
224
|
+
- test/test_To_Ruby.cpp
|
209
225
|
- test/test_Tracking.cpp
|
226
|
+
- test/test_Type.cpp
|
210
227
|
- test/test_global_functions.cpp
|
211
228
|
- test/unittest.cpp
|
212
229
|
- test/unittest.hpp
|
data/lib/version.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
#ifndef Rice__Address_Registration_Guard_defn__hpp_
|
2
|
-
#define Rice__Address_Registration_Guard_defn__hpp_
|
3
|
-
|
4
|
-
#include "cpp_api/Object_defn.hpp"
|
5
|
-
#include "detail/ruby.hpp"
|
6
|
-
|
7
|
-
namespace Rice
|
8
|
-
{
|
9
|
-
//! A guard to register a given address with the GC.
|
10
|
-
/*! Calls rb_gc_register_address upon construction and
|
11
|
-
* rb_gc_unregister_address upon destruction.
|
12
|
-
* For example:
|
13
|
-
* \code
|
14
|
-
* Class Foo
|
15
|
-
* {
|
16
|
-
* public:
|
17
|
-
* Foo()
|
18
|
-
* : string_(rb_str_new2())
|
19
|
-
* , guard_(&string_);
|
20
|
-
*
|
21
|
-
* private:
|
22
|
-
* VALUE string_;
|
23
|
-
* Address_Registration_Guard guard_;
|
24
|
-
* };
|
25
|
-
* \endcode
|
26
|
-
*/
|
27
|
-
class Address_Registration_Guard
|
28
|
-
{
|
29
|
-
public:
|
30
|
-
//! Register an address with the GC.
|
31
|
-
/* \param address The address to register with the GC. The address
|
32
|
-
* must point to a valid ruby object (RObject).
|
33
|
-
*/
|
34
|
-
Address_Registration_Guard(VALUE* address);
|
35
|
-
|
36
|
-
//! Register an Object with the GC.
|
37
|
-
/*! \param object The Object to register with the GC. The object must
|
38
|
-
* not be destroyed before the Address_Registration_Guard is
|
39
|
-
* destroyed.
|
40
|
-
*/
|
41
|
-
Address_Registration_Guard(Object* object);
|
42
|
-
|
43
|
-
//! Unregister an address/Object with the GC.
|
44
|
-
/*! Destruct an Address_Registration_Guard. The address registered
|
45
|
-
* with the Address_Registration_Guard when it was constructed will
|
46
|
-
* be unregistered from the GC.
|
47
|
-
*/
|
48
|
-
~Address_Registration_Guard();
|
49
|
-
|
50
|
-
// Disable copying
|
51
|
-
Address_Registration_Guard(Address_Registration_Guard const& other) = delete;
|
52
|
-
Address_Registration_Guard& operator=(Address_Registration_Guard const& other) = delete;
|
53
|
-
|
54
|
-
// Enable moving
|
55
|
-
Address_Registration_Guard(Address_Registration_Guard&& other);
|
56
|
-
Address_Registration_Guard& operator=(Address_Registration_Guard&& other);
|
57
|
-
|
58
|
-
//! Get the address that is registered with the GC.
|
59
|
-
VALUE* address() const;
|
60
|
-
|
61
|
-
/** Called during Ruby's exit process since we should not call
|
62
|
-
* rb_gc unregister_address there
|
63
|
-
*/
|
64
|
-
static void disable();
|
65
|
-
|
66
|
-
private:
|
67
|
-
inline static bool enabled = true;
|
68
|
-
inline static bool exit_handler_registered = false;
|
69
|
-
static void registerExitHandler();
|
70
|
-
|
71
|
-
private:
|
72
|
-
void registerAddress() const;
|
73
|
-
void unregisterAddress();
|
74
|
-
|
75
|
-
VALUE* address_ = nullptr;
|
76
|
-
};
|
77
|
-
} // namespace Rice
|
78
|
-
|
79
|
-
#endif // Rice__Address_Registration_Guard_defn__hpp_
|
data/rice/Data_Object_defn.hpp
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
#ifndef Rice__Data_Object_defn__hpp_
|
2
|
-
#define Rice__Data_Object_defn__hpp_
|
3
|
-
|
4
|
-
#include <optional>
|
5
|
-
|
6
|
-
#include "detail/to_ruby.hpp"
|
7
|
-
#include "detail/ruby.hpp"
|
8
|
-
#include "cpp_api/Object_defn.hpp"
|
9
|
-
|
10
|
-
/*! \file
|
11
|
-
* \brief Provides a helper class for wrapping and unwrapping C++
|
12
|
-
* objects as Ruby objects.
|
13
|
-
*/
|
14
|
-
|
15
|
-
namespace Rice
|
16
|
-
{
|
17
|
-
//! A smartpointer-like wrapper for Ruby data objects.
|
18
|
-
/*! A data object is a ruby object of type T_DATA, which is usually
|
19
|
-
* created by using the Data_Wrap_Struct or Data_Make_Struct macro.
|
20
|
-
* This class wraps creation of the data structure, providing a
|
21
|
-
* type-safe object-oriented interface to the underlying C interface.
|
22
|
-
* This class works in conjunction with the Data_Type class to ensure
|
23
|
-
* type safety.
|
24
|
-
*
|
25
|
-
* Example:
|
26
|
-
* \code
|
27
|
-
* class Foo { };
|
28
|
-
* ...
|
29
|
-
* Data_Type<Foo> rb_cFoo = define_class("Foo");
|
30
|
-
* ...
|
31
|
-
* // Wrap:
|
32
|
-
* Data_Object<Foo> foo1(new Foo);
|
33
|
-
*
|
34
|
-
* // Get value to return:
|
35
|
-
* VALUE v = foo1.value()
|
36
|
-
*
|
37
|
-
* // Unwrap:
|
38
|
-
* Data_Object<Foo> foo2(v, rb_cFoo);
|
39
|
-
* \endcode
|
40
|
-
*/
|
41
|
-
template<typename T>
|
42
|
-
class Data_Object : public Object
|
43
|
-
{
|
44
|
-
static_assert(!std::is_pointer_v<T>);
|
45
|
-
static_assert(!std::is_reference_v<T>);
|
46
|
-
static_assert(!std::is_const_v<T>);
|
47
|
-
static_assert(!std::is_volatile_v<T>);
|
48
|
-
|
49
|
-
public:
|
50
|
-
static T* from_ruby(VALUE value);
|
51
|
-
|
52
|
-
public:
|
53
|
-
//! Wrap a C++ object.
|
54
|
-
/*! This constructor is analogous to calling Data_Wrap_Struct. Be
|
55
|
-
* careful not to call this function more than once for the same
|
56
|
-
* pointer (in general, it should only be called for newly
|
57
|
-
* constructed objects that need to be managed by Ruby's garbage
|
58
|
-
* collector).
|
59
|
-
* \param obj the object to wrap.
|
60
|
-
* \param isOwner Should the Data_Object take ownership of the object?
|
61
|
-
* \param klass the Ruby class to use for the newly created Ruby
|
62
|
-
* object.
|
63
|
-
*/
|
64
|
-
Data_Object(T* obj, bool isOwner = false, Class klass = Data_Type<T>::klass());
|
65
|
-
Data_Object(T& obj, bool isOwner = false, Class klass = Data_Type<T>::klass());
|
66
|
-
|
67
|
-
//! Unwrap a Ruby object.
|
68
|
-
/*! This constructor is analogous to calling Data_Get_Struct. Uses
|
69
|
-
* Data_Type<T>::klass as the class of the object.
|
70
|
-
* \param value the Ruby object to unwrap.
|
71
|
-
*/
|
72
|
-
Data_Object(Object value);
|
73
|
-
|
74
|
-
T& operator*() const; //!< Return a reference to obj_
|
75
|
-
T* operator->() const; //!< Return a pointer to obj_
|
76
|
-
T* get() const; //!< Return a pointer to obj_
|
77
|
-
|
78
|
-
private:
|
79
|
-
static void check_ruby_type(VALUE value);
|
80
|
-
};
|
81
|
-
} // namespace Rice
|
82
|
-
|
83
|
-
#endif // Rice__Data_Object_defn__hpp_
|
84
|
-
|
data/rice/Data_Type_defn.hpp
DELETED
@@ -1,190 +0,0 @@
|
|
1
|
-
#ifndef Rice__Data_Type_defn__hpp_
|
2
|
-
#define Rice__Data_Type_defn__hpp_
|
3
|
-
|
4
|
-
#include "cpp_api/Class_defn.hpp"
|
5
|
-
#include "detail/ruby.hpp"
|
6
|
-
#include <set>
|
7
|
-
|
8
|
-
namespace Rice
|
9
|
-
{
|
10
|
-
//! A mechanism for binding ruby types to C++ types.
|
11
|
-
/*! This class binds run-time types (Ruby VALUEs) to compile-time types
|
12
|
-
* (C++ types). The binding can occur only once.
|
13
|
-
*/
|
14
|
-
template<typename T>
|
15
|
-
class Data_Type : public Class
|
16
|
-
{
|
17
|
-
static_assert(std::is_same_v<detail::intrinsic_type<T>, T>);
|
18
|
-
|
19
|
-
public:
|
20
|
-
//! Default constructor which does not bind.
|
21
|
-
/*! No member functions must be called on this Data_Type except bind,
|
22
|
-
* until the type is bound.
|
23
|
-
*/
|
24
|
-
Data_Type();
|
25
|
-
|
26
|
-
//! Constructor which takes a Module.
|
27
|
-
/*! Binds the type to the given VALUE according to the rules given
|
28
|
-
* above.
|
29
|
-
* \param klass the module to which to bind.
|
30
|
-
*/
|
31
|
-
Data_Type(Module const & v);
|
32
|
-
|
33
|
-
//! Destructor.
|
34
|
-
virtual ~Data_Type();
|
35
|
-
|
36
|
-
//! Return the Ruby class.
|
37
|
-
/*! \return the ruby class to which the type is bound.
|
38
|
-
*/
|
39
|
-
static Class klass();
|
40
|
-
|
41
|
-
//! Return the Ruby data type.
|
42
|
-
static rb_data_type_t* ruby_data_type();
|
43
|
-
|
44
|
-
//! Assignment operator which takes a Module
|
45
|
-
/*! \param klass must be the class to which this data type is already
|
46
|
-
* bound.
|
47
|
-
* \return *this
|
48
|
-
*/
|
49
|
-
virtual Data_Type & operator=(Module const & klass);
|
50
|
-
|
51
|
-
/*! Creates a singleton method allocate and an instance method called
|
52
|
-
* initialize which together create a new instance of the class. The
|
53
|
-
* allocate method allocates memory for the object reference and the
|
54
|
-
* initialize method constructs the object.
|
55
|
-
* \param constructor an object that has a static member function
|
56
|
-
* construct() that constructs a new instance of T and sets the object's data
|
57
|
-
* member to point to the new instance. A helper class Constructor
|
58
|
-
* is provided that does precisely this.
|
59
|
-
* \param args a list of Arg instance used to define default parameters (optional)
|
60
|
-
*
|
61
|
-
* For example:
|
62
|
-
* \code
|
63
|
-
* define_class<Foo>("Foo")
|
64
|
-
* .define_constructor(Constructor<Foo>());
|
65
|
-
* \endcode
|
66
|
-
*/
|
67
|
-
template<typename Constructor_T, typename...Arg_Ts>
|
68
|
-
Data_Type<T> & define_constructor(Constructor_T constructor, Arg_Ts const& ...args);
|
69
|
-
|
70
|
-
//! Register a Director class for this class.
|
71
|
-
/*! For any class that uses Rice::Director to enable polymorphism
|
72
|
-
* across the languages, you need to register that director proxy
|
73
|
-
* class with this method. Not doing so will cause the resulting
|
74
|
-
* library to die at run time when it tries to convert the base
|
75
|
-
* type into the Director proxy type.
|
76
|
-
*
|
77
|
-
* This method takes no methodInfo, just needs the type of the
|
78
|
-
* Director proxy class.
|
79
|
-
*
|
80
|
-
* For example:
|
81
|
-
* \code
|
82
|
-
* class FooDirector : public Foo, public Rice::Director {
|
83
|
-
* ...
|
84
|
-
* };
|
85
|
-
*
|
86
|
-
* define_class<Foo>("Foo")
|
87
|
-
* .define_director<FooDirector>()
|
88
|
-
* .define_constructor(Constructor<FooDirector, Rice::Object>());
|
89
|
-
* \endcode
|
90
|
-
*/
|
91
|
-
template<typename Director_T>
|
92
|
-
Data_Type<T>& define_director();
|
93
|
-
|
94
|
-
//! Determine if the type is bound.
|
95
|
-
/*! \return true if the object is bound, false otherwise.
|
96
|
-
*/
|
97
|
-
static bool is_bound();
|
98
|
-
static void check_is_bound();
|
99
|
-
|
100
|
-
// This is only for testing - DO NOT USE!!!
|
101
|
-
static void unbind();
|
102
|
-
|
103
|
-
static bool is_descendant(VALUE value);
|
104
|
-
|
105
|
-
//! Define an iterator.
|
106
|
-
/*! Essentially this is a conversion from a C++-style begin/end
|
107
|
-
* iterator to a Ruby-style \#each iterator.
|
108
|
-
* \param begin a member function pointer to a function that returns
|
109
|
-
* an iterator to the beginning of the sequence.
|
110
|
-
* \param end a member function pointer to a function that returns an
|
111
|
-
* iterator to the end of the sequence.
|
112
|
-
* \param name the name of the iterator.
|
113
|
-
* \return *this
|
114
|
-
*/
|
115
|
-
|
116
|
-
template<typename Iterator_Func_T>
|
117
|
-
Data_Type<T>& define_iterator(Iterator_Func_T begin, Iterator_Func_T end, std::string name = "each");
|
118
|
-
|
119
|
-
template <typename Attribute_T>
|
120
|
-
Data_Type<T>& define_attr(std::string name, Attribute_T attribute, AttrAccess access = AttrAccess::ReadWrite);
|
121
|
-
|
122
|
-
template <typename Attribute_T>
|
123
|
-
Data_Type<T>& define_singleton_attr(std::string name, Attribute_T attribute, AttrAccess access = AttrAccess::ReadWrite);
|
124
|
-
|
125
|
-
#include "cpp_api/shared_methods.hpp"
|
126
|
-
|
127
|
-
protected:
|
128
|
-
//! Bind a Data_Type to a VALUE.
|
129
|
-
/*! Throws an exception if the Data_Type is already bound to a
|
130
|
-
* different class. Any existing instances of the Data_Type will be
|
131
|
-
* bound after this function returns.
|
132
|
-
* \param klass the ruby type to which to bind.
|
133
|
-
* \return *this
|
134
|
-
*/
|
135
|
-
template <typename Base_T = void>
|
136
|
-
static Data_Type bind(const Module& klass);
|
137
|
-
|
138
|
-
template<typename T_, typename Base_T_>
|
139
|
-
friend Rice::Data_Type<T_> define_class_under(Object module, char const * name);
|
140
|
-
|
141
|
-
template<typename T_, typename Base_T_>
|
142
|
-
friend Rice::Data_Type<T_> define_class(char const * name);
|
143
|
-
|
144
|
-
template<bool IsMethod, typename Function_T>
|
145
|
-
void wrap_native_call(VALUE klass, std::string name, Function_T&& function, MethodInfo* methodInfo);
|
146
|
-
|
147
|
-
private:
|
148
|
-
template<typename T_>
|
149
|
-
friend class Data_Type;
|
150
|
-
|
151
|
-
static inline VALUE klass_ = Qnil;
|
152
|
-
|
153
|
-
// Typed Data support
|
154
|
-
static inline rb_data_type_t* rb_data_type_ = nullptr;
|
155
|
-
|
156
|
-
typedef std::set<Data_Type<T> *> Instances;
|
157
|
-
|
158
|
-
static Instances & unbound_instances()
|
159
|
-
{
|
160
|
-
static Instances unbound_instances;
|
161
|
-
return unbound_instances;
|
162
|
-
}
|
163
|
-
};
|
164
|
-
|
165
|
-
//! Define a new data class in the namespace given by module.
|
166
|
-
/*! By default the class will inherit from Ruby's rb_cObject. This
|
167
|
-
* can be overriden via the Base_T template parameter. Note that
|
168
|
-
* Base_T must already have been registered.
|
169
|
-
* \param T the C++ type of the wrapped class.
|
170
|
-
* \param module the the Module in which to define the class.
|
171
|
-
* \return the new class.
|
172
|
-
*/
|
173
|
-
template<typename T, typename Base_T = void>
|
174
|
-
Data_Type<T> define_class_under(Object module, char const* name);
|
175
|
-
|
176
|
-
//! Define a new data class in the default namespace.
|
177
|
-
/*! By default the class will inherit from Ruby's rb_cObject. This
|
178
|
-
* can be overriden via the Base_T template parameter. Note that
|
179
|
-
* Base_T must already have been registered.
|
180
|
-
* \param T the C++ type of the wrapped class.
|
181
|
-
* \param module the the Module in which to define the class.
|
182
|
-
* \return the new class.
|
183
|
-
*/
|
184
|
-
template<typename T, typename Base_T = void>
|
185
|
-
Data_Type<T> define_class(char const* name);
|
186
|
-
} // namespace Rice
|
187
|
-
|
188
|
-
#include "Data_Type.ipp"
|
189
|
-
|
190
|
-
#endif // Rice__Data_Type_defn__hpp_
|