rice 4.11.4 → 4.12.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/CMakePresets.json +3 -3
  4. data/bin/rice-doc.rb +2 -0
  5. data/include/rice/rice.hpp +162 -113
  6. data/include/rice/stl.hpp +229 -69
  7. data/lib/mkmf-rice.rb +2 -2
  8. data/lib/rice/version.rb +1 -1
  9. data/rice/Constructor.ipp +3 -3
  10. data/rice/Data_Object.ipp +0 -42
  11. data/rice/JumpException.ipp +1 -0
  12. data/rice/Reference.hpp +2 -2
  13. data/rice/Reference.ipp +1 -1
  14. data/rice/cpp_api/Encoding.ipp +0 -48
  15. data/rice/cpp_api/Hash.ipp +19 -0
  16. data/rice/cpp_api/Object.hpp +2 -2
  17. data/rice/cpp_api/Object.ipp +3 -3
  18. data/rice/cpp_api/String.ipp +19 -0
  19. data/rice/detail/Anchor.hpp +1 -1
  20. data/rice/detail/Anchor.ipp +16 -10
  21. data/rice/detail/Parameter.ipp +11 -0
  22. data/rice/detail/Proc.ipp +19 -0
  23. data/rice/detail/Wrapper.ipp +3 -3
  24. data/rice/detail/from_ruby.hpp +1 -0
  25. data/rice/detail/to_ruby.ipp +58 -1
  26. data/rice/stl/function.ipp +142 -2
  27. data/rice/stl/map.ipp +2 -10
  28. data/rice/stl/multimap.ipp +2 -10
  29. data/rice/stl/optional.ipp +18 -0
  30. data/rice/stl/reference_wrapper.ipp +18 -0
  31. data/rice/stl/set.ipp +24 -25
  32. data/rice/stl/unique_ptr.ipp +3 -0
  33. data/rice/stl/unordered_map.ipp +2 -10
  34. data/rice/stl/vector.ipp +18 -15
  35. data/rice/traits/rice_traits.hpp +3 -0
  36. data/test/test_Attribute.cpp +6 -6
  37. data/test/test_Constructor.cpp +140 -1
  38. data/test/test_File.cpp +2 -3
  39. data/test/test_From_Ruby.cpp +3 -3
  40. data/test/test_Hash.cpp +8 -0
  41. data/test/test_Object.cpp +76 -0
  42. data/test/test_Overloads.cpp +74 -1
  43. data/test/test_Proc.cpp +11 -1
  44. data/test/test_Reference.cpp +20 -1
  45. data/test/test_Stl_Exception.cpp +2 -5
  46. data/test/test_Stl_Function.cpp +72 -7
  47. data/test/test_Stl_Map.cpp +10 -1
  48. data/test/test_Stl_Multimap.cpp +11 -2
  49. data/test/test_Stl_Optional.cpp +9 -0
  50. data/test/test_Stl_Reference_Wrapper.cpp +11 -0
  51. data/test/test_Stl_Set.cpp +12 -0
  52. data/test/test_Stl_Unordered_Map.cpp +10 -1
  53. data/test/test_Stl_Vector.cpp +130 -11
  54. data/test/test_String.cpp +7 -0
  55. data/test/test_To_Ruby.cpp +24 -1
  56. metadata +1 -1
@@ -31,6 +31,28 @@ namespace
31
31
  return result;
32
32
  }
33
33
  };
34
+
35
+ class VectorRValueSink
36
+ {
37
+ public:
38
+ explicit VectorRValueSink(std::vector<int>&& values)
39
+ : values_(std::move(values))
40
+ {
41
+ }
42
+
43
+ void setValues(std::vector<int>&& values)
44
+ {
45
+ values_ = std::move(values);
46
+ }
47
+
48
+ size_t size() const
49
+ {
50
+ return values_.size();
51
+ }
52
+
53
+ private:
54
+ std::vector<int> values_;
55
+ };
34
56
  }
35
57
 
36
58
  Class makeVectorClass()
@@ -83,6 +105,36 @@ TESTCASE(StringVectorData)
83
105
  ASSERT_EQUAL("World", detail::From_Ruby<std::string>().convert(array[1].value()).c_str());
84
106
  }
85
107
 
