rice 4.9.0 → 4.9.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -1
  3. data/CMakePresets.json +77 -50
  4. data/FindRuby.cmake +1 -1
  5. data/include/rice/rice.hpp +114 -81
  6. data/include/rice/stl.hpp +157 -95
  7. data/lib/rice/doc/config.rb +57 -57
  8. data/lib/rice/doc/cpp_reference.rb +158 -158
  9. data/lib/rice/doc/doxygen.rb +289 -289
  10. data/lib/rice/doc/mkdocs.rb +332 -332
  11. data/lib/rice/doc/rice.rb +48 -48
  12. data/lib/rice/doc/ruby.rb +26 -26
  13. data/lib/rice/native.rb +15 -15
  14. data/lib/rice/native_registry.rb +12 -12
  15. data/lib/rice/parameter.rb +5 -5
  16. data/lib/rice/rbs.rb +71 -71
  17. data/lib/rice/version.rb +1 -1
  18. data/lib/rubygems/builder.rb +9 -9
  19. data/lib/rubygems_plugin.rb +8 -8
  20. data/rice/Data_Type.ipp +1 -1
  21. data/rice/detail/Native.ipp +2 -4
  22. data/rice/detail/NativeAttributeGet.ipp +1 -1
  23. data/rice/detail/NativeAttributeSet.hpp +5 -3
  24. data/rice/detail/NativeAttributeSet.ipp +41 -33
  25. data/rice/detail/NativeMethod.ipp +25 -22
  26. data/rice/detail/NativeRegistry.hpp +3 -2
  27. data/rice/detail/NativeRegistry.ipp +13 -9
  28. data/rice/detail/Parameter.ipp +3 -4
  29. data/rice/detail/Wrapper.hpp +5 -1
  30. data/rice/detail/Wrapper.ipp +15 -1
  31. data/rice/stl/exception.ipp +1 -1
  32. data/rice/stl/filesystem.ipp +1 -1
  33. data/rice/stl/map.ipp +13 -11
  34. data/rice/stl/multimap.ipp +13 -11
  35. data/rice/stl/pair.ipp +14 -8
  36. data/rice/stl/set.ipp +16 -16
  37. data/rice/stl/shared_ptr.ipp +15 -1
  38. data/rice/stl/type_index.ipp +1 -1
  39. data/rice/stl/unique_ptr.ipp +2 -2
  40. data/rice/stl/unordered_map.ipp +14 -12
  41. data/rice/stl/vector.ipp +67 -31
  42. data/test/test_Attribute.cpp +72 -0
  43. data/test/test_Callback.cpp +3 -0
  44. data/test/test_Stl_Map.cpp +46 -0
  45. data/test/test_Stl_Multimap.cpp +46 -0
  46. data/test/test_Stl_Set.cpp +34 -0
  47. data/test/test_Stl_Unordered_Map.cpp +46 -0
  48. data/test/test_Stl_Variant.cpp +10 -14
  49. data/test/test_Stl_Vector.cpp +140 -13
  50. data/test/test_Tracking.cpp +3 -0
  51. metadata +1 -1
@@ -16,6 +16,7 @@ SETUP(Vector)
16
16
 
17
17
  TEARDOWN(Vector)
18
18
  {
19
+ Rice::detail::Registries::instance.natives.reset(rb_mKernel);
19
20
  rb_gc_start();
20
21
  }
21
22
 
@@ -40,7 +41,7 @@ Class makeVectorClass()
40
41
 
41
42
  return c;
42
43
  }
