rice 4.6.1 → 4.7.1

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.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/CMakeLists.txt +0 -4
  4. data/Rakefile +2 -8
  5. data/bin/rice-doc.rb +211 -0
  6. data/bin/rice-rbs.rb +92 -0
  7. data/include/rice/rice.hpp +4694 -3704
  8. data/include/rice/stl.hpp +840 -294
  9. data/lib/rice/doc/cpp_reference.rb +166 -0
  10. data/lib/rice/doc/doxygen.rb +294 -0
  11. data/lib/rice/doc/mkdocs.rb +298 -0
  12. data/lib/rice/doc/rice.rb +29 -0
  13. data/lib/rice/doc/ruby.rb +37 -0
  14. data/lib/rice/doc.rb +5 -0
  15. data/lib/{make_rice_headers.rb → rice/make_rice_headers.rb} +3 -0
  16. data/lib/rice/native.rb +18 -0
  17. data/lib/rice/native_registry.rb +21 -0
  18. data/lib/rice/parameter.rb +7 -0
  19. data/lib/rice/rbs.rb +104 -0
  20. data/lib/rice/version.rb +1 -1
  21. data/lib/rice.rb +4 -0
  22. data/lib/rubygems/cmake_builder.rb +24 -27
  23. data/rice/Arg.hpp +4 -4
  24. data/rice/Arg.ipp +4 -4
  25. data/rice/Buffer.hpp +32 -28
  26. data/rice/Buffer.ipp +306 -178
  27. data/rice/Data_Object.ipp +136 -88
  28. data/rice/Data_Type.hpp +5 -7
  29. data/rice/Data_Type.ipp +48 -29
  30. data/rice/Enum.ipp +15 -21
  31. data/rice/Function.hpp +17 -0
  32. data/rice/Function.ipp +13 -0
  33. data/rice/Pointer.hpp +15 -0
  34. data/rice/Pointer.ipp +49 -0
  35. data/rice/Return.hpp +1 -1
  36. data/rice/Return.ipp +2 -2
  37. data/rice/api.hpp +30 -0
  38. data/rice/cpp_api/Array.hpp +4 -4
  39. data/rice/cpp_api/Array.ipp +50 -5
  40. data/rice/cpp_api/Class.hpp +0 -5
  41. data/rice/cpp_api/Class.ipp +19 -0
  42. data/rice/cpp_api/Hash.ipp +20 -0
  43. data/rice/cpp_api/Module.hpp +6 -3
  44. data/rice/cpp_api/Module.ipp +49 -11
  45. data/rice/cpp_api/Object.ipp +31 -2
  46. data/rice/cpp_api/String.hpp +1 -2
  47. data/rice/cpp_api/String.ipp +21 -1
  48. data/rice/cpp_api/Struct.ipp +5 -0
  49. data/rice/cpp_api/Symbol.ipp +43 -0
  50. data/rice/cpp_api/shared_methods.hpp +12 -12
  51. data/rice/detail/MethodInfo.hpp +4 -2
  52. data/rice/detail/MethodInfo.ipp +19 -3
  53. data/rice/detail/ModuleRegistry.hpp +18 -0
  54. data/rice/detail/ModuleRegistry.ipp +25 -0
  55. data/rice/detail/Native.hpp +45 -2
  56. data/rice/detail/Native.ipp +196 -6
  57. data/rice/detail/NativeAttributeGet.hpp +9 -4
  58. data/rice/detail/NativeAttributeGet.ipp +65 -11
  59. data/rice/detail/NativeAttributeSet.hpp +4 -0
  60. data/rice/detail/NativeAttributeSet.ipp +30 -2
  61. data/rice/detail/NativeCallbackFFI.ipp +2 -2
  62. data/rice/detail/NativeCallbackSimple.ipp +1 -1
  63. data/rice/detail/NativeFunction.hpp +11 -49
  64. data/rice/detail/NativeFunction.ipp +82 -379
  65. data/rice/detail/NativeInvoker.hpp +74 -0
  66. data/rice/detail/NativeInvoker.ipp +197 -0
  67. data/rice/detail/NativeIterator.hpp +4 -0
  68. data/rice/detail/NativeIterator.ipp +19 -0
  69. data/rice/detail/NativeMethod.hpp +97 -0
  70. data/rice/detail/NativeMethod.ipp +332 -0
  71. data/rice/detail/NativeProc.hpp +51 -0
  72. data/rice/detail/NativeProc.ipp +133 -0
  73. data/rice/detail/NativeRegistry.hpp +8 -0
  74. data/rice/detail/NativeRegistry.ipp +26 -0
  75. data/rice/detail/Parameter.hpp +47 -0
  76. data/rice/detail/Parameter.ipp +105 -0
  77. data/rice/detail/Proc.ipp +14 -13
  78. data/rice/detail/Registries.hpp +1 -0
  79. data/rice/detail/RubyType.hpp +0 -2
  80. data/rice/detail/RubyType.ipp +15 -33
  81. data/rice/detail/Type.hpp +44 -8
  82. data/rice/detail/Type.ipp +151 -49
  83. data/rice/detail/TypeRegistry.hpp +3 -0
  84. data/rice/detail/TypeRegistry.ipp +17 -27
  85. data/rice/detail/Types.ipp +430 -0
  86. data/rice/detail/Wrapper.hpp +12 -0
  87. data/rice/detail/Wrapper.ipp +45 -2
  88. data/rice/detail/from_ruby.ipp +567 -1073
  89. data/rice/detail/ruby.hpp +1 -0
  90. data/rice/detail/to_ruby.ipp +4 -635
  91. data/rice/libc/file.ipp +3 -6
  92. data/rice/rice.hpp +22 -12
  93. data/rice/rice_api/Arg.hpp +7 -0
  94. data/rice/rice_api/Arg.ipp +9 -0
  95. data/rice/rice_api/ModuleRegistry.hpp +7 -0
  96. data/rice/rice_api/ModuleRegistry.ipp +10 -0
  97. data/rice/rice_api/Native.hpp +7 -0
  98. data/rice/rice_api/Native.ipp +52 -0
  99. data/rice/rice_api/NativeRegistry.hpp +7 -0
  100. data/rice/rice_api/NativeRegistry.ipp +21 -0
  101. data/rice/rice_api/Parameter.hpp +7 -0
  102. data/rice/rice_api/Parameter.ipp +11 -0
  103. data/rice/rice_api/Registries.hpp +6 -0
  104. data/rice/rice_api/Registries.ipp +12 -0
  105. data/rice/rice_api/TypeRegistry.hpp +7 -0
  106. data/rice/rice_api/TypeRegistry.ipp +10 -0
  107. data/rice/stl/complex.ipp +35 -0
  108. data/rice/stl/exception.ipp +20 -7
  109. data/rice/stl/filesystem.hpp +6 -0
  110. data/rice/stl/filesystem.ipp +34 -0
  111. data/rice/stl/map.ipp +13 -21
  112. data/rice/stl/monostate.ipp +37 -1
  113. data/rice/stl/multimap.ipp +17 -24
  114. data/rice/stl/optional.ipp +47 -2
  115. data/rice/stl/pair.ipp +23 -58
  116. data/rice/stl/reference_wrapper.ipp +22 -1
  117. data/rice/stl/set.ipp +17 -9
  118. data/rice/stl/shared_ptr.ipp +44 -17
  119. data/rice/stl/string.ipp +175 -7
  120. data/rice/stl/string_view.ipp +23 -0
  121. data/rice/stl/tuple.ipp +38 -9
  122. data/rice/stl/unique_ptr.ipp +46 -2
  123. data/rice/stl/unordered_map.ipp +13 -21
  124. data/rice/stl/variant.ipp +47 -11
  125. data/rice/stl/vector.ipp +183 -104
  126. data/rice/stl.hpp +1 -0
  127. data/rice/traits/function_traits.hpp +2 -2
  128. data/rice/traits/method_traits.hpp +5 -16
  129. data/rice/traits/rice_traits.hpp +24 -4
  130. data/rice.gemspec +10 -22
  131. data/test/embed_ruby.cpp +0 -3
  132. data/test/test_Array.cpp +38 -38
  133. data/test/test_Attribute.cpp +187 -2
  134. data/test/test_Buffer.cpp +302 -26
  135. data/test/test_Callback.cpp +2 -3
  136. data/test/test_Class.cpp +5 -5
  137. data/test/test_Data_Object.cpp +1 -56
  138. data/test/test_Data_Type.cpp +20 -30
  139. data/test/test_Enum.cpp +4 -46
  140. data/test/test_From_Ruby.cpp +89 -82
  141. data/test/test_GVL.cpp +109 -0
  142. data/test/test_Iterator.cpp +1 -1
  143. data/test/test_Keep_Alive_No_Wrapper.cpp +5 -3
  144. data/test/test_Module.cpp +8 -9
  145. data/test/test_Object.cpp +1 -1
  146. data/test/test_Overloads.cpp +58 -10
  147. data/test/test_Stl_Map.cpp +8 -8
  148. data/test/test_Stl_Multimap.cpp +4 -4
  149. data/test/test_Stl_Pair.cpp +5 -3
  150. data/test/test_Stl_SharedPtr.cpp +24 -12
  151. data/test/test_Stl_String_View.cpp +10 -0
  152. data/test/test_Stl_Tuple.cpp +1 -1
  153. data/test/test_Stl_UniquePtr.cpp +8 -0
  154. data/test/test_Stl_Unordered_Map.cpp +9 -9
  155. data/test/test_Stl_Variant.cpp +9 -3
  156. data/test/test_Stl_Vector.cpp +118 -13
  157. data/test/test_Symbol.cpp +12 -0
  158. data/test/test_To_Ruby.cpp +35 -28
  159. data/test/test_Type.cpp +256 -53
  160. data/test/unittest.hpp +35 -0
  161. metadata +52 -34
  162. data/rice/Init.hpp +0 -8
  163. data/rice/Init.ipp +0 -8
  164. data/rice/detail/RubyFunction.hpp +0 -31
  165. data/rice/detail/RubyFunction.ipp +0 -77
  166. data/sample/callbacks/extconf.rb +0 -5
  167. data/sample/callbacks/sample_callbacks.cpp +0 -35
  168. data/sample/callbacks/test.rb +0 -28
  169. data/sample/enum/extconf.rb +0 -5
  170. data/sample/enum/sample_enum.cpp +0 -40
  171. data/sample/enum/test.rb +0 -8
  172. data/sample/inheritance/animals.cpp +0 -82
  173. data/sample/inheritance/extconf.rb +0 -5
  174. data/sample/inheritance/test.rb +0 -7
  175. data/sample/map/extconf.rb +0 -5
  176. data/sample/map/map.cpp +0 -73
  177. data/sample/map/test.rb +0 -7
  178. data/test/ext/t1/Foo.hpp +0 -10
  179. data/test/ext/t1/extconf.rb +0 -4
  180. data/test/ext/t1/t1.cpp +0 -13
  181. data/test/ext/t2/extconf.rb +0 -4
  182. data/test/ext/t2/t2.cpp +0 -11
  183. data/test/ruby/test_callbacks_sample.rb +0 -28
  184. data/test/ruby/test_multiple_extensions.rb +0 -18
  185. data/test/ruby/test_multiple_extensions_same_class.rb +0 -14
  186. data/test/ruby/test_multiple_extensions_with_inheritance.rb +0 -20
  187. /data/test/{test_Stl_Type.cpp → test_Stl_Type_Info.cpp} +0 -0