108
+ TESTCASE(VectorRvalueParameters)
109
+ {
110
+ Module m(anonymous_module());
111
+ define_vector<int>("IntVector");
112
+
113
+ define_class_under<VectorRValueSink>(m, "VectorRValueSink")
114
+ .define_constructor(Constructor<VectorRValueSink, std::vector<int>&&>(), Arg("values"))
115
+ .define_method("set_values", &VectorRValueSink::setValues, Arg("values"))
116
+ .define_method("size", &VectorRValueSink::size);
117
+
118
+ Object result = m.module_eval(R"(
119
+ sink = VectorRValueSink.new(Std::IntVector.new([1, 2, 3]))
120
+ sink.set_values(Std::IntVector.new([4, 5]))
121
+ sink.size
122
+ )");
123
+
124
+ ASSERT_EQUAL(2, detail::From_Ruby<int32_t>().convert(result));
125
+ }
126
+
127
+ TESTCASE(VectorBoolReferenceLvalueToRuby)
128
+ {
129
+ std::vector<bool> values{ true };
130
+ auto reference = values[0];
131
+ const auto& ref = reference;
132
+ using To_Ruby_T = detail::remove_cv_recursive_t<decltype((ref))>;
133
+
134
+ VALUE result = detail::To_Ruby<To_Ruby_T>().convert(ref);
135
+ ASSERT_EQUAL(Qtrue, result);
136
+ }
137
+
86
138
  TESTCASE(Constructors)
87
139
  {
88
140
  Module m = define_module("Testing");
@@ -504,17 +556,23 @@ TESTCASE(NotComparable)
504
556
  vec.call("push", NotComparable(2));
505
557
  vec.call("push", NotComparable(3));
506
558
 
507
- Object result = vec.call("delete", NotComparable(1));
508
- ASSERT(result.is_nil());
559
+ Object result = vec.instance_eval("respond_to?(:delete)");
560
+ ASSERT_EQUAL(Qfalse, result.value());
509
561
 
510
562
  result = vec.call("length");
511
563
  ASSERT_EQUAL(3u, detail::From_Ruby<size_t>().convert(result));
512
564
 
513
- result = vec.call("include?", NotComparable(2));
565
+ result = vec.instance_eval("method(:include?).owner == self.class");
514
566
  ASSERT_EQUAL(Qfalse, result.value());
515
567
 
516
- result = vec.call("index", NotComparable(3));
517
- ASSERT(result.is_nil());
568
+ result = vec.instance_eval("respond_to?(:index)");
569
+ ASSERT_EQUAL(Qfalse, result.value());
570
+
571
+ result = vec.instance_eval("method(:==).owner == self.class");
572
+ ASSERT_EQUAL(Qfalse, result.value());
573
+
574
+ result = vec.instance_eval("method(:eql?).owner == self.class");
575
+ ASSERT_EQUAL(Qfalse, result.value());
518
576
  }
519
577
 
520
578
  TESTCASE(NotDefaultConstructable)
@@ -665,17 +723,78 @@ TESTCASE(ComparableButNotBool)
665
723
  vec.call("push", ComparableButNotBool(2));
666
724
  vec.call("push", ComparableButNotBool(3));
667
725
 
668
- Object result = vec.call("delete", ComparableButNotBool(1));
669
- ASSERT(result.is_nil());
726
+ Object result = vec.instance_eval("respond_to?(:delete)");
727
+ ASSERT_EQUAL(Qfalse, result.value());
670
728
 
671
729
  result = vec.call("length");
672
730
  ASSERT_EQUAL(3u, detail::From_Ruby<size_t>().convert(result));
673
731
 
674
- result = vec.call("include?", ComparableButNotBool(2));
732
+ result = vec.instance_eval("method(:include?).owner == self.class");
675
733
  ASSERT_EQUAL(Qfalse, result.value());
676
734
 