43
-
44
+ /*
44
45
  TESTCASE(StringVector)
45
46
  {
46
47
  Module m = define_module("Testing");
@@ -215,7 +216,7 @@ TESTCASE(Indexing)
215
216
  vec.call("push", 0);
216
217
  vec.call("push", 1);
217
218
  vec.call("push", 2);
218
-
219
+
219
220
  Object result = vec.call("size");
220
221
  ASSERT_EQUAL(3, detail::From_Ruby<int32_t>().convert(result));
221
222
 
@@ -520,7 +521,7 @@ TESTCASE(NotDefaultConstructable)
520
521
  {
521
522
  define_class<NotComparable>("NotComparable").
522
523
  define_constructor(Constructor<NotComparable, uint32_t>());
523
-
524
+
524
525
  Class c = define_vector<NotComparable>("NotComparableVector");
525
526
  Object vec = c.call("new");
526
527
 
@@ -579,7 +580,7 @@ TESTCASE(Comparable)
579
580
  Class c = define_vector<Comparable>("ComparableVector");
580
581
 
581
582
  Object vec = c.call("new");
582
-
583
+
583
584
  Comparable comparable1(1);
584
585
  vec.call("push", comparable1);
585
586
 
@@ -818,7 +819,7 @@ TESTCASE(DefaultValue)
818
819
  TESTCASE(ToArray)
819
820
  {
820
821
  Module m = define_module("Testing");
821
-
822
+
822
823
  Class c = define_vector<std::string>("StringVector").
823
824
  define_constructor(Constructor<std::vector<std::string>>());
824
825
 
@@ -992,13 +993,7 @@ namespace
992
993
  public:
993
994
  static inline std::vector<std::string> instance_{ "one", "two", "three" };
994
995
  };
995
-
996
- /* std::ostream& operator<<(std::ostream& stream, const std::vector<std::string>& vector)
997
- {
998
- stream << vector;
999
- return stream;
1000
- }*/
1001
-
996
+
1002
997
  void createFactoryClass()
1003
998
  {
1004
999
  define_class<Factory>("Factory").
@@ -1149,7 +1144,7 @@ TESTCASE(StringPointerVector)
1149
1144
  ASSERT_EQUAL(1, array.size());
1150
1145
  ASSERT_EQUAL("World", detail::From_Ruby<std::string>().convert(array[0].value()).c_str());
1151
1146
  }
1152
-
1147
+ */
1153
1148
  namespace
1154
1149
  {
1155
1150
  class MyClass2
@@ -1186,6 +1181,81 @@ TESTCASE(MyClass2PointerVector)
1186
1181
  ASSERT_EQUAL("Hello MyClass2", pMyClass->name);
1187
1182
  }
1188
1183
 
1184
+ TESTCASE(KeepAliveArrayConstructor)
1185
+ {
1186
+ Class c = define_class<MyClass2>("MyClass2").
1187
+ define_constructor(Constructor<MyClass2, std::string>()).
1188
+ define_attr("name", &MyClass2::name, AttrAccess::Read);
1189
+
1190
+ define_vector<MyClass2*>("MyClass2PointerVector");
1191
+
1192
+ Module m = define_module("Testing");
1193
+
1194
+ std::string code = R"(
1195
+ array = []
1196
+ 3.times do |i|
1197
+ array << MyClass2.new("instance#{i + 1}")
1198
+ end
1199
+
1200
+ vector = Std::MyClass2PointerVector.new(array)
1201
+ array = nil
1202
+ GC.start
1203
+
1204
+ names = []
1205
+ vector.each do |instance|
1206
+ names << instance.name
1207
+ end
1208
+ names
1209
+ )";
1210
+
1211
+ Array result = m.module_eval(code);
1212
+ ASSERT_EQUAL(3, result.size());
1213
+ ASSERT_EQUAL("instance1", detail::From_Ruby<std::string>().convert(result[0].value()));
1214
+ ASSERT_EQUAL("instance2", detail::From_Ruby<std::string>().convert(result[1].value()));
1215
+ ASSERT_EQUAL("instance3", detail::From_Ruby<std::string>().convert(result[2].value()));
1216
+ }
1217
+
1218
+ TESTCASE(KeepAlive)
1219
+ {
1220
+ Class c = define_class<MyClass2>("MyClass2").
1221
+ define_constructor(Constructor<MyClass2, std::string>()).
1222
+ define_attr("name", &MyClass2::name, AttrAccess::Read);
1223
+
1224
+ define_vector<MyClass2*>("MyClass2PointerVector");
1225
+
1226
+ Module m = define_module("Testing");
1227
+
1228
+ std::string code = R"(
1229
+ vector = Std::MyClass2PointerVector.new
1230
+
1231
+ # Test push_back
1232
+ 3.times do |i|
1233
+ vector.push(MyClass2.new("instance#{i + 1}"))
1234
+ end
1235
+
1236
+ # Test insert
1237
+ vector.insert(1, MyClass2.new("inserted"))
1238
+
1239
+ # Test []=
1240
+ vector[0] = MyClass2.new("replaced")
1241
+
1242
+ GC.start
1243
+
1244
+ names = []
1245
+ vector.each do |instance|
1246
+ names << instance.name
1247
+ end
1248
+ names
1249
+ )";
1250
+
1251
+ Array result = m.module_eval(code);
1252
+ ASSERT_EQUAL(4, result.size());
1253
+ ASSERT_EQUAL("replaced", detail::From_Ruby<std::string>().convert(result[0].value()));
1254
+ ASSERT_EQUAL("inserted", detail::From_Ruby<std::string>().convert(result[1].value()));
1255
+ ASSERT_EQUAL("instance2", detail::From_Ruby<std::string>().convert(result[2].value()));
1256
+ ASSERT_EQUAL("instance3", detail::From_Ruby<std::string>().convert(result[3].value()));
1257
+ }
1258
+
1189
1259
  namespace
