rice 4.6.1 → 4.7.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.
Files changed (185) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/CMakeLists.txt +0 -4
  4. data/Rakefile +2 -8
  5. data/bin/rice-doc.rb +212 -0
  6. data/bin/rice-rbs.rb +93 -0
  7. data/include/rice/rice.hpp +4972 -4015
  8. data/include/rice/stl.hpp +822 -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 +101 -82
  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 +2 -2
  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 +34 -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 -2
  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 +27 -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 +5 -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 +11 -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 +0 -55
  138. data/test/test_Data_Type.cpp +19 -30
  139. data/test/test_Enum.cpp +4 -46
  140. data/test/test_From_Ruby.cpp +88 -81
  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 +3 -3
  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_Tuple.cpp +1 -1
  152. data/test/test_Stl_UniquePtr.cpp +8 -0
  153. data/test/test_Stl_Unordered_Map.cpp +9 -9
  154. data/test/test_Stl_Variant.cpp +9 -3
  155. data/test/test_Stl_Vector.cpp +118 -13
  156. data/test/test_To_Ruby.cpp +35 -28
  157. data/test/test_Type.cpp +256 -53
  158. data/test/unittest.hpp +35 -0
  159. metadata +66 -34
  160. data/rice/Init.hpp +0 -8
  161. data/rice/Init.ipp +0 -8
  162. data/rice/detail/RubyFunction.hpp +0 -31
  163. data/rice/detail/RubyFunction.ipp +0 -77
  164. data/sample/callbacks/extconf.rb +0 -5
  165. data/sample/callbacks/sample_callbacks.cpp +0 -35
  166. data/sample/callbacks/test.rb +0 -28
  167. data/sample/enum/extconf.rb +0 -5
  168. data/sample/enum/sample_enum.cpp +0 -40
  169. data/sample/enum/test.rb +0 -8
  170. data/sample/inheritance/animals.cpp +0 -82
  171. data/sample/inheritance/extconf.rb +0 -5
  172. data/sample/inheritance/test.rb +0 -7
  173. data/sample/map/extconf.rb +0 -5
  174. data/sample/map/map.cpp +0 -73
  175. data/sample/map/test.rb +0 -7
  176. data/test/ext/t1/Foo.hpp +0 -10
  177. data/test/ext/t1/extconf.rb +0 -4
  178. data/test/ext/t1/t1.cpp +0 -13
  179. data/test/ext/t2/extconf.rb +0 -4
  180. data/test/ext/t2/t2.cpp +0 -11
  181. data/test/ruby/test_callbacks_sample.rb +0 -28
  182. data/test/ruby/test_multiple_extensions.rb +0 -18
  183. data/test/ruby/test_multiple_extensions_same_class.rb +0 -14
  184. data/test/ruby/test_multiple_extensions_with_inheritance.rb +0 -20
  185. /data/test/{test_Stl_Type.cpp → test_Stl_Type_Info.cpp} +0 -0
@@ -1,4 +1,4 @@
1
- #include "unittest.hpp"
1
+ #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
3
  #include <rice/rice.hpp>
4
4
 
@@ -13,7 +13,6 @@ TESTSUITE(ToRuby);
13
13
  SETUP(ToRuby)
14
14
  {
15
15
  embed_ruby();
16
- define_fundamental_buffer_types();
17
16
  }
18
17
 
19
18
  TEARDOWN(ToRuby)
@@ -210,13 +209,20 @@ TESTCASE(unsigned_char_ptr_buffer)
210
209
  .define_attr("data", &Matrix2UnsignedChar::data, Rice::AttrAccess::Read);
211
210
 
212
211
  std::string code = R"(matrix = Matrix2UnsignedChar.new
213
- buffer = matrix.ptr
212
+ buffer = matrix.ptr.buffer
214
213
  buffer.bytes(5))";
215
214
  String buffer = m.module_eval(code);
216
215
  ASSERT_EQUAL("\x1\x2\x3\x4\x5", buffer.str());
217
216
 
218
217
  code = R"(matrix = Matrix2UnsignedChar.new
219
- buffer = matrix.ptr
218
+ ptr = matrix.ptr
219
+ buffer = Rice::Buffer≺unsigned char≻.new(ptr)
220
+ buffer.bytes(5))";
221
+ buffer = m.module_eval(code);
222
+ ASSERT_EQUAL("\x1\x2\x3\x4\x5", buffer.str());
223
+
224
+ code = R"(matrix = Matrix2UnsignedChar.new
225
+ buffer = matrix.ptr.buffer
220
226
  buffer.bytes(0))";
221
227
  buffer = m.module_eval(code);
222
228
  ASSERT_EQUAL("", buffer.str());
@@ -238,7 +244,7 @@ TESTCASE(unsigned_char_ptr_array)
238
244
  .define_method("ptr", &Matrix2UnsignedChar::ptr);
239
245
 
240
246
  std::string code = R"(matrix = Matrix2UnsignedChar.new
241
- buffer = matrix.ptr
247
+ buffer = matrix.ptr.buffer
242
248
  buffer.to_ary(5))";
243
249
 
