rice 4.0.4 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/Rakefile +1 -1
  4. data/include/rice/rice.hpp +2596 -1771
  5. data/include/rice/stl.hpp +1580 -271
  6. data/lib/mkmf-rice.rb +5 -2
  7. data/lib/version.rb +1 -1
  8. data/rice/Arg.hpp +6 -6
  9. data/rice/Arg.ipp +8 -9
  10. data/rice/Constructor.hpp +2 -2
  11. data/rice/Data_Object.ipp +69 -15
  12. data/rice/Data_Object_defn.hpp +1 -15
  13. data/rice/Data_Type.ipp +56 -86
  14. data/rice/Data_Type_defn.hpp +14 -17
  15. data/rice/Director.hpp +0 -1
  16. data/rice/Enum.ipp +31 -22
  17. data/rice/Exception.ipp +2 -3
  18. data/rice/Exception_defn.hpp +5 -5
  19. data/rice/HandlerRegistration.hpp +15 -0
  20. data/rice/Return.hpp +5 -4
  21. data/rice/Return.ipp +8 -3
  22. data/rice/detail/ExceptionHandler.hpp +8 -0
  23. data/rice/detail/ExceptionHandler.ipp +28 -0
  24. data/rice/detail/{Exception_Handler_defn.hpp → ExceptionHandler_defn.hpp} +17 -21
  25. data/rice/detail/HandlerRegistry.hpp +51 -0
  26. data/rice/detail/HandlerRegistry.ipp +20 -0
  27. data/rice/detail/InstanceRegistry.hpp +34 -0
  28. data/rice/detail/InstanceRegistry.ipp +50 -0
  29. data/rice/detail/MethodInfo.ipp +1 -1
  30. data/rice/detail/NativeAttribute.hpp +26 -15
  31. data/rice/detail/NativeAttribute.ipp +76 -47
  32. data/rice/detail/NativeFunction.hpp +60 -13
  33. data/rice/detail/NativeFunction.ipp +103 -85
  34. data/rice/detail/NativeIterator.hpp +49 -0
  35. data/rice/detail/NativeIterator.ipp +102 -0
  36. data/rice/detail/NativeRegistry.hpp +31 -0
  37. data/rice/detail/{method_data.ipp → NativeRegistry.ipp} +20 -16
  38. data/rice/detail/Registries.hpp +26 -0
  39. data/rice/detail/Registries.ipp +23 -0
  40. data/rice/detail/RubyFunction.hpp +6 -11
  41. data/rice/detail/RubyFunction.ipp +10 -22
  42. data/rice/detail/Type.hpp +1 -1
  43. data/rice/detail/Type.ipp +2 -2
  44. data/rice/detail/TypeRegistry.hpp +8 -11
  45. data/rice/detail/TypeRegistry.ipp +3 -28
  46. data/rice/detail/Wrapper.hpp +0 -2
  47. data/rice/detail/Wrapper.ipp +73 -23
  48. data/rice/detail/cpp_protect.hpp +93 -0
  49. data/rice/detail/default_allocation_func.ipp +1 -1
  50. data/rice/detail/from_ruby.ipp +206 -2
  51. data/rice/detail/to_ruby.ipp +39 -5
  52. data/rice/detail/to_ruby_defn.hpp +1 -1
  53. data/rice/forward_declares.ipp +6 -0
  54. data/rice/global_function.hpp +0 -4
  55. data/rice/global_function.ipp +0 -6
  56. data/rice/rice.hpp +29 -24
  57. data/rice/stl.hpp +6 -1
  58. data/test/embed_ruby.cpp +0 -15
  59. data/test/test_Array.cpp +20 -24
  60. data/test/test_Class.cpp +8 -47
  61. data/test/test_Constructor.cpp +0 -2
  62. data/test/test_Data_Object.cpp +25 -11
  63. data/test/test_Data_Type.cpp +124 -28
  64. data/test/test_Director.cpp +12 -13
  65. data/test/test_Enum.cpp +65 -26
  66. data/test/test_Inheritance.cpp +9 -9
  67. data/test/test_Iterator.cpp +134 -5
  68. data/test/test_Keep_Alive.cpp +7 -7
  69. data/test/test_Memory_Management.cpp +1 -1
  70. data/test/test_Module.cpp +25 -62
  71. data/test/test_Object.cpp +66 -3
  72. data/test/test_Ownership.cpp +12 -13
  73. data/test/test_Self.cpp +12 -13
  74. data/test/test_Stl_Map.cpp +696 -0
  75. data/test/test_Stl_Optional.cpp +3 -3
  76. data/test/test_Stl_Pair.cpp +38 -2
  77. data/test/test_Stl_Reference_Wrapper.cpp +102 -0
  78. data/test/test_Stl_SmartPointer.cpp +5 -5
  79. data/test/test_Stl_Unordered_Map.cpp +697 -0
  80. data/test/test_Stl_Variant.cpp +301 -0
  81. data/test/test_Stl_Vector.cpp +200 -41
  82. data/test/test_Struct.cpp +3 -3
  83. data/test/test_To_From_Ruby.cpp +6 -0
  84. data/test/test_Tracking.cpp +239 -0
  85. data/test/unittest.hpp +13 -4
  86. metadata +23 -13
  87. data/rice/detail/Exception_Handler.hpp +0 -8
  88. data/rice/detail/Exception_Handler.ipp +0 -28
  89. data/rice/detail/Iterator.hpp +0 -23
  90. data/rice/detail/Iterator.ipp +0 -47
  91. data/rice/detail/function_traits.hpp +0 -124
  92. data/rice/detail/method_data.hpp +0 -29
  93. data/rice/detail/rice_traits.hpp +0 -116
  94. data/rice/ruby_try_catch.hpp +0 -86