data/test/test_Type.cpp CHANGED
@@ -1,7 +1,8 @@
1
- #include "unittest.hpp"
1
+ #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
3
 
4
4
  #include <rice/rice.hpp>
5
+ #include <rice/stl.hpp>
5
6
 
6
7
  #include <complex>
7
8
 
@@ -40,120 +41,322 @@ TESTCASE(FindGroup)
40
41
  {
41
42
  std::string name = "class std::vector<class cv::Vec<unsigned char, 2>, class std::allocator<class cv::Vec<unsigned char, 2> > >";
42
43
 
43
- std::string group = detail::findGroup(name, 0);
44
+ detail::TypeMapper<int> typeMapper;
45
+ std::string group = typeMapper.findGroup(name, 0);
44
46
  ASSERT_EQUAL("<class cv::Vec<unsigned char, 2>, class std::allocator<class cv::Vec<unsigned char, 2> > >", group.c_str());
45
47
 
46
- group = detail::findGroup(name, 18);
48
+ group = typeMapper.findGroup(name, 18);
47
49
  ASSERT_EQUAL("<unsigned char, 2>", group.c_str());
48
50
 
49
- group = detail::findGroup(name, 49);
51
+ group = typeMapper.findGroup(name, 49);
50
52
  ASSERT_EQUAL("<class cv::Vec<unsigned char, 2> >", group.c_str());
51
53
 
52
54
  ASSERT_EXCEPTION_CHECK(
53
55
  std::runtime_error,
54
- detail::findGroup(name, 48),
56
+ typeMapper.findGroup(name, 48),
55
57
  ASSERT_EQUAL("Unbalanced Group", ex.what())
56
58
  );
57
59
  }
