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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -0
- data/CMakeLists.txt +31 -0
- data/CMakePresets.json +75 -0
- data/COPYING +3 -2
- data/FindRuby.cmake +437 -0
- data/Rakefile +5 -4
- data/include/rice/rice.hpp +5436 -3201
- data/include/rice/stl.hpp +2355 -1269
- data/lib/make_rice_headers.rb +79 -0
- data/lib/mkmf-rice.rb +4 -0
- data/lib/rice/version.rb +3 -0
- data/lib/rice.rb +1 -0
- data/lib/rubygems/builder.rb +11 -0
- data/lib/rubygems/cmake_builder.rb +113 -0
- data/lib/rubygems_plugin.rb +9 -0
- data/rice/Arg.hpp +7 -1
- data/rice/Arg.ipp +11 -2
- data/rice/Buffer.hpp +123 -0
- data/rice/Buffer.ipp +599 -0
- data/rice/Constructor.ipp +3 -3
- data/rice/Data_Object.hpp +2 -3
- data/rice/Data_Object.ipp +188 -188
- data/rice/Data_Type.hpp +4 -5
- data/rice/Data_Type.ipp +42 -26
- data/rice/Enum.hpp +0 -1
- data/rice/Enum.ipp +26 -23
- data/rice/Init.hpp +8 -0
- data/rice/Init.ipp +8 -0
- data/rice/MemoryView.ipp +1 -41
- data/rice/Return.hpp +1 -1
- data/rice/Return.ipp +6 -0
- data/rice/cpp_api/Array.hpp +209 -0
- data/rice/cpp_api/Array.ipp +304 -0
- data/rice/cpp_api/Builtin_Object.hpp +31 -0
- data/rice/cpp_api/Builtin_Object.ipp +37 -0
- data/rice/cpp_api/Class.hpp +70 -0
- data/rice/cpp_api/Class.ipp +97 -0
- data/rice/cpp_api/Encoding.hpp +32 -0
- data/rice/cpp_api/Encoding.ipp +59 -0
- data/rice/cpp_api/Hash.hpp +194 -0
- data/rice/cpp_api/Hash.ipp +257 -0
- data/rice/cpp_api/Identifier.hpp +46 -0
- data/rice/cpp_api/Identifier.ipp +31 -0
- data/rice/cpp_api/Module.hpp +72 -0
- data/rice/cpp_api/Module.ipp +101 -0
- data/rice/cpp_api/Object.hpp +272 -0
- data/rice/cpp_api/Object.ipp +235 -0
- data/rice/cpp_api/String.hpp +74 -0
- data/rice/cpp_api/String.ipp +120 -0
- data/rice/cpp_api/Struct.hpp +113 -0
- data/rice/cpp_api/Struct.ipp +92 -0
- data/rice/cpp_api/Symbol.hpp +46 -0
- data/rice/cpp_api/Symbol.ipp +93 -0
- data/rice/cpp_api/shared_methods.hpp +134 -0
- data/rice/detail/MethodInfo.hpp +1 -9
- data/rice/detail/MethodInfo.ipp +5 -72
- data/rice/detail/Native.hpp +3 -2
- data/rice/detail/Native.ipp +32 -4
- data/rice/detail/NativeAttributeGet.hpp +3 -2
- data/rice/detail/NativeAttributeGet.ipp +8 -2
- data/rice/detail/NativeAttributeSet.hpp +3 -2
- data/rice/detail/NativeAttributeSet.ipp +8 -2
- data/rice/detail/NativeCallbackFFI.ipp +1 -1
- data/rice/detail/NativeFunction.hpp +17 -6
- data/rice/detail/NativeFunction.ipp +168 -64
- data/rice/detail/NativeIterator.hpp +3 -2
- data/rice/detail/NativeIterator.ipp +8 -2
- data/rice/detail/RubyType.hpp +2 -5
- data/rice/detail/RubyType.ipp +50 -5
- data/rice/detail/Type.hpp +3 -1
- data/rice/detail/Type.ipp +61 -31
- data/rice/detail/Wrapper.hpp +68 -33
- data/rice/detail/Wrapper.ipp +103 -113
- data/rice/detail/from_ruby.hpp +5 -4
- data/rice/detail/from_ruby.ipp +737 -365
- data/rice/detail/to_ruby.ipp +1092 -186
- data/rice/global_function.ipp +1 -1
- data/rice/libc/file.hpp +11 -0
- data/rice/libc/file.ipp +32 -0
- data/rice/rice.hpp +23 -16
- data/rice/stl/complex.hpp +6 -0
- data/rice/stl/complex.ipp +93 -0
- data/rice/stl/exception.hpp +11 -0
- data/rice/stl/exception.ipp +29 -0
- data/rice/stl/exception_ptr.hpp +6 -0
- data/rice/stl/exception_ptr.ipp +27 -0
- data/rice/stl/map.hpp +12 -0
- data/rice/stl/map.ipp +469 -0
- data/rice/stl/monostate.hpp +6 -0
- data/rice/stl/monostate.ipp +80 -0
- data/rice/stl/multimap.hpp +14 -0
- data/rice/stl/multimap.ipp +448 -0
- data/rice/stl/optional.hpp +6 -0
- data/rice/stl/optional.ipp +118 -0
- data/rice/stl/pair.hpp +13 -0
- data/rice/stl/pair.ipp +155 -0
- data/rice/stl/reference_wrapper.hpp +6 -0
- data/rice/stl/reference_wrapper.ipp +41 -0
- data/rice/stl/set.hpp +12 -0
- data/rice/stl/set.ipp +495 -0
- data/rice/stl/shared_ptr.hpp +28 -0
- data/rice/stl/shared_ptr.ipp +224 -0
- data/rice/stl/string.hpp +6 -0
- data/rice/stl/string.ipp +158 -0
- data/rice/stl/string_view.hpp +6 -0
- data/rice/stl/string_view.ipp +65 -0
- data/rice/stl/tuple.hpp +6 -0
- data/rice/stl/tuple.ipp +128 -0
- data/rice/stl/type_index.hpp +6 -0
- data/rice/stl/type_index.ipp +30 -0
- data/rice/stl/type_info.hpp +6 -0
- data/rice/stl/type_info.ipp +29 -0
- data/rice/stl/unique_ptr.hpp +22 -0
- data/rice/stl/unique_ptr.ipp +139 -0
- data/rice/stl/unordered_map.hpp +12 -0
- data/rice/stl/unordered_map.ipp +469 -0
- data/rice/stl/variant.hpp +6 -0
- data/rice/stl/variant.ipp +242 -0
- data/rice/stl/vector.hpp +12 -0
- data/rice/stl/vector.ipp +590 -0
- data/rice/stl.hpp +7 -3
- data/rice/traits/attribute_traits.hpp +26 -0
- data/rice/traits/function_traits.hpp +95 -0
- data/rice/traits/method_traits.hpp +47 -0
- data/rice/traits/rice_traits.hpp +160 -0
- data/rice.gemspec +85 -0
- data/test/embed_ruby.cpp +3 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
- data/test/test_Array.cpp +6 -3
- data/test/test_Attribute.cpp +34 -1
- data/test/test_Buffer.cpp +285 -0
- data/test/test_Callback.cpp +2 -3
- data/test/test_Data_Object.cpp +88 -34
- data/test/test_Data_Type.cpp +106 -65
- data/test/test_Director.cpp +7 -3
- data/test/test_Enum.cpp +5 -2
- data/test/test_File.cpp +1 -1
- data/test/test_From_Ruby.cpp +181 -114
- data/test/test_Iterator.cpp +1 -1
- data/test/{test_JumpException.cpp → test_Jump_Exception.cpp} +1 -0
- data/test/test_Keep_Alive.cpp +7 -18
- data/test/test_Keep_Alive_No_Wrapper.cpp +0 -1
- data/test/test_Module.cpp +13 -6
- data/test/test_Native_Registry.cpp +0 -1
- data/test/test_Overloads.cpp +180 -5
- data/test/test_Ownership.cpp +100 -57
- data/test/test_Proc.cpp +0 -1
- data/test/test_Self.cpp +4 -4
- data/test/test_Stl_Map.cpp +37 -39
- data/test/test_Stl_Multimap.cpp +693 -0
- data/test/test_Stl_Pair.cpp +8 -8
- data/test/test_Stl_Reference_Wrapper.cpp +4 -2
- data/test/test_Stl_Set.cpp +790 -0
- data/test/{test_Stl_SmartPointer.cpp → test_Stl_SharedPtr.cpp} +97 -127
- data/test/test_Stl_Tuple.cpp +116 -0
- data/test/test_Stl_Type.cpp +1 -1
- data/test/test_Stl_UniquePtr.cpp +202 -0
- data/test/test_Stl_Unordered_Map.cpp +28 -34
- data/test/test_Stl_Variant.cpp +217 -89
- data/test/test_Stl_Vector.cpp +209 -83
- data/test/test_To_Ruby.cpp +373 -1
- data/test/test_Type.cpp +85 -14
- data/test/test_global_functions.cpp +17 -4
- metadata +94 -10
- 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
@@ -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
|
-
|
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
|
|
data/test/test_Attribute.cpp
CHANGED
@@ -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
|
{
|