677
- result = vec.call("index", ComparableButNotBool(3));
678
- ASSERT(result.is_nil());
735
+ result = vec.instance_eval("respond_to?(:index)");
736
+ ASSERT_EQUAL(Qfalse, result.value());
737
+
738
+ result = vec.instance_eval("method(:==).owner == self.class");
739
+ ASSERT_EQUAL(Qfalse, result.value());
740
+
741
+ result = vec.instance_eval("method(:eql?).owner == self.class");
742
+ ASSERT_EQUAL(Qfalse, result.value());
743
+ }
744
+
745
+ namespace
746
+ {
747
+ class ComparableButNotComparable
748
+ {
749
+ public:
750
+ ComparableButNotComparable(uint32_t value) : value_(value)
751
+ {
752
+ };
753
+
754
+ bool operator==(const ComparableButNotComparable& other) const
755
+ {
756
+ return this->value_ == other.value_;
757
+ }
758
+
759
+ uint32_t value_;
760
+ };
761
+ }
762
+
763
+ namespace Rice::detail
764
+ {
765
+ template<>
766
+ struct is_comparable<ComparableButNotComparable> : std::false_type {};
767
+ }
768
+
769
+ TESTCASE(ComparableButNotComparable)
770
+ {
771
+ define_class<ComparableButNotComparable>("ComparableButNotComparable").
772
+ define_constructor(Constructor<ComparableButNotComparable, uint32_t>());
773
+
774
+ Class c = define_vector<ComparableButNotComparable>("ComparableButNotComparableVector");
775
+
776
+ Object vec = c.call("new");
777
+ vec.call("push", ComparableButNotComparable(1));
778
+ vec.call("push", ComparableButNotComparable(2));
779
+ vec.call("push", ComparableButNotComparable(3));
780
+
781
+ Object result = vec.instance_eval("respond_to?(:delete)");
782
+ ASSERT_EQUAL(Qfalse, result.value());
783
+
784
+ result = vec.call("length");
785
+ ASSERT_EQUAL(3u, detail::From_Ruby<size_t>().convert(result));
786
+
787
+ result = vec.instance_eval("method(:include?).owner == self.class");
788
+ ASSERT_EQUAL(Qfalse, result.value());
789
+
790
+ result = vec.instance_eval("respond_to?(:index)");
791
+ ASSERT_EQUAL(Qfalse, result.value());
792
+
793
+ result = vec.instance_eval("method(:==).owner == self.class");
794
+ ASSERT_EQUAL(Qfalse, result.value());
795
+
796
+ result = vec.instance_eval("method(:eql?).owner == self.class");
797
+ ASSERT_EQUAL(Qfalse, result.value());
679
798
  }
680
799
 
681
800
  TESTCASE(DefaultConstructable)
@@ -1483,4 +1602,4 @@ TESTCASE(VectorOverloadResolution)
1483
1602
 
1484
1603
  result = m.module_eval(code);
1485
1604
  ASSERT_EQUAL("ClassB", detail::From_Ruby<std::string>().convert(result));
1486
- }
1605
+ }
data/test/test_String.cpp CHANGED
@@ -127,3 +127,10 @@ TESTCASE(use_string_in_wrapped_function)
127
127
  {
128
128
  define_global_function("test_string_arg", &testStringArg);
129
129
  }
130
+
131
+ TESTCASE(string_lvalue_to_ruby)
132
+ {
133
+ String value("foo");
134
+
135
+ ASSERT_EQUAL(value.value(), detail::to_ruby(value));
136
+ }
@@ -26,6 +26,14 @@ TESTCASE(object_to_ruby)
26
26
  ASSERT_EQUAL(o.value(), detail::to_ruby(o));
27
27
  }
28
28
 
29
+ TESTCASE(nullptr_lvalue_to_ruby)
30
+ {
31
+ const std::nullptr_t& value = nullptr;
32
+ using To_Ruby_T = detail::remove_cv_recursive_t<decltype((value))>;
33
+
34
+ ASSERT_EQUAL(Qnil, detail::To_Ruby<To_Ruby_T>().convert(value));
35
+ }
36
+
29
37
  TESTCASE(short_to_ruby)
30
38
  {
31
39
  #undef min
@@ -141,6 +149,14 @@ TESTCASE(char_ptr_to_ruby)
141
149
  ASSERT(rb_equal(Qnil, toRuby.convert(nullptr)));
142
150
  }
143
151
 
152
+ TESTCASE(char_ptr_lvalue_to_ruby)
153
+ {
154
+ char text[] = "foo";
155
+ char* value = text;
156
+
157
+ ASSERT(rb_equal(String("foo").value(), detail::to_ruby(value)));
158
+ }
159
+
144
160
  TESTCASE(char_const_ptr_to_ruby)
145
161
  {
146
162
  ASSERT(rb_equal(String("").value(), detail::to_ruby((char const *)"")));
@@ -148,6 +164,13 @@ TESTCASE(char_const_ptr_to_ruby)
148
164
  ASSERT(rb_equal(String("foo").value(), detail::to_ruby("foo")));
149
165
  }
150
166
 
167
+ TESTCASE(char_array_lvalue_to_ruby)
168
+ {
169
+ char value[] = "foo";
170
+
171
+ ASSERT(rb_equal(String("foo").value(), detail::to_ruby(value)));
172
+ }
173
+
151
174
  TESTCASE(char_const_array_to_ruby_symbol)
152
175
  {
153
176
  ASSERT(rb_equal(Symbol("foo").value(), detail::to_ruby(":foo")));
@@ -529,4 +552,4 @@ TESTCASE(double_ptr_array)
529
552
  actual = array.to_vector<double>();
530
553
  ASSERT_EQUAL(expected, actual);
531
554
  }
532
- */
555
+ */
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.11.4
4
+ version: 4.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Brannan