58
60
 
59
- TESTCASE(CppClassName)
61
+ TESTCASE(SimplifiedName)
60
62
  {
61
- std::string typeName = detail::typeName(typeid(std::string));
62
- std::string className = detail::cppClassName(typeName);
63
+ detail::TypeMapper<char*> typeMapper1;
64
+ std::string className = typeMapper1.simplifiedName();
65
+ ASSERT_EQUAL("char*", className.c_str());
66
+
67
+ detail::TypeMapper<char**> typeMapper2;
68
+ className = typeMapper2.simplifiedName();
69
+ ASSERT_EQUAL("char**", className.c_str());
70
+
71
+ detail::TypeMapper<double> typeMapper3;
72
+ className = typeMapper3.simplifiedName();
73
+ ASSERT_EQUAL("double", className.c_str());
74
+
75
+ detail::TypeMapper<double*> typeMapper4;
76
+ className = typeMapper4.simplifiedName();
77
+ ASSERT_EQUAL("double*", className.c_str());
78
+
79
+ detail::TypeMapper<std::string> typeMapper5;
80
+ className = typeMapper5.simplifiedName();
63
81
  ASSERT_EQUAL("std::string", className.c_str());
64
82
 
65
- typeName = detail::typeName(typeid(std::wstring));
66
- className = detail::cppClassName(typeName);
83
+ detail::TypeMapper<std::wstring> typeMapper6;
84
+ className = typeMapper6.simplifiedName();
67
85
  ASSERT_EQUAL("std::wstring", className.c_str());
68
86
 
69
- typeName = detail::typeName(typeid(std::vector<std::string>));
70
- className = detail::cppClassName(typeName);
87
+ detail::TypeMapper<std::vector<std::string>> typeMapper7;
88
+ className = typeMapper7.simplifiedName();
71
89
  ASSERT_EQUAL("std::vector<std::string>", className.c_str());
72
90
 
73
- typeName = detail::typeName(typeid(std::vector<std::wstring>));
74
- className = detail::cppClassName(typeName);
91
+ detail::TypeMapper<std::vector<std::wstring>> typeMapper8;
92
+ className = typeMapper8.simplifiedName();
75
93
  ASSERT_EQUAL("std::vector<std::wstring>", className.c_str());
76
94
 
77
- typeName = detail::typeName(typeid(std::vector<double*>));
78
- className = detail::cppClassName(typeName);
95
+ detail::TypeMapper<std::vector<double*>> typeMapper9;
96
+ className = typeMapper9.simplifiedName();
79
97
  ASSERT_EQUAL("std::vector<double*>", className.c_str());
80
98
 
81
- typeName = detail::typeName(typeid(std::vector<double**>));
82
- className = detail::cppClassName(typeName);
99
+ detail::TypeMapper<std::vector<double**>> typeMapper10;
100
+ className = typeMapper10.simplifiedName();
83
101
  ASSERT_EQUAL("std::vector<double**>", className.c_str());
84
102
 
85
- typeName = detail::typeName(typeid(Outer::Inner::Vec1));
86
- className = detail::cppClassName(typeName);
103
+ detail::TypeMapper<Outer::Inner::Vec1> typeMapper11;
104
+ className = typeMapper11.simplifiedName();
87
105
  ASSERT_EQUAL("std::vector<std::complex<float>>", className.c_str());
88
106
 
89
- typeName = detail::typeName(typeid(Outer::Inner::Vec2));
90
- className = detail::cppClassName(typeName);
107
+ detail::TypeMapper<Outer::Inner::Vec2> typeMapper12;
108
+ className = typeMapper12.simplifiedName();
91
109
  ASSERT_EQUAL("std::vector<unsigned char*>", className.c_str());
92
110
 
93
- typeName = detail::typeName(typeid(Outer::Inner::Vec3));
94
- className = detail::cppClassName(typeName);
111
+ detail::TypeMapper<Outer::Inner::Vec3> typeMapper13;
112
+ className = typeMapper13.simplifiedName();
95
113
  ASSERT_EQUAL("std::vector<Outer::Inner::SomeClass>", className.c_str());
96
114
 
97
- typeName = detail::typeName(typeid(Outer::Inner::Map1));
98
- className = detail::cppClassName(typeName);
115
+ detail::TypeMapper<Outer::Inner::Map1> typeMapper14;
116
+ className = typeMapper14.simplifiedName();
99
117
  ASSERT_EQUAL("std::map<std::string, std::vector<std::complex<float>>>", className.c_str());
100
118
 
101
- typeName = detail::typeName(typeid(Outer::Inner::UnorderedMap1));
102
- className = detail::cppClassName(typeName);
119
+ detail::TypeMapper<Outer::Inner::UnorderedMap1> typeMapper15;
120
+ className = typeMapper15.simplifiedName();
103
121
  ASSERT_EQUAL("std::unordered_map<std::string, std::complex<float>>", className.c_str());
104
122
  }
