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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/CMakePresets.json +3 -3
- data/bin/rice-doc.rb +2 -0
- data/include/rice/rice.hpp +162 -113
- data/include/rice/stl.hpp +229 -69
- data/lib/mkmf-rice.rb +2 -2
- data/lib/rice/version.rb +1 -1
- data/rice/Constructor.ipp +3 -3
- data/rice/Data_Object.ipp +0 -42
- data/rice/JumpException.ipp +1 -0
- data/rice/Reference.hpp +2 -2
- data/rice/Reference.ipp +1 -1
- data/rice/cpp_api/Encoding.ipp +0 -48
- data/rice/cpp_api/Hash.ipp +19 -0
- data/rice/cpp_api/Object.hpp +2 -2
- data/rice/cpp_api/Object.ipp +3 -3
- data/rice/cpp_api/String.ipp +19 -0
- data/rice/detail/Anchor.hpp +1 -1
- data/rice/detail/Anchor.ipp +16 -10
- data/rice/detail/Parameter.ipp +11 -0
- data/rice/detail/Proc.ipp +19 -0
- data/rice/detail/Wrapper.ipp +3 -3
- data/rice/detail/from_ruby.hpp +1 -0
- data/rice/detail/to_ruby.ipp +58 -1
- data/rice/stl/function.ipp +142 -2
- data/rice/stl/map.ipp +2 -10
- data/rice/stl/multimap.ipp +2 -10
- data/rice/stl/optional.ipp +18 -0
- data/rice/stl/reference_wrapper.ipp +18 -0
- data/rice/stl/set.ipp +24 -25
- data/rice/stl/unique_ptr.ipp +3 -0
- data/rice/stl/unordered_map.ipp +2 -10
- data/rice/stl/vector.ipp +18 -15
- data/rice/traits/rice_traits.hpp +3 -0
- data/test/test_Attribute.cpp +6 -6
- data/test/test_Constructor.cpp +140 -1
- data/test/test_File.cpp +2 -3
- data/test/test_From_Ruby.cpp +3 -3
- data/test/test_Hash.cpp +8 -0
- data/test/test_Object.cpp +76 -0
- data/test/test_Overloads.cpp +74 -1
- data/test/test_Proc.cpp +11 -1
- data/test/test_Reference.cpp +20 -1
- data/test/test_Stl_Exception.cpp +2 -5
- data/test/test_Stl_Function.cpp +72 -7
- data/test/test_Stl_Map.cpp +10 -1
- data/test/test_Stl_Multimap.cpp +11 -2
- data/test/test_Stl_Optional.cpp +9 -0
- data/test/test_Stl_Reference_Wrapper.cpp +11 -0
- data/test/test_Stl_Set.cpp +12 -0
- data/test/test_Stl_Unordered_Map.cpp +10 -1
- data/test/test_Stl_Vector.cpp +130 -11
- data/test/test_String.cpp +7 -0
- data/test/test_To_Ruby.cpp +24 -1
- metadata +1 -1
data/test/test_Stl_Vector.cpp
CHANGED
|
@@ -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.
|
|
508
|
-
|
|
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.
|
|
565
|
+
result = vec.instance_eval("method(:include?).owner == self.class");
|
|
514
566
|
ASSERT_EQUAL(Qfalse, result.value());
|
|
515
567
|
|
|
516
|
-
result = vec.
|
|
517
|
-
|
|
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.
|
|
669
|
-
|
|
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.
|
|
732
|
+
result = vec.instance_eval("method(:include?).owner == self.class");
|
|
675
733
|
ASSERT_EQUAL(Qfalse, result.value());
|
|
676
734
|
|
|
677
|
-
result = vec.
|
|
678
|
-
|
|
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
|
+
}
|
data/test/test_To_Ruby.cpp
CHANGED
|
@@ -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
|
+
*/
|