@@ -53,7 +53,7 @@ SETUP(Optional)
53
53
  TESTCASE(OptionalReturn)
54
54
  {
55
55
  Module m = define_module("Testing");
56
- Object myClass = m.instance_eval("MyClass.new");
56
+ Object myClass = m.module_eval("MyClass.new");
57
57
 
58
58
  Object result = myClass.call("optional_return", true);
59
59
  ASSERT_EQUAL("Here is a value", detail::From_Ruby<std::string>().convert(result));
@@ -65,7 +65,7 @@ TESTCASE(OptionalReturn)
65
65
  TESTCASE(OptionalArgument)
66
66
  {
67
67
  Module m = define_module("Testing");
68
- Object myClass = m.instance_eval("MyClass.new");
68
+ Object myClass = m.module_eval("MyClass.new");
69
69
 
70
70
  Object result = myClass.call("optional_argument", 77);
71
71
  ASSERT_EQUAL(77, detail::From_Ruby<int32_t>().convert(result));
@@ -77,7 +77,7 @@ TESTCASE(OptionalArgument)
77
77
  TESTCASE(OptionalAttribute)
78
78
  {
79
79
  Module m = define_module("Testing");
80
- Object myClass = m.instance_eval("MyClass.new");
80
+ Object myClass = m.module_eval("MyClass.new");
81
81
 
82
82
  Object result = myClass.call("optional_attr");
83
83
  ASSERT_EQUAL(Qnil, result.value());
@@ -41,6 +41,32 @@ TESTCASE(CreatePair)
41
41
  ASSERT_EQUAL("A second value", detail::From_Ruby<std::string>().convert(result));
42
42
  }
43
43
 
44
+ TESTCASE(CreatePairConst)
45
+ {
46
+ Module m = define_module("Testing");
47
+
48
+ Class c = define_pair<std::pair<const std::string, const std::string>>("ConstStringPair");
49
+ Object pair = c.call("new", "pair1", "pair2");
50
+
51
+ Object result = pair.call("first");
52
+ ASSERT_EQUAL("pair1", detail::From_Ruby<std::string>().convert(result));
53
+
54
+ result = pair.call("second");
55
+ ASSERT_EQUAL("pair2", detail::From_Ruby<std::string>().convert(result));
56
+
57
+ ASSERT_EXCEPTION_CHECK(
58
+ Exception,
59
+ pair.call("first=", "A second value"),
60
+ ASSERT_EQUAL("Cannot set pair.first since it is a constant", ex.what())
61
+ );
62
+
63
+ ASSERT_EXCEPTION_CHECK(
64
+ Exception,
65
+ pair.call("second=", "A second value"),
66
+ ASSERT_EQUAL("Cannot set pair.second since it is a constant", ex.what())
67
+ );
68
+ }
69
+
44
70
  namespace
45
71
  {
46
72
  class SomeClass
@@ -63,7 +89,6 @@ namespace
63
89
 
64
90
  // This test passes everywhere except for Ruby 2.7 on Windows
65
91
  // and I don't know why. Throws a "bad any_cast" from MethodData::data
66
- #ifndef _WIN32
67
92
  TESTCASE(AutoRegister)
68
93
  {
69
94
  Module m = define_module("Testing");
@@ -98,8 +123,19 @@ TESTCASE(AutoRegister)
98
123
 
99
124
  result = newPair.call("second");
100
125
  ASSERT_EQUAL(3.2, detail::From_Ruby<double>().convert(result));
126
+
127
+ // Now register the pair again
128
+ define_pair<std::pair<std::string, double>>("SomePair");
129
+ std::string code = R"(pair = SomePair.new('string', 2.0))";
130
+ result = m.module_eval(code);
131
+ ASSERT(result.is_instance_of(pair.class_of()));
132
+
133
+ // And again in the module
134
+ define_pair_under<std::pair<std::string, double>>(m, "SomePair2");
135
+ code = R"(pair = Testing::SomePair2.new('string', 3.0))";
136
+ result = m.module_eval(code);
137
+ ASSERT(result.is_instance_of(pair.class_of()));
101
138
  }
102
- #endif
103
139
 
104
140
  namespace
105
141
  {
@@ -0,0 +1,102 @@
1
+ #include "unittest.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
4
+ #include <rice/stl.hpp>
5
+
6
+ #include <functional>
7
+
8
+ using namespace Rice;
9
+
10
+ TESTSUITE(ReferenceWrapper);
11
+
12
+ namespace
13
+ {
14
+ class MyClass
15
+ {
16
+ public:
17
+ int reference_wrapper_argument(std::reference_wrapper<int32_t> ref)
18
+ {
19
+ return ref.get();
20
+ }
21
+
22
+ std::reference_wrapper<std::string> reference_wrapper_return()
23
+ {
24
+ return reference_wrapper_;
25
+ }
26
+
27
+ std::string say_hello()
28
+ {
29
+ return "My ref wrapper class";
30
+ }
31
+
32
+ std::string string_ = "A ref wrapped string";
33
+ std::reference_wrapper<std::string> reference_wrapper_ = std::ref(string_);
34
+ };
35
+
36
+ std::reference_wrapper<MyClass> roundtrip_class(std::reference_wrapper<MyClass> instance)
37
+ {
38
+ return instance;
39
+ }
40
+
41
+ std::variant<std::reference_wrapper<MyClass>> roundtrip_class_in_variant(std::variant<std::reference_wrapper<MyClass>> instance)
42
+ {
43
+ return instance;
44
+ }
45
+ }
46
+
47
+ void makeReferenceWrapperClass()
48
+ {
49
+ define_class<MyClass>("MyClass").
50
+ define_constructor(Constructor<MyClass>()).
51
+ define_method("reference_wrapper_argument", &MyClass::reference_wrapper_argument).
52
+ define_method("reference_wrapper_return", &MyClass::reference_wrapper_return);
53
+
54
+ define_global_function("roundtrip_class", &roundtrip_class);
55
+ define_global_function("roundtrip_class_in_variant", &roundtrip_class_in_variant);
56
+ }
57
+
58
+ SETUP(ReferenceWrapper)
59
+ {
60
+ embed_ruby();
61
+ makeReferenceWrapperClass();
62
+ }
63
+
64
+ TESTCASE(Return)
65
+ {
66
+ Module m = define_module("Testing");
67
+ Object myClass = m.module_eval("MyClass.new");
68
+
69
+ Object result = myClass.call("reference_wrapper_return");
70
+ ASSERT_EQUAL("A ref wrapped string", detail::From_Ruby<std::string>().convert(result));
71
+ }
72
+
73
+ TESTCASE(Argument)
74
+ {
75
+ Module m = define_module("Testing");
76
+ Object myClass = m.module_eval("MyClass.new");
77
+
78
+ Object result = myClass.call("reference_wrapper_argument", 77);
79
+ ASSERT_EQUAL(77, detail::From_Ruby<int32_t>().convert(result));
80
+ }
81
+
82
+ TESTCASE(RoundTrip)
83
+ {
84
+ Module m = define_module("Testing");
85
+ Object myClass = m.module_eval("MyClass.new");
86
+
87
+ Object result = myClass.call("roundtrip_class", myClass);
88
+ Data_Object<MyClass> finish(result);
89
+
90
+ ASSERT_EQUAL(Data_Object<MyClass>::from_ruby(myClass), Data_Object<MyClass>::from_ruby(result));
91
+ }
92
+
93
+ TESTCASE(RoundTripInVariant)
94
+ {
95
+ Module m = define_module("Testing");
96
+ Object myClass = m.module_eval("MyClass.new");
97
+
98
+ Object result = myClass.call("roundtrip_class_in_variant", myClass);
99
+ Data_Object<MyClass> finish(result);
100
+
101
+ ASSERT_EQUAL(Data_Object<MyClass>::from_ruby(myClass), Data_Object<MyClass>::from_ruby(result));
102
+ }
@@ -124,7 +124,7 @@ TESTCASE(TransferOwnership)
124
124
  my_class = nil
125
125
  end)";
126
126
 
127
- m.instance_eval(code);
127
+ m.module_eval(code);
128
128
  rb_gc_start();
129
129
 
130
130
  ASSERT_EQUAL(10, MyClass::constructorCalls);
@@ -147,7 +147,7 @@ TESTCASE(ShareOwnership)
147
147
  my_class.set_flag(i)
148
148
  end)";
149
149
 
150
- m.instance_eval(code);
150
+ m.module_eval(code);
151
151
  rb_gc_start();
152
152
 
153
153
  ASSERT_EQUAL(1, MyClass::constructorCalls);
@@ -168,7 +168,7 @@ TESTCASE(UniquePtrRefParameter)
168
168
  my_class.set_flag(7)
169
169
  extract_flag_unique_ptr_ref(my_class))";
170
170
 
171
- Object result = m.instance_eval(code);
171
+ Object result = m.module_eval(code);
172
172
  }
173
173
 
174
174
  TESTCASE(SharedPtrParameter)
@@ -182,7 +182,7 @@ TESTCASE(SharedPtrParameter)
182
182
  my_class.set_flag(7)
183
183
  extract_flag_shared_ptr(my_class))";
184
184
 
185
- Object result = m.instance_eval(code);
185
+ Object result = m.module_eval(code);
186
186
  }
187
187
 
188
188
  TESTCASE(SharedPtrRefParameter)
@@ -196,5 +196,5 @@ TESTCASE(SharedPtrRefParameter)
196
196
  my_class.set_flag(7)
197
197
  extract_flag_shared_ptr_ref(my_class))";
198
198
 
199
- Object result = m.instance_eval(code);
199
+ Object result = m.module_eval(code);
200
200
  }