105
123
 
106
- TESTCASE(RubyClassName)
124
+ TESTCASE(RubyName)
107
125
  {
108
- std::string typeName = detail::typeName(typeid(std::string));
109
- std::string className = detail::rubyClassName(typeName);
126
+ detail::TypeMapper<char*> typeMapper1;
127
+ std::string className = typeMapper1.rubyName();
128
+ ASSERT_EQUAL("String", className.c_str());
129
+
130
+ detail::TypeMapper<const unsigned char> typeMapper2;
131
+ className = typeMapper2.rubyName();
132
+ ASSERT_EQUAL("String", className.c_str());
133
+
134
+ detail::TypeMapper<const unsigned char*> typeMapper3;
135
+ className = typeMapper3.rubyName();
136
+ ASSERT_EQUAL("UnsignedChar", className.c_str());
137
+
138
+ detail::TypeMapper<char**> typeMapper4;
139
+ className = typeMapper4.rubyName();
140
+ ASSERT_EQUAL("Char", className.c_str());
141
+
142
+ detail::TypeMapper<double> typeMapper5;
143
+ className = typeMapper5.rubyName();
144
+ ASSERT_EQUAL("Float", className.c_str());
145
+
146
+ detail::TypeMapper<double*> typeMapper6;
147
+ className = typeMapper6.rubyName();
148
+ ASSERT_EQUAL("Double", className.c_str());
149
+
150
+ detail::TypeMapper<Buffer<double*>> typeMapper7;
151
+ className = typeMapper7.rubyName();
152
+ ASSERT_EQUAL("Buffer≺double∗≻", className.c_str());
153
+
154
+ detail::TypeMapper<std::string> typeMapper8;
155
+ className = typeMapper8.rubyName();
110
156
  ASSERT_EQUAL("String", className.c_str());
111
157
 
112
- typeName = detail::typeName(typeid(std::wstring));
113
- className = detail::rubyClassName(typeName);
158
+ detail::TypeMapper<std::wstring> typeMapper9;
159
+ className = typeMapper9.rubyName();
114
160
  ASSERT_EQUAL("Wstring", className.c_str());
115
161
 
116
- typeName = detail::typeName(typeid(std::vector<std::string>));
117
- className = detail::rubyClassName(typeName);
162
+ detail::TypeMapper<std::vector<std::string>> typeMapper10;
163
+ className = typeMapper10.rubyName();
118
164
  ASSERT_EQUAL("Vector≺string≻", className.c_str());
119
165
 
120
- typeName = detail::typeName(typeid(std::vector<std::wstring>));
121
- className = detail::rubyClassName(typeName);
166
+ detail::TypeMapper<std::vector<std::wstring>> typeMapper11;
167
+ className = typeMapper11.rubyName();
122
168
  ASSERT_EQUAL("Vector≺wstring≻", className.c_str());
123
169
 
124
- typeName = detail::typeName(typeid(std::vector<double*>));
125
- className = detail::rubyClassName(typeName);
170
+ detail::TypeMapper<std::vector<double*>> typeMapper12;
171
+ className = typeMapper12.rubyName();
126
172
  ASSERT_EQUAL("Vector≺double∗≻", className.c_str());
127
173
 
128
- typeName = detail::typeName(typeid(std::vector<double**>));
129
- className = detail::rubyClassName(typeName);
174
+ detail::TypeMapper<std::vector<double**>> typeMapper13;
175
+ className = typeMapper13.rubyName();
130
176
  ASSERT_EQUAL("Vector≺double∗∗≻", className.c_str());
131
177
 
132
- typeName = detail::typeName(typeid(Outer::Inner::Vec1));
133
- className = detail::rubyClassName(typeName);
178
+ detail::TypeMapper<Outer::Inner::Vec1> typeMapper14;
179
+ className = typeMapper14.rubyName();
134
180
  ASSERT_EQUAL("Vector≺complex≺float≻≻", className.c_str());
135
181
 
136
- typeName = detail::typeName(typeid(Outer::Inner::Vec2));
137
- className = detail::rubyClassName(typeName);
182
+ detail::TypeMapper<Outer::Inner::Vec2> typeMapper15;
183
+ className = typeMapper15.rubyName();
138
184
  ASSERT_EQUAL("Vector≺unsigned char∗≻", className.c_str());
139
185
 
140
- typeName = detail::typeName(typeid(Outer::Inner::Vec3));
141
- className = detail::rubyClassName(typeName);
186
+ detail::TypeMapper<Outer::Inner::Vec3> typeMapper16;
187
+ className = typeMapper16.rubyName();
142
188
  ASSERT_EQUAL("Vector≺Outer꞉꞉Inner꞉꞉SomeClass≻", className.c_str());
143
189
 
144
- typeName = detail::typeName(typeid(Outer::Inner::Map1));
145
- className = detail::rubyClassName(typeName);
190
+ detail::TypeMapper<Outer::Inner::Map1> typeMapper17;
191
+ className = typeMapper17.rubyName();
146
192
  ASSERT_EQUAL("Map≺string‚ vector≺complex≺float≻≻≻", className.c_str());
147
193
 
148
- typeName = detail::typeName(typeid(Outer::Inner::UnorderedMap1));
149
- className = detail::rubyClassName(typeName);
194
+ detail::TypeMapper<Outer::Inner::UnorderedMap1> typeMapper18;
195
+ className = typeMapper18.rubyName();
150
196
  ASSERT_EQUAL("UnorderedMap≺string‚ complex≺float≻≻", className.c_str());
197
+
198
+ detail::TypeMapper<Outer::Inner::SomeClass*> typeMapper19;
199
+ className = typeMapper19.rubyName();
200
+ ASSERT_EQUAL("SomeClass", className.c_str());
201
+ }
202
+
203
+ TESTCASE(RubyKlass)
204
+ {
205
+ Module riceModule = define_module("Rice");
206
+
207
+ detail::TypeMapper<int> typeMapper1;
208
+ VALUE actual = typeMapper1.rubyKlass();
209
+ ASSERT_EQUAL(rb_cInteger, actual);
210
+
211
+ detail::TypeMapper<const int> typeMapper2;
212
+ actual = typeMapper2.rubyKlass();
213
+ ASSERT_EQUAL(rb_cInteger, actual);
214
+
215
+ detail::TypeMapper<int&> typeMapper3;
216
+ actual = typeMapper3.rubyKlass();
217
+ ASSERT_EQUAL(rb_cInteger, actual);
218
+
219
+ detail::TypeMapper<const int&> typeMapper4;
220
+ actual = typeMapper4.rubyKlass();
221
+ ASSERT_EQUAL(rb_cInteger, actual);
222
+
223
+ detail::TypeMapper<char*> typeMapper5;
224
+ actual = typeMapper5.rubyKlass();
225
+ ASSERT_EQUAL(rb_cString, actual);
226
+
227
+ detail::TypeMapper<const unsigned char> typeMapper6;
228
+ actual = typeMapper6.rubyKlass();
229
+ ASSERT_EQUAL(rb_cString, actual);
230
+
231
+ define_buffer<unsigned char>();
232
+ Object expected = riceModule.const_get("Buffer≺unsigned char≻");
233
+ detail::TypeMapper<Buffer<unsigned char>> typeMapper8;
234
+ actual = typeMapper8.rubyKlass();
235
+ ASSERT_EQUAL(expected.value(), actual);
236
+
237
+ expected = Object(rb_cObject).const_get("String");
238
+ detail::TypeMapper<char*> typeMapper9;
239
+ actual = typeMapper9.rubyKlass();
240
+ ASSERT_EQUAL(expected.value(), actual);
241
+
242
+ define_pointer<char*>();
243
+ expected = riceModule.const_get("Pointer≺char∗≻");
244
+ detail::TypeMapper<char**> typeMapper10;
245
+ actual = typeMapper10.rubyKlass();
246
+ ASSERT_EQUAL(expected.value(), actual);
247
+
248
+ define_pointer<char*>();
249
+ expected = riceModule.const_get("Pointer≺char∗≻");
250
+ detail::TypeMapper<const char**> typeMapper11;
251
+ actual = typeMapper11.rubyKlass();
252
+ ASSERT_EQUAL(expected.value(), actual);
253
+
254
+ define_buffer<char**>();
255
+ expected = riceModule.const_get("Buffer≺char∗≻");
256
+ detail::TypeMapper<Buffer<char*>> typeMapper12;
257
+ actual = typeMapper12.rubyKlass();
258
+ ASSERT_EQUAL(expected.value(), actual);
259
+
260
+ detail::TypeMapper<double> typeMapper13;
261
+ actual = typeMapper13.rubyKlass();
262
+ ASSERT_EQUAL(rb_cFloat, actual);
263
+
264
+ define_pointer<double>();
265
+ expected = riceModule.const_get("Pointer≺double≻");
266
+ detail::TypeMapper<volatile double*> typeMapper14;
267
+ actual = typeMapper14.rubyKlass();
268
+ ASSERT_EQUAL(expected.value(), actual);
269
+
270
+ define_pointer<double*>();
271
+ expected = riceModule.const_get("Pointer≺double∗≻");
272
+ detail::TypeMapper<const volatile double**> typeMapper15;
273
+ actual = typeMapper15.rubyKlass();
274
+ ASSERT_EQUAL(expected.value(), actual);
275
+
276
+ detail::TypeMapper<std::string> typeMapper16;
277
+ actual = typeMapper16.rubyKlass();
278
+ ASSERT_EQUAL(rb_cString, actual);
279
+
280
+ define_pointer<std::string>();
281
+ detail::TypeMapper<std::string*> typeMapper17;
282
+ expected = riceModule.const_get("Pointer≺string≻");
283
+ actual = typeMapper17.rubyKlass();
284
+ ASSERT_EQUAL(expected.value(), actual);
285
+
286
+ define_pointer<std::string*>();
287
+ detail::TypeMapper<std::string**> typeMapper18;
288
+ expected = riceModule.const_get("Pointer≺string∗≻");
289
+ actual = typeMapper18.rubyKlass();
290
+ ASSERT_EQUAL(expected.value(), actual);
291
+
292
+ define_vector<std::string>();
293
+ Module stdModule("Std");
294
+
295
+ detail::TypeMapper<std::vector<std::string>> typeMapper19;
296
+ expected = stdModule.const_get("Vector≺string≻");
297
+ actual = typeMapper19.rubyKlass();
298
+ ASSERT_EQUAL(expected.value(), actual);
299
+
300
+ define_class<Outer::Inner::Vec1>("Vec1");
301
+ detail::TypeMapper<Outer::Inner::Vec1> typeMapper20;
302
+ expected = Object(rb_cObject).const_get("Vec1");
303
+ actual = typeMapper20.rubyKlass();
304
+ ASSERT_EQUAL(expected.value(), actual);
305
+
306
+ define_class<Outer::Inner::Map1>("Map1");
307
+ detail::TypeMapper<Outer::Inner::Map1> typeMapper21;
308
+ expected = Object(rb_cObject).const_get("Map1");
309
+ actual = typeMapper21.rubyKlass();
310
+ ASSERT_EQUAL(expected.value(), actual);
311
+
312
+ define_class<Outer::Inner::UnorderedMap1>("UnorderedMap1");
313
+ detail::TypeMapper<Outer::Inner::UnorderedMap1> typeMapper22;
314
+ expected = Object(rb_cObject).const_get("UnorderedMap1");
315
+ actual = typeMapper22.rubyKlass();
316
+ ASSERT_EQUAL(expected.value(), actual);
317
+
318
+ define_class<Outer::Inner::SomeClass>("SomeClass");
319
+ detail::TypeMapper<Outer::Inner::SomeClass**> typeMapper23;
320
+ expected = Object(rb_cObject).const_get("SomeClass");
321
+ actual = typeMapper23.rubyKlass();
322
+ ASSERT_EQUAL(expected.value(), actual);
323
+
324
+ using Callback_T = char*(*)(int, double, bool, char*);
325
+ detail::TypeMapper<Callback_T> typeMapper24;
326
+ expected = Object(rb_cObject).const_get("Proc");
327
+ actual = typeMapper24.rubyKlass();
328
+ ASSERT_EQUAL(expected.value(), actual);
329
+
330
+ detail::TypeMapper<std::tuple<float, float>> typeMapper25;
331
+ expected = Object(rb_cObject).const_get("Array");
332
+ actual = typeMapper25.rubyKlass();
333
+ ASSERT_EQUAL(expected.value(), actual);
334
+
335
+ detail::TypeMapper<std::optional<float>> typeMapper26;
336
+ actual = typeMapper26.rubyKlass();
337
+ ASSERT_EQUAL(rb_cFloat, actual);
338
+
339
+ detail::TypeMapper<std::complex<float>> typeMapper27;
340
+ actual = typeMapper27.rubyKlass();
341
+ ASSERT_EQUAL(rb_cComplex, actual);
342
+
343
+ detail::TypeMapper<std::monostate> typeMapper28;
344
+ actual = typeMapper28.rubyKlass();
345
+ ASSERT_EQUAL(rb_cNilClass, actual);
346
+
347
+ detail::TypeMapper<std::reference_wrapper<int>> typeMapper29;
348
+ actual = typeMapper29.rubyKlass();
349
+ ASSERT_EQUAL(rb_cInteger, actual);
350
+
351
+ detail::TypeMapper<std::string_view> typeMapper30;
352
+ actual = typeMapper30.rubyKlass();
353
+ ASSERT_EQUAL(rb_cString, actual);
151
354
  }
