rice 4.5.0 → 4.6.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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/CMakeLists.txt +31 -0
  4. data/CMakePresets.json +75 -0
  5. data/COPYING +3 -2
  6. data/FindRuby.cmake +437 -0
  7. data/Rakefile +5 -4
  8. data/include/rice/rice.hpp +5436 -3201
  9. data/include/rice/stl.hpp +2355 -1269
  10. data/lib/make_rice_headers.rb +79 -0
  11. data/lib/mkmf-rice.rb +4 -0
  12. data/lib/rice/version.rb +3 -0
  13. data/lib/rice.rb +1 -0
  14. data/lib/rubygems/builder.rb +11 -0
  15. data/lib/rubygems/cmake_builder.rb +113 -0
  16. data/lib/rubygems_plugin.rb +9 -0
  17. data/rice/Arg.hpp +7 -1
  18. data/rice/Arg.ipp +11 -2
  19. data/rice/Buffer.hpp +123 -0
  20. data/rice/Buffer.ipp +599 -0
  21. data/rice/Constructor.ipp +3 -3
  22. data/rice/Data_Object.hpp +2 -3
  23. data/rice/Data_Object.ipp +188 -188
  24. data/rice/Data_Type.hpp +4 -5
  25. data/rice/Data_Type.ipp +42 -26
  26. data/rice/Enum.hpp +0 -1
  27. data/rice/Enum.ipp +26 -23
  28. data/rice/Init.hpp +8 -0
  29. data/rice/Init.ipp +8 -0
  30. data/rice/MemoryView.ipp +1 -41
  31. data/rice/Return.hpp +1 -1
  32. data/rice/Return.ipp +6 -0
  33. data/rice/cpp_api/Array.hpp +209 -0
  34. data/rice/cpp_api/Array.ipp +304 -0
  35. data/rice/cpp_api/Builtin_Object.hpp +31 -0
  36. data/rice/cpp_api/Builtin_Object.ipp +37 -0
  37. data/rice/cpp_api/Class.hpp +70 -0
  38. data/rice/cpp_api/Class.ipp +97 -0
  39. data/rice/cpp_api/Encoding.hpp +32 -0
  40. data/rice/cpp_api/Encoding.ipp +59 -0
  41. data/rice/cpp_api/Hash.hpp +194 -0
  42. data/rice/cpp_api/Hash.ipp +257 -0
  43. data/rice/cpp_api/Identifier.hpp +46 -0
  44. data/rice/cpp_api/Identifier.ipp +31 -0
  45. data/rice/cpp_api/Module.hpp +72 -0
  46. data/rice/cpp_api/Module.ipp +101 -0
  47. data/rice/cpp_api/Object.hpp +272 -0
  48. data/rice/cpp_api/Object.ipp +235 -0
  49. data/rice/cpp_api/String.hpp +74 -0
  50. data/rice/cpp_api/String.ipp +120 -0
  51. data/rice/cpp_api/Struct.hpp +113 -0
  52. data/rice/cpp_api/Struct.ipp +92 -0
  53. data/rice/cpp_api/Symbol.hpp +46 -0
  54. data/rice/cpp_api/Symbol.ipp +93 -0
  55. data/rice/cpp_api/shared_methods.hpp +134 -0
  56. data/rice/detail/MethodInfo.hpp +1 -9
  57. data/rice/detail/MethodInfo.ipp +5 -72
  58. data/rice/detail/Native.hpp +3 -2
  59. data/rice/detail/Native.ipp +32 -4
  60. data/rice/detail/NativeAttributeGet.hpp +3 -2
  61. data/rice/detail/NativeAttributeGet.ipp +8 -2
  62. data/rice/detail/NativeAttributeSet.hpp +3 -2
  63. data/rice/detail/NativeAttributeSet.ipp +8 -2
  64. data/rice/detail/NativeCallbackFFI.ipp +1 -1
  65. data/rice/detail/NativeFunction.hpp +17 -6
  66. data/rice/detail/NativeFunction.ipp +168 -64
  67. data/rice/detail/NativeIterator.hpp +3 -2
  68. data/rice/detail/NativeIterator.ipp +8 -2
  69. data/rice/detail/RubyType.hpp +2 -5
  70. data/rice/detail/RubyType.ipp +50 -5
  71. data/rice/detail/Type.hpp +3 -1
  72. data/rice/detail/Type.ipp +61 -31
  73. data/rice/detail/Wrapper.hpp +68 -33
  74. data/rice/detail/Wrapper.ipp +103 -113
  75. data/rice/detail/from_ruby.hpp +5 -4
  76. data/rice/detail/from_ruby.ipp +737 -365
  77. data/rice/detail/to_ruby.ipp +1092 -186
  78. data/rice/global_function.ipp +1 -1
  79. data/rice/libc/file.hpp +11 -0
  80. data/rice/libc/file.ipp +32 -0
  81. data/rice/rice.hpp +23 -16
  82. data/rice/stl/complex.hpp +6 -0
  83. data/rice/stl/complex.ipp +93 -0
  84. data/rice/stl/exception.hpp +11 -0
  85. data/rice/stl/exception.ipp +29 -0
  86. data/rice/stl/exception_ptr.hpp +6 -0
  87. data/rice/stl/exception_ptr.ipp +27 -0
  88. data/rice/stl/map.hpp +12 -0
  89. data/rice/stl/map.ipp +469 -0
  90. data/rice/stl/monostate.hpp +6 -0
  91. data/rice/stl/monostate.ipp +80 -0
  92. data/rice/stl/multimap.hpp +14 -0
  93. data/rice/stl/multimap.ipp +448 -0
  94. data/rice/stl/optional.hpp +6 -0
  95. data/rice/stl/optional.ipp +118 -0
  96. data/rice/stl/pair.hpp +13 -0
  97. data/rice/stl/pair.ipp +155 -0
  98. data/rice/stl/reference_wrapper.hpp +6 -0
  99. data/rice/stl/reference_wrapper.ipp +41 -0
  100. data/rice/stl/set.hpp +12 -0
  101. data/rice/stl/set.ipp +495 -0
  102. data/rice/stl/shared_ptr.hpp +28 -0
  103. data/rice/stl/shared_ptr.ipp +224 -0
  104. data/rice/stl/string.hpp +6 -0
  105. data/rice/stl/string.ipp +158 -0
  106. data/rice/stl/string_view.hpp +6 -0
  107. data/rice/stl/string_view.ipp +65 -0
  108. data/rice/stl/tuple.hpp +6 -0
  109. data/rice/stl/tuple.ipp +128 -0
  110. data/rice/stl/type_index.hpp +6 -0
  111. data/rice/stl/type_index.ipp +30 -0
  112. data/rice/stl/type_info.hpp +6 -0
  113. data/rice/stl/type_info.ipp +29 -0
  114. data/rice/stl/unique_ptr.hpp +22 -0
  115. data/rice/stl/unique_ptr.ipp +139 -0
  116. data/rice/stl/unordered_map.hpp +12 -0
  117. data/rice/stl/unordered_map.ipp +469 -0
  118. data/rice/stl/variant.hpp +6 -0
  119. data/rice/stl/variant.ipp +242 -0
  120. data/rice/stl/vector.hpp +12 -0
  121. data/rice/stl/vector.ipp +590 -0
  122. data/rice/stl.hpp +7 -3
  123. data/rice/traits/attribute_traits.hpp +26 -0
  124. data/rice/traits/function_traits.hpp +95 -0
  125. data/rice/traits/method_traits.hpp +47 -0
  126. data/rice/traits/rice_traits.hpp +160 -0
  127. data/rice.gemspec +85 -0
  128. data/test/embed_ruby.cpp +3 -0
  129. data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
  130. data/test/test_Array.cpp +6 -3
  131. data/test/test_Attribute.cpp +34 -1
  132. data/test/test_Buffer.cpp +285 -0
  133. data/test/test_Callback.cpp +2 -3
  134. data/test/test_Data_Object.cpp +88 -34
  135. data/test/test_Data_Type.cpp +106 -65
  136. data/test/test_Director.cpp +7 -3
  137. data/test/test_Enum.cpp +5 -2
  138. data/test/test_File.cpp +1 -1
  139. data/test/test_From_Ruby.cpp +181 -114
  140. data/test/test_Iterator.cpp +1 -1
  141. data/test/{test_JumpException.cpp → test_Jump_Exception.cpp} +1 -0
  142. data/test/test_Keep_Alive.cpp +7 -18
  143. data/test/test_Keep_Alive_No_Wrapper.cpp +0 -1
  144. data/test/test_Module.cpp +13 -6
  145. data/test/test_Native_Registry.cpp +0 -1
  146. data/test/test_Overloads.cpp +180 -5
  147. data/test/test_Ownership.cpp +100 -57
  148. data/test/test_Proc.cpp +0 -1
  149. data/test/test_Self.cpp +4 -4
  150. data/test/test_Stl_Map.cpp +37 -39
  151. data/test/test_Stl_Multimap.cpp +693 -0
  152. data/test/test_Stl_Pair.cpp +8 -8
  153. data/test/test_Stl_Reference_Wrapper.cpp +4 -2
  154. data/test/test_Stl_Set.cpp +790 -0
  155. data/test/{test_Stl_SmartPointer.cpp → test_Stl_SharedPtr.cpp} +97 -127
  156. data/test/test_Stl_Tuple.cpp +116 -0
  157. data/test/test_Stl_Type.cpp +1 -1
  158. data/test/test_Stl_UniquePtr.cpp +202 -0
  159. data/test/test_Stl_Unordered_Map.cpp +28 -34
  160. data/test/test_Stl_Variant.cpp +217 -89
  161. data/test/test_Stl_Vector.cpp +209 -83
  162. data/test/test_To_Ruby.cpp +373 -1
  163. data/test/test_Type.cpp +85 -14
  164. data/test/test_global_functions.cpp +17 -4
  165. metadata +94 -10
  166. data/rice/detail/TupleIterator.hpp +0 -14