1190
1260
  {
1191
1261
  bool typeCheckValue(std::vector<std::string>)
@@ -1253,3 +1323,60 @@ TESTCASE(TypeCheck)
1253
1323
  result = m.module_eval(code),
1254
1324
  ASSERT_EQUAL("wrong argument type Std::Vector≺int≻ (expected Std::Vector≺string≻)", ex.what()));
1255
1325
  }
1326
+
1327
+ namespace
1328
+ {
1329
+ class ClassA
1330
+ {
1331
+ public:
1332
+ ClassA() = default;
1333
+ };
1334
+
1335
+ class ClassB
1336
+ {
1337
+ public:
1338
+ ClassB() = default;
1339
+ };
1340
+
1341
+ std::string vectorOverload(std::vector<ClassA>&)
1342
+ {
1343
+ return "ClassA";
1344
+ }
1345
+
1346
+ std::string vectorOverload(std::vector<ClassB>&)
1347
+ {
1348
+ return "ClassB";
1349
+ }
1350
+ }
1351
+
1352
+ TESTCASE(VectorOverloadResolution)
1353
+ {
1354
+ define_class<ClassA>("ClassA").
1355
+ define_constructor(Constructor<ClassA>());
1356
+
1357
+ define_class<ClassB>("ClassB").
1358
+ define_constructor(Constructor<ClassB>());
1359
+
1360
+ define_global_function<std::string(*)(std::vector<ClassA>&)>("vector_overload", &vectorOverload);
1361
+ define_global_function<std::string(*)(std::vector<ClassB>&)>("vector_overload", &vectorOverload);
1362
+
1363
+ Module m = define_module("Testing");
1364
+
1365
+ // When passing array with ClassA instance, should call ClassA overload
1366
+ std::string code = R"(
1367
+ a = ClassA.new
1368
+ vector_overload([a])
1369
+ )";
1370
+
1371
+ Object result = m.module_eval(code);
1372
+ ASSERT_EQUAL("ClassA", detail::From_Ruby<std::string>().convert(result));
1373
+
1374
+ // When passing array with ClassB instance, should call ClassB overload
1375
+ code = R"(
1376
+ b = ClassB.new
1377
+ vector_overload([b])
1378
+ )";
1379
+
1380
+ result = m.module_eval(code);
1381
+ ASSERT_EQUAL("ClassB", detail::From_Ruby<std::string>().convert(result));
1382
+ }
@@ -50,7 +50,10 @@ namespace
50
50
 
51
51
  MyClass moveValue()
52
52
  {
53
+ #pragma GCC diagnostic push
54
+ #pragma GCC diagnostic ignored "-Wpessimizing-move"
53
55
  return std::move(MyClass());
56
+ #pragma GCC diagnostic pop
54
57
  }
55
58
 
56
59
  MyClass* instance()
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.9.0
4
+ version: 4.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Brannan