152
355
 
153
356
  TESTCASE(MakeRubyClass)
154
357
  {
155
- std::string typeName = detail::typeName(typeid(Outer::Inner::Vec1));
156
- std::string rubyClassName = detail::rubyClassName(typeName);
358
+ detail::TypeMapper<Outer::Inner::Vec1> typeMapper;
359
+ std::string rubyClassName = typeMapper.rubyName();
157
360
 
158
361
  Module module = define_module("Testing");
159
362
 
data/test/unittest.hpp CHANGED
@@ -263,6 +263,33 @@ void assert_not_equal(
263
263
  }
264
264
  }
265
265
 
266
+ template<typename T, typename U, typename V>
267
+ void assert_in_delta(
268
+ T const& expected,
269
+ U const& actual,
270
+ V const& delta,
271
+ std::string const& s_t,
272
+ std::string const& s_u,
273
+ std::string const& s_delta,
274
+ std::string const& file,
275
+ size_t line)
276
+ {
277
+ // Negative deltas don't make sense; treat as failure for clarity.
278
+ if (delta < 0)
279
+ {
280
+ throw Assertion_Failed("assert_in_delta failed: negative delta");
281
+ }
282
+
283
+ T diff = std::abs(expected - actual);
284
+ if (!(diff <= delta))
285
+ {
286
+ std::stringstream strm;
287
+ strm << "assert_in_delta failed: |" << actual << " - " << expected << "| = "
288
+ << diff << " > " << delta;
289
+ throw Assertion_Failed(strm.str());
290
+ }
291
+ }
292
+
266
293
  #define FAIL(message, expect, got) \