@@ -0,0 +1,95 @@
1
+ #ifndef Rice__detail__function_traits__hpp_
2
+ #define Rice__detail__function_traits__hpp_
3
+
4
+ #include <tuple>
5
+
6
+ namespace Rice::detail
7
+ {
8
+ // Base class
9
+ template<typename Function_T>
10
+ struct function_traits;
11
+
12
+ template<typename Return_T, typename Class_T, typename...Arg_Ts>
13
+ struct function_traits<Return_T(Class_T, Arg_Ts...)>
14
+ {
15
+ using arg_types = std::tuple<Arg_Ts...>;
16
+
17
+ static constexpr std::size_t arity = sizeof...(Arg_Ts);
18
+
19
+ template<std::size_t N>
20
+ using nth_arg = typename std::tuple_element<N, arg_types>::type;
21
+
22
+ using return_type = Return_T;
23
+ using class_type = Class_T;
24
+ };
25
+
26
+ // Functors and lambdas with operator()
27
+ template<typename Function_T>
28
+ struct function_traits : public function_traits<decltype(&Function_T::operator())>
29
+ {
30
+ private:
31
+ using functor_t = function_traits<decltype(&Function_T::operator())>;
32
+
33
+ public:
34
+ using arg_types = typename functor_t::arg_types;
35
+ static constexpr std::size_t arity = functor_t::arity - 1;
36
+ using class_type = std::nullptr_t;
37
+ };
38
+
39
+ // C functions and static member functions passed by pointer
40
+ template<typename Return_T, typename ...Arg_Ts>
41
+ struct function_traits<Return_T(*)(Arg_Ts...)> : public function_traits<Return_T(std::nullptr_t, Arg_Ts...)>
42
+ {
43
+ using Function_T = Return_T(*)(Arg_Ts...);
44
+ };
45
+
46
+ // C functions passed by pointer that take one or more defined parameter than a variable
47
+ // number of parameters (the second ...)
48
+ template<typename Return_T, typename ...Arg_Ts>
49
+ struct function_traits<Return_T(*)(Arg_Ts..., ...)> : public function_traits<Return_T(std::nullptr_t, Arg_Ts...)>
50
+ {
51
+ };
52
+
53
+ // C Functions or static member functions passed by reference
54
+ template<typename Return_T, typename ...Arg_Ts>
55
+ struct function_traits<Return_T(&)(Arg_Ts...)> : public function_traits<Return_T(std::nullptr_t, Arg_Ts...)>
56
+ {
57
+ };
58
+
59
+ // Member Functions on C++ classes
60
+ template<typename Return_T, typename Class_T, typename...Arg_Ts>
61
+ struct function_traits<Return_T(Class_T::*)(Arg_Ts...)> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
62
+ {
63
+ };
64
+
65
+ // const member Functions on C++ classes
66
+ template<typename Return_T, typename Class_T, typename...Arg_Ts>
67
+ struct function_traits<Return_T(Class_T::*)(Arg_Ts...) const> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
68
+ {
69
+ };
70
+
71
+ // noexcept member Functions on C++ classes
72
+ template<typename Return_T, typename Class_T, typename...Arg_Ts>
73
+ struct function_traits<Return_T(Class_T::*)(Arg_Ts...) noexcept> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
74
+ {
75
+ };
76
+
77
+
78
+ // const noexcept member Functions on C++ classes
79
+ template<typename Return_T, typename Class_T, typename...Arg_Ts>
80
+ struct function_traits<Return_T(Class_T::*)(Arg_Ts...) const noexcept> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
81
+ {
82
+ };
83
+
84
+ /*// Functors and lambdas
85
+ template<class Function_T>
86
+ struct function_traits<Function_T&> : public function_traits<Function_T>
87
+ {
88
+ };
89
+
90
+ template<class Function_T>
91
+ struct function_traits<Function_T&&> : public function_traits<Function_T>
92
+ {
93
+ };*/
94
+ }
95
+ #endif // Rice__detail__function_traits__hpp_
@@ -0,0 +1,47 @@
1
+ #ifndef Rice__detail__method_traits__hpp_
2
+ #define Rice__detail__method_traits__hpp_
3
+
4
+ #include <tuple>
5
+
6
+ namespace Rice::detail
7
+ {
8
+ // Declare struct
9
+ template<typename Function_T, bool IsMethod, typename = void>
10
+ struct method_traits;
11
+
12
+ // Functions that do not have a self parameter:
13
+ // doSomething(int a)
14
+ template<typename Function_T, bool IsMethod>
15
+ struct method_traits<Function_T, IsMethod, std::enable_if_t<!IsMethod>>
16
+ {
17
+ using Return_T = typename function_traits<Function_T>::return_type;
18
+ using Class_T = std::nullptr_t;
19
+ using Arg_Ts = typename function_traits<Function_T>::arg_types;
20
+ static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
21
+ };
22
+
23
+ /* Functions that have a self parameter and thus we treat them as free standing
24
+ "methods" versus member functions.
25
+
26
+ doSomething(VALUE self, int a) */
27
+ template<typename Function_T, bool IsMethod>
28
+ struct method_traits<Function_T, IsMethod, std::enable_if_t<IsMethod && std::is_same_v<typename function_traits<Function_T>::class_type, std::nullptr_t>>>
29
+ {
30
+ using Return_T = typename function_traits<Function_T>::return_type;
31
+ using Class_T = typename function_traits<Function_T>::template nth_arg<0>;
32
+ using Arg_Ts = typename tuple_shift<typename function_traits<Function_T>::arg_types>::type;
33
+ static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
34
+ };
35
+
36
+ // Member functions that have an implied self parameter of an object instance
37
+ // foo.doSomething(int a)
38
+ template<typename Function_T, bool IsMethod>
39
+ struct method_traits<Function_T, IsMethod, std::enable_if_t<IsMethod && !std::is_same_v<typename function_traits<Function_T>::class_type, std::nullptr_t>>>
40
+ {
41
+ using Return_T = typename function_traits<Function_T>::return_type;
42
+ using Class_T = typename function_traits<Function_T>::class_type;
43
+ using Arg_Ts = typename function_traits<Function_T>::arg_types;
44
+ static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
45
+ };
46
+ }
47
+ #endif // Rice__detail__method_traits__hpp_
@@ -0,0 +1,160 @@
1
+ #ifndef Rice__detail__traits__hpp_
2
+ #define Rice__detail__traits__hpp_
3
+
4
+ #include <ostream>
5
+ #include <type_traits>
6
+ #include <variant>
7
+ #include <vector>
8
+
9
+ namespace Rice
10
+ {
11
+ namespace detail
12
+ {
13
+ // Get the base_type of T - without pointer, reference, const or volatile. We call remove_pointer_t twice
14
+ // for T**
15
+ template<typename T>
16
+ using intrinsic_type = typename std::remove_cv_t<std::remove_pointer_t<std::remove_pointer_t<std::remove_reference_t<T>>>>;
17
+
18
+ template<typename T>
19
+ constexpr bool is_const_any_v = std::is_const_v<std::remove_pointer_t<std::remove_pointer_t<std::remove_reference_t<T>>>>;
20
+
21
+ // Recursively remove const/volatile
22
+ template<typename T>
23
+ struct remove_cv_recursive
24
+ {
25
+ using type = T;
26
+ };
27
+
28
+ template<typename T>
29
+ struct remove_cv_recursive<T const volatile>
30
+ {
31
+ using type = typename remove_cv_recursive<T>::type;
32
+ };
33
+
34
+ template<typename T>
35
+ struct remove_cv_recursive<T volatile>
36
+ {
37
+ using type = typename remove_cv_recursive<T>::type;
38
+ };
39
+
40
+ template<typename T>
41
+ struct remove_cv_recursive<T const>
42
+ {
43
+ using type = typename remove_cv_recursive<T>::type;
44
+ };
45
+
46
+ template<typename T>
47
+ struct remove_cv_recursive<T&>
48
+ {
49
+ using type = typename remove_cv_recursive<T>::type&;
50
+ };
51
+
52
+ /* template<typename T>
53
+ struct remove_cv_recursive<T&&>
54
+ {
55
+ using type = typename remove_cv_recursive<T>::type&&;
56
+ };*/
57
+
58
+ template<typename T>
59
+ struct remove_cv_recursive<T*>
60
+ {
61
+ using type = typename remove_cv_recursive<T>::type*;
62
+ };
63
+
64
+ template<typename T>
65
+ using remove_cv_recursive_t = typename remove_cv_recursive<T>::type;
66
+
67
+ // Does the Type work with ostreams? This is used to implement #to_s
68
+ template<typename T, typename = void>
69
+ struct is_ostreamable : std::false_type {};
70
+
71
+ template<typename T>
72
+ struct is_ostreamable<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<const T>())>> : std::true_type {};
73
+
74
+ template<typename T>
75
+ constexpr bool is_ostreamable_v = is_ostreamable<T>::value;
76
+
77
+ // Is the type comparable?
78
+ template<typename T, typename SFINAE = void>
79
+ struct is_comparable : std::false_type {};
80
+
81
+ template<typename T>
82
+ struct is_comparable<T, std::void_t<
83
+ // Does the class implement operator== and does it return a boolean value?
84
+ decltype(std::declval<T>() == std::declval<T>() && true)
85
+ >> : std::true_type {};
86
+
87
+ template<typename T>
88
+ constexpr bool is_comparable_v = is_comparable<T>::value;
89
+
90
+ template <typename U, typename V>
91
+ struct is_comparable<std::pair<U, V>>
92
+ {
93
+ static const bool value = is_comparable_v<U> && is_comparable_v<V>;
94
+ };
95
+
96
+ template <typename T>
97
+ struct is_comparable<std::vector<T>>
98
+ {
99
+ static const bool value = is_comparable_v<T>;
100
+ };
101
+
102
+ // -- Tuple Helpers ---
103
+ template<typename T>
104
+ struct tuple_shift;
105
+
106
+ template<typename T, typename...Arg_Ts>
107
+ struct tuple_shift<std::tuple<T, Arg_Ts...>>
108
+ {
109
+ using type = std::tuple<Arg_Ts...>;
110
+ };
111
+
112
+ template<template<typename, typename...> typename T, typename...Arg_Ts>
113
+ struct tuple_map;
114
+
115
+ template<template<typename, typename...> typename T, typename...Arg_Ts>
116
+ struct tuple_map<T, std::tuple<Arg_Ts...>>
117
+ {
118
+ using type = std::tuple<T<remove_cv_recursive_t<Arg_Ts>>...>;
119
+ };
120
+
121
+ template<typename...Arg_Ts>
122
+ struct tuple_to_variant;
123
+
124
+ template<typename...Arg_Ts>
125
+ struct tuple_to_variant<std::tuple<Arg_Ts...>>
126
+ {
127
+ using type = std::variant<Arg_Ts...>;
128
+ };
129
+
130
+ template<class T>
131
+ struct is_pointer_pointer : std::false_type {};
132
+
133
+ template<class T>
134
+ struct is_pointer_pointer<T**> : std::true_type {};
135
+
136
+ template<class T>
137
+ struct is_pointer_pointer<T** const> : std::true_type {};
138
+
139
+ template<class T>
140
+ struct is_pointer_pointer<T* const * const> : std::true_type {};
141
+
142
+ template<class T>
143
+ struct is_pointer_pointer<const T* const* const> : std::true_type {};
144
+
145
+ template<class T>
146
+ constexpr bool is_pointer_pointer_v = is_pointer_pointer<T>::value;
147
+
148
+ // See https://www.cppstories.com/2022/tuple-iteration-apply/
149
+ template <typename Tuple_T, typename Function_T>
150
+ void for_each_tuple(Tuple_T&& tuple, Function_T&& callable)
151
+ {
152
+ std::apply([&callable](auto&& ...args)
153
+ {
154
+ (callable(std::forward<decltype(args)>(args)), ...);
155
+ }, std::forward<Tuple_T>(tuple));
156
+ }
157
+ } // detail
158
+ } // Rice
159
+
160
+ #endif // Rice__detail__traits__hpp_
data/rice.gemspec ADDED
@@ -0,0 +1,85 @@
1
+ $:.unshift File.expand_path(File.dirname(__FILE__))
2
+ require 'lib/rice/version'
3
+
4
+ $spec = Gem::Specification.new do |s|
5
+ s.name = 'rice'
6
+ s.version = Rice::VERSION
7
+ s.license = "MIT"
8
+ s.summary = 'Ruby Interface for C++ Extensions'
9
+ s.homepage = 'https://github.com/ruby-rice/rice'
10
+ s.authors = ['Paul Brannan', 'Jason Roelofs', 'Charlie Savage']
11
+ s.email = ['curlypaul924@gmail.com', 'jasongroelofs@gmail.com', 'cfis@savagexi.com']
12
+
13
+ s.description = <<-END
14
+ Rice is a C++ interface to Ruby's C API. It provides a type-safe and
15
+ exception-safe interface in order to make embedding Ruby and writing
16
+ Ruby extensions with C++ easier.
17
+ END
18
+
19
+ s.metadata = {
20
+ "bug_tracker_uri" => "https://github.com/ruby-rice/rice/issues",
21
+ "changelog_uri" => "https://github.com/ruby-rice/rice/blob/master/CHANGELOG.md",
22
+ "documentation_uri" => "https://ruby-rice.github.io",
23
+ "source_code_uri" => "https://github.com/ruby-rice/rice",
24
+ }
25
+
26
+ s.test_files = Dir['test/ruby/*.rb']
27
+ s.extra_rdoc_files = ['README.md']
28
+ s.require_paths = ['lib']
29
+
30
+ s.files = Dir[
31
+ # Documentation
32
+ 'CHANGELOG.md',
33
+ 'CONTRIBUTORS.md',
34
+ 'COPYING',
35
+ 'README.md',
36
+
37
+ # Ruby files
38
+ 'Gemfile',
39
+ 'Rakefile',
40
+ 'rice.gemspec',
41
+
42
+ # CMake Files
43
+ 'CMakeLists.txt',
44
+ 'CMakePresets.json',
45
+ 'FindRuby.cmake',
46
+
47
+ # rice.hpp
48
+ 'include/rice/rice.hpp',
49
+ 'include/rice/stl.hpp',
50
+
51
+ # Source files
52
+ 'rice/**/*.?pp',
53
+
54
+ # Ruby files
55
+ 'lib/**/*.rb',
56
+
57
+ # Samples
58
+ 'sample/enum/extconf.rb',
59
+ 'sample/enum/*.?pp',
60
+ 'sample/enum/*.rb',
61
+ 'sample/map/extconf.rb',
62
+ 'sample/map/*.?pp',
63
+ 'sample/map/*.rb',
64
+ 'sample/inheritance/extconf.rb',
65
+ 'sample/inheritance/*.?pp',
66
+ 'sample/inheritance/*.rb',
67
+ 'sample/callbacks/extconf.rb',
68
+ 'sample/callbacks/*.?pp',
69
+ 'sample/callbacks/*.rb',
70
+
71
+ # Test source files
72
+ 'test/*.?pp',
73
+ 'test/extconf.rb',
74
+ 'test/ext/t1/extconf.rb',
75
+ 'test/ext/t1/*.*pp',
76
+ 'test/ext/t2/extconf.rb',
77
+ 'test/ext/t2/*.*pp'
78
+ ]
79
+
80
+ s.required_ruby_version = ">= 3.1"
81
+
82
+ s.add_development_dependency "bundler"
83
+ s.add_development_dependency "rake"
84
+ s.add_development_dependency "minitest"
85
+ end
data/test/embed_ruby.cpp CHANGED
@@ -25,5 +25,8 @@ void embed_ruby()
25
25
  #endif