244
250
  std::vector<unsigned char> expected = std::vector<unsigned char>{ 1,2,3,4,5 };
@@ -247,8 +253,8 @@ TESTCASE(unsigned_char_ptr_array)
247
253
  ASSERT_EQUAL(expected, actual);
248
254
 
249
255
  code = R"(matrix = Matrix2UnsignedChar.new
250
- buffer = matrix.ptr
251
- buffer.to_ary(1))";
256
+ buffer = matrix.ptr.buffer
257
+ buffer.to_ary(1))";
252
258
 
253
259
  expected = std::vector<unsigned char>{ 1 };
254
260
  array = m.module_eval(code);
@@ -266,9 +272,9 @@ TESTCASE(unsigned_char_ptr_ptr_buffer)
266
272
  .define_attr("data", &Matrix3UnsignedChar::data, Rice::AttrAccess::Read);
267
273
 
268
274
  std::string code = R"(matrix = Matrix3UnsignedChar.new
269
- buffer = matrix.ptr
270
- buffer2 = buffer.to_ary(1).first
271
- buffer2.to_ary(5))";
275
+ buffer = matrix.ptr.buffer
276
+ buffer2 = buffer.to_ary(1).first
277
+ buffer2.to_ary(5))";
272
278
  Array array = m.module_eval(code);
273
279
  ASSERT_EQUAL(5, array.size());
274
280
 
@@ -276,7 +282,7 @@ TESTCASE(unsigned_char_ptr_ptr_buffer)
276
282
  std::vector<unsigned char> actual = array.to_vector<unsigned char>();
277
283
  ASSERT_EQUAL(expected, actual);
278
284
  }