267
294
  do \
268
295
  { \
@@ -285,6 +312,14 @@ void assert_not_equal(
285
312
  assert_not_equal((x), (y), #x, #y, __FILE__, __LINE__); \
286
313
  } while(0)
287
314
 
315
+ #define ASSERT_IN_DELTA(x, y, delta) \
316
+ do \
317
+ { \
318
+ ++assertions; \
319
+ assert_in_delta((x), (y), (delta), #x, #y, #delta, __FILE__, __LINE__); \
320
+ } while(0)
321
+
322
+
288
323
  #define ASSERT(x) \
289
324
  ASSERT_EQUAL(true, !!x);
290
325
 
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.6.1
4
+ version: 4.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Brannan
@@ -61,7 +61,9 @@ email:
61
61
  - curlypaul924@gmail.com
62
62
  - jasongroelofs@gmail.com
63
63
  - cfis@savagexi.com
64
- executables: []
64
+ executables:
65
+ - rice-doc.rb
66
+ - rice-rbs.rb
65
67
  extensions: []
66
68
  extra_rdoc_files:
67
69
  - README.md
@@ -75,11 +77,23 @@ files:
75
77
  - Gemfile
76
78
  - README.md
77
79
  - Rakefile
80
+ - bin/rice-doc.rb
81
+ - bin/rice-rbs.rb
78
82
  - include/rice/rice.hpp
79
83
  - include/rice/stl.hpp
80
- - lib/make_rice_headers.rb
81
84
  - lib/mkmf-rice.rb
82
85
  - lib/rice.rb
86
+ - lib/rice/doc.rb
87
+ - lib/rice/doc/cpp_reference.rb
88
+ - lib/rice/doc/doxygen.rb
89
+ - lib/rice/doc/mkdocs.rb
90
+ - lib/rice/doc/rice.rb
91
+ - lib/rice/doc/ruby.rb
92
+ - lib/rice/make_rice_headers.rb
93
+ - lib/rice/native.rb
94
+ - lib/rice/native_registry.rb
95
+ - lib/rice/parameter.rb
96
+ - lib/rice/rbs.rb
83
97
  - lib/rice/version.rb
84
98
  - lib/rubygems/builder.rb
85
99
  - lib/rubygems/cmake_builder.rb
@@ -104,14 +118,17 @@ files:
104
118
  - rice/Enum.ipp
105
119
  - rice/Exception.hpp
106
120
  - rice/Exception.ipp
107
- - rice/Init.hpp
108
- - rice/Init.ipp
121
+ - rice/Function.hpp
122
+ - rice/Function.ipp
109
123
  - rice/JumpException.hpp
110
124
  - rice/JumpException.ipp
111
125
  - rice/MemoryView.hpp
112
126
  - rice/MemoryView.ipp
127
+ - rice/Pointer.hpp
128
+ - rice/Pointer.ipp
113
129
  - rice/Return.hpp
114
130
  - rice/Return.ipp
131
+ - rice/api.hpp
115
132
  - rice/cpp_api/Array.hpp
116
133
  - rice/cpp_api/Array.ipp
117
134
  - rice/cpp_api/Builtin_Object.hpp
@@ -143,6 +160,8 @@ files:
143
160
  - rice/detail/InstanceRegistry.ipp
144
161
  - rice/detail/MethodInfo.hpp
145
162
  - rice/detail/MethodInfo.ipp
163
+ - rice/detail/ModuleRegistry.hpp
164
+ - rice/detail/ModuleRegistry.ipp
146
165
  - rice/detail/Native.hpp
147
166
  - rice/detail/Native.ipp
148
167
  - rice/detail/NativeAttributeGet.hpp
@@ -155,22 +174,29 @@ files:
155
174
  - rice/detail/NativeCallbackSimple.ipp
156
175
  - rice/detail/NativeFunction.hpp
157
176
  - rice/detail/NativeFunction.ipp
177
+ - rice/detail/NativeInvoker.hpp
178
+ - rice/detail/NativeInvoker.ipp
158
179
  - rice/detail/NativeIterator.hpp
159
180
  - rice/detail/NativeIterator.ipp
181
+ - rice/detail/NativeMethod.hpp
182
+ - rice/detail/NativeMethod.ipp
183
+ - rice/detail/NativeProc.hpp
184
+ - rice/detail/NativeProc.ipp
160
185
  - rice/detail/NativeRegistry.hpp
161
186
  - rice/detail/NativeRegistry.ipp
187
+ - rice/detail/Parameter.hpp
188
+ - rice/detail/Parameter.ipp
162
189
  - rice/detail/Proc.hpp
163
190
  - rice/detail/Proc.ipp
164
191
  - rice/detail/Registries.hpp
165
192
  - rice/detail/Registries.ipp
166
- - rice/detail/RubyFunction.hpp
167
- - rice/detail/RubyFunction.ipp
168
193
  - rice/detail/RubyType.hpp
169
194
  - rice/detail/RubyType.ipp
170
195
  - rice/detail/Type.hpp
171
196
  - rice/detail/Type.ipp
172
197
  - rice/detail/TypeRegistry.hpp
173
198
  - rice/detail/TypeRegistry.ipp
199
+ - rice/detail/Types.ipp
174
200
  - rice/detail/Wrapper.hpp
175
201
  - rice/detail/Wrapper.ipp
176
202
  - rice/detail/cpp_protect.hpp
@@ -187,6 +213,20 @@ files:
187
213
  - rice/libc/file.hpp
188
214
  - rice/libc/file.ipp
189
215
  - rice/rice.hpp
216
+ - rice/rice_api/Arg.hpp
217
+ - rice/rice_api/Arg.ipp
218
+ - rice/rice_api/ModuleRegistry.hpp
219
+ - rice/rice_api/ModuleRegistry.ipp
220
+ - rice/rice_api/Native.hpp
221
+ - rice/rice_api/Native.ipp
222
+ - rice/rice_api/NativeRegistry.hpp
223
+ - rice/rice_api/NativeRegistry.ipp
224
+ - rice/rice_api/Parameter.hpp
225
+ - rice/rice_api/Parameter.ipp
226
+ - rice/rice_api/Registries.hpp
227
+ - rice/rice_api/Registries.ipp
228
+ - rice/rice_api/TypeRegistry.hpp
229
+ - rice/rice_api/TypeRegistry.ipp
190
230
  - rice/ruby_mark.hpp
191
231
  - rice/stl.hpp
192
232
  - rice/stl/complex.hpp
@@ -195,6 +235,8 @@ files:
195
235
  - rice/stl/exception.ipp
196
236
  - rice/stl/exception_ptr.hpp
197
237
  - rice/stl/exception_ptr.ipp
238
+ - rice/stl/filesystem.hpp
239
+ - rice/stl/filesystem.ipp
198
240
  - rice/stl/map.hpp
199
241
  - rice/stl/map.ipp
200
242
  - rice/stl/monostate.hpp
@@ -233,30 +275,9 @@ files:
233
275
  - rice/traits/function_traits.hpp
234
276
  - rice/traits/method_traits.hpp
235
277
  - rice/traits/rice_traits.hpp
236
- - sample/callbacks/extconf.rb
237
- - sample/callbacks/sample_callbacks.cpp
238
- - sample/callbacks/test.rb
239
- - sample/enum/extconf.rb
240
- - sample/enum/sample_enum.cpp
241
- - sample/enum/test.rb
242
- - sample/inheritance/animals.cpp
243
- - sample/inheritance/extconf.rb
244
- - sample/inheritance/test.rb
245
- - sample/map/extconf.rb
246
- - sample/map/map.cpp
247
- - sample/map/test.rb
248
278
  - test/embed_ruby.cpp
249
279
  - test/embed_ruby.hpp
250
- - test/ext/t1/Foo.hpp
251
- - test/ext/t1/extconf.rb
252
- - test/ext/t1/t1.cpp
253
- - test/ext/t2/extconf.rb
254
- - test/ext/t2/t2.cpp
255
280
  - test/extconf.rb
256
- - test/ruby/test_callbacks_sample.rb
257
- - test/ruby/test_multiple_extensions.rb
258
- - test/ruby/test_multiple_extensions_same_class.rb
259
- - test/ruby/test_multiple_extensions_with_inheritance.rb
260
281
  - test/test_Address_Registration_Guard.cpp
261
282
  - test/test_Array.cpp
262
283
  - test/test_Attribute.cpp
@@ -272,6 +293,7 @@ files:
272
293
  - test/test_Exception.cpp
273
294
  - test/test_File.cpp
274
295
  - test/test_From_Ruby.cpp
296
+ - test/test_GVL.cpp
275
297
  - test/test_Hash.cpp
276
298
  - test/test_Identifier.cpp
277
299
  - test/test_Inheritance.cpp
@@ -298,7 +320,7 @@ files:
298
320
  - test/test_Stl_String.cpp
299
321
  - test/test_Stl_String_View.cpp
300
322
  - test/test_Stl_Tuple.cpp
301
- - test/test_Stl_Type.cpp
323
+ - test/test_Stl_Type_Info.cpp
302
324
  - test/test_Stl_UniquePtr.cpp
303
325
  - test/test_Stl_Unordered_Map.cpp
304
326
  - test/test_Stl_Variant.cpp
@@ -338,8 +360,4 @@ requirements: []
338
360
  rubygems_version: 3.6.9
339
361
  specification_version: 4
340
362
  summary: Ruby Interface for C++ Extensions
341
- test_files:
342
- - test/ruby/test_callbacks_sample.rb
343
- - test/ruby/test_multiple_extensions.rb
344
- - test/ruby/test_multiple_extensions_same_class.rb
345
- - test/ruby/test_multiple_extensions_with_inheritance.rb
363
+ test_files: []
data/rice/Init.hpp DELETED
@@ -1,8 +0,0 @@
1
- #ifndef Rice__Init__hpp_
2
- #define Rice__Init__hpp_
3
-
4
- namespace Rice
5
- {
6
- void init();
7
- }
8
- #endif // Rice__Init__hpp_
data/rice/Init.ipp DELETED
@@ -1,8 +0,0 @@
1
- namespace Rice
2
- {
3
- inline void init()
4
- {
5
- detail::define_ruby_types();
6
- define_fundamental_buffer_types();
7
- };
8
- }
@@ -1,31 +0,0 @@
1
- #ifndef Rice__detail__ruby_function__hpp_
2
- #define Rice__detail__ruby_function__hpp_
3
-
4
- namespace Rice::detail
5
- {
6
- /* This is functor class that wraps calls to a Ruby C API method. It is needed because
7
- rb_protect only supports calling methods that take one argument. Thus
8
- we invoke rb_protect telling it to invoke Ruby_Function::call with an
9
- instance of a Ruby_Function. That instance then in turn calls the original
10
- Ruby method passing along its required arguments. */
11
-
12
- template<typename Function_T, typename...Arg_Ts>
13
- class RubyFunction
14
- {
15
- public:
16
- using Return_T = typename function_traits<Function_T>::return_type;
17
-
18
- public:
19
- RubyFunction(Function_T func, const Arg_Ts&... args);
20
- Return_T operator()();
21
-
22
- private:
23
- Function_T func_;
24
- std::tuple<Arg_Ts...> args_;
25
- };
26
-
27
- template<typename Function_T, typename ...Arg_Ts>
28
- auto protect(Function_T func, Arg_Ts...args);
29
- }
30
-
31
- #endif // Rice__detail__ruby_function__hpp_