26
26
 
27
27
  initialized__ = true;
28
+
29
+ // Initialize Rice
30
+ Rice::init();
28
31
  }
29
32
  }
@@ -1,14 +1,14 @@
1
- $: << File.join(__dir__, '..', 'ext')
2
-
3
- require 'minitest'
4
- require 'minitest/autorun'
5
-
6
- class MultipleExtensionsSameClassTest < Minitest::Test
7
- def test_multiple_extensions_same_class
8
- require 't1/t1'
9
- require 't2/t2'
10
-
11
- foo = Foo.new
12
- assert_equal 42, foo.foo
13
- end
14
- end
1
+ $: << File.join(__dir__, '..', 'ext')
2
+
3
+ require 'minitest'
4
+ require 'minitest/autorun'
5
+
6
+ class MultipleExtensionsSameClassTest < Minitest::Test
7
+ def test_multiple_extensions_same_class
8
+ require 't1/t1'
9
+ require 't2/t2'
10
+
11
+ foo = Foo.new
12
+ assert_equal 42, foo.foo
13
+ end
14
+ end
data/test/test_Array.cpp CHANGED
@@ -276,12 +276,15 @@ TESTCASE(assign_int)
276
276
  * Issue 59 - Copy constructor compilation problem.
277
277
  */
278
278
 