279
-
285
+ /*
280
286
  TESTCASE(unsigned_char_ptr_ptr_array)
281
287
  {
282
288
  Module m = define_module("ToRubyPtr");
@@ -286,7 +292,7 @@ TESTCASE(unsigned_char_ptr_ptr_array)
286
292
  .define_method("ptr", &Matrix3UnsignedChar::ptr);
287
293
 
288
294
  std::string code = R"(matrix = Matrix3UnsignedChar.new
289
- buffer = matrix.ptr
295
+ buffer = matrix.ptr.buffer
290
296
  buffer.to_ary(5))";
291
297
 
292
298
  Array pointers = m.module_eval(code);
@@ -312,7 +318,7 @@ TESTCASE(short_ptr_buffer)
312
318
  .define_method("ptr", &Matrix2Short::ptr);
313
319
 
314
320
  std::string code = R"(matrix = Matrix2Short.new
315
- buffer = matrix.ptr
321
+ buffer = matrix.ptr.buffer
316
322
  buffer.bytes(5))";
317
323
 
318
324
  std::string expected = "\x1\0\x2\0\x3\0\x4\0\x5\0"s;
@@ -320,7 +326,7 @@ TESTCASE(short_ptr_buffer)
320
326
  ASSERT_EQUAL(expected, buffer.str());
321
327
 
322
328
  code = R"(matrix = Matrix2Short.new
323
- buffer = matrix.ptr
329
+ buffer = matrix.ptr.buffer
324
330
  buffer.bytes(0))";
325
331
  expected = ""s;
326
332
  buffer = m.module_eval(code);
@@ -336,7 +342,7 @@ TESTCASE(short_ptr_array)
336
342
  .define_method("ptr", &Matrix2Short::ptr);
337
343
 
338
344
  std::string code = R"(matrix = Matrix2Short.new
339
- buffer = matrix.ptr
345
+ buffer = matrix.ptr.buffer
340
346
  buffer.to_ary(5))";
341
347
 
342
348
  std::vector<short> expected = std::vector<short>{1,2,3,4,5};
@@ -354,7 +360,7 @@ TESTCASE(unsigned_short_ptr_buffer)
354
360
  .define_method("ptr", &Matrix2UnsignedShort::ptr);
355
361
 
356
362
  std::string code = R"(matrix = Matrix2UnsignedShort.new
357
- buffer = matrix.ptr
363
+ buffer = matrix.ptr.buffer
358
364
  buffer.bytes(5))";
359
365
 
360
366
  std::string expected = "\x1\0\x2\0\x3\0\x4\0\x5\0"s;
@@ -362,7 +368,7 @@ TESTCASE(unsigned_short_ptr_buffer)
362
368
  ASSERT_EQUAL(expected, buffer.str());
363
369
 
364
370
  code = R"(matrix = Matrix2UnsignedShort.new
365
- buffer = matrix.ptr
371
+ buffer = matrix.ptr.buffer
366
372
  buffer.bytes(0))";
367
373
  expected = ""s;
368
374
  buffer = m.module_eval(code);
@@ -378,7 +384,7 @@ TESTCASE(unsigned_short_ptr_array)
378
384
  .define_method("ptr", &Matrix2UnsignedShort::ptr);
379
385
 
380
386
  std::string code = R"(matrix = Matrix2UnsignedShort.new
381
- buffer = matrix.ptr
387
+ buffer = matrix.ptr.buffer
382
388
  buffer.to_ary(5))";
383
389
 
384
390
  std::vector<unsigned short> expected = std::vector<unsigned short>{ 1,2,3,4,5 };
@@ -396,7 +402,7 @@ TESTCASE(int_ptr_buffer)
396
402
  .define_method("ptr", &Matrix2Int::ptr);
397
403
 
398
404
  std::string code = R"(matrix = Matrix2Int.new
399
- buffer = matrix.ptr
405
+ buffer = matrix.ptr.buffer
400
406
  buffer.bytes(5))";
401
407
 
402
408
  std::string expected = "\x1\0\0\0\x2\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0"s;
@@ -404,7 +410,7 @@ TESTCASE(int_ptr_buffer)
404
410
  ASSERT_EQUAL(expected, buffer.str());
405
411
 
406
412
  code = R"(matrix = Matrix2Int.new
407
- buffer = matrix.ptr
413
+ buffer = matrix.ptr.buffer
408
414
  buffer.bytes(0))";
409
415
  expected = ""s;
410
416
  buffer = m.module_eval(code);
@@ -420,7 +426,7 @@ TESTCASE(int_ptr_array)
420
426
  .define_method("ptr", &Matrix2Int::ptr);
421
427
 
422
428
  std::string code = R"(matrix = Matrix2Int.new
423
- buffer = matrix.ptr
429
+ buffer = matrix.ptr.buffer
424
430
  buffer.to_ary(5))";
425
431
 
426
432
  std::vector<int> expected = std::vector<int>{ 1,2,3,4,5 };
@@ -438,7 +444,7 @@ TESTCASE(float_ptr_buffer)
438
444
  .define_method("ptr", &Matrix2Float::ptr);
439
445
 
440
446
  std::string code = R"(matrix = Matrix2Float.new
441
- buffer = matrix.ptr
447
+ buffer = matrix.ptr.buffer
442
448
  buffer.bytes(5))";
443
449
 
444
450
  std::string expected = "\0\0\x80\x3f\0\0\0\x40\0\0\x40\x40\0\0\x80\x40\0\0\xa0\x40"s;
@@ -446,7 +452,7 @@ TESTCASE(float_ptr_buffer)
446
452
  ASSERT_EQUAL(expected, buffer.str());
447
453
 
448
454
  code = R"(matrix = Matrix2Float.new
449
- buffer = matrix.ptr
455
+ buffer = matrix.ptr.buffer
450
456
  buffer.bytes(0))";
451
457
  expected = ""s;
452
458
  buffer = m.module_eval(code);
@@ -462,7 +468,7 @@ TESTCASE(float_ptr_array)
462
468
  .define_method("ptr", &Matrix2Float::ptr);
463
469
 
464
470
  std::string code = R"(matrix = Matrix2Float.new
465
- buffer = matrix.ptr
471
+ buffer = matrix.ptr.buffer
466
472
  buffer.to_ary(5))";
467
473
 
468
474
  std::vector<float> expected = std::vector<float>{ 1.0,2.0,3.0,4.0,5.0 };
@@ -480,7 +486,7 @@ TESTCASE(double_ptr_buffer)
480
486
  .define_method("ptr", &Matrix2Double::ptr);
481
487
 
482
488
  std::string code = R"(matrix = Matrix2Double.new
483
- buffer = matrix.ptr
489
+ buffer = matrix.ptr.buffer
484
490
  buffer.bytes(5))";
485
491
 
486
492
  std::string expected = "\0\0\0\0\0\0\xf0\x3f\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\x08\x40\0\0\0\0\0\0\x10\x40\0\0\0\0\0\0\x14\x40"s;
@@ -489,7 +495,7 @@ TESTCASE(double_ptr_buffer)
489
495
  ASSERT_EQUAL(expected, buffer.str());
490
496
 
491
497
  code = R"(matrix = Matrix2Double.new
492
- buffer = matrix.ptr
498
+ buffer = matrix.ptr.buffer
493
499
  buffer.bytes(0))";
494
500
  expected = ""s;
495
501
  buffer = m.module_eval(code);
@@ -505,7 +511,7 @@ TESTCASE(double_ptr_array)
505
511
  .define_method("ptr", &Matrix2Double::ptr);
506
512
 
507
513
  std::string code = R"(matrix = Matrix2Double.new
508
- buffer = matrix.ptr
514
+ buffer = matrix.ptr.buffer
509
515
  buffer.to_ary(5))";
510
516
 
511
517
  std::vector<double> expected = std::vector<double>{ 1.0,2.0,3.0,4.0,5.0 };
@@ -514,7 +520,7 @@ TESTCASE(double_ptr_array)
514
520
  ASSERT_EQUAL(expected, actual);
515
521
 
516
522
  code = R"(matrix = Matrix2Double.new
517
- buffer = matrix.ptr
523
+ buffer = matrix.ptr.buffer
518
524
  buffer.to_ary(0))";
519
525
 
520
526
  expected = std::vector<double>{ };
@@ -522,3 +528,4 @@ TESTCASE(double_ptr_array)
522
528
  actual = array.to_vector<double>();
523
529
  ASSERT_EQUAL(expected, actual);
524
530
  }
531
+ */
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