279
- namespace {
280
- void testArrayArg(Object self, Array string) {
279
+ namespace
280
+ {
281
+ void testArrayArg(Object self, Array string)
282
+ {
281
283
  }
282
284
  }
283
285
 
284
- TESTCASE(use_array_in_wrapped_function) {
286
+ TESTCASE(use_array_in_wrapped_function)
287
+ {
285
288
  define_global_function("test_array_arg", &testArrayArg);
286
289
  }
287
290
 
@@ -53,6 +53,21 @@ namespace
53
53
  bool globalBool = true;
54
54
  const DataStruct* globalStruct = new DataStruct();
55
55
 
56
+ class VecStruct
57
+ {
58
+ public:
59
+ std::vector<double> vector;
60
+
61
+ VecStruct(std::vector<double> aVector) : vector(aVector)
62
+ {
63
+ }
64
+
65
+ size_t vecSize()
66
+ {
67
+ return this->vector.size();
68
+ }
69
+ };
70
+
56
71
  } // namespace
57
72
 
58
73
  TESTCASE(attributes)
@@ -102,6 +117,25 @@ TESTCASE(attributes)
102
117
  ASSERT_EQUAL("Set a string", detail::From_Ruby<std::string>().convert(result.value()));
103
118
  }
104
119
 
120
+ TESTCASE(vector)
121
+ {
122
+ // See https ://github.com/ruby-rice/rice/issues/283
123
+ Module m = define_module("Testing");
124
+
125
+ define_class<VecStruct>("VecStruct")
126
+ .define_constructor(Constructor<VecStruct, std::vector<double>>())
127
+ .define_attr("vector", &VecStruct::vector, Rice::AttrAccess::Read)
128
+ .define_method("vector_size", &VecStruct::vecSize);
129
+
130
+ std::string code = R"(struct = VecStruct.new([1, 2])
131
+ # Access the attribute
132
+ array = struct.vector.to_a
133
+ struct.vector_size)";
134
+
135
+ Object result = m.module_eval(code);
136
+ ASSERT_EQUAL(2, detail::From_Ruby<int>().convert(result));
137
+ }
138
+
105
139
  TESTCASE(const_attribute)
106
140
  {
107
141
  Class c = define_class<DataStruct>("DataStruct")
@@ -109,7 +143,6 @@ TESTCASE(const_attribute)
109
143
  .define_attr("const_int", &DataStruct::constInt);
110
144
 
111
145
  Data_Object<DataStruct> o = c.call("new");
112
- const DataStruct* dataStruct = o.get();
113
146
 
114
147
  if constexpr (!oldRuby)
115
148
  {