rice 3.0.0 → 4.0.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 +121 -0
- data/CONTRIBUTORS.md +19 -0
- data/Gemfile +3 -0
- data/README.md +44 -1025
- data/Rakefile +95 -12
- data/include/rice/rice.hpp +7766 -0
- data/lib/mkmf-rice.rb +127 -0
- data/lib/version.rb +3 -0
- data/rice/Address_Registration_Guard.ipp +75 -32
- data/rice/Address_Registration_Guard_defn.hpp +60 -56
- data/rice/Arg.hpp +80 -4
- data/rice/Arg.ipp +51 -0
- data/rice/Constructor.hpp +12 -14
- data/rice/Data_Object.ipp +234 -107
- data/rice/Data_Object_defn.hpp +77 -117
- data/rice/Data_Type.hpp +1 -2
- data/rice/Data_Type.ipp +251 -295
- data/rice/Data_Type_defn.hpp +175 -243
- data/rice/Director.hpp +11 -6
- data/rice/Enum.hpp +54 -104
- data/rice/Enum.ipp +104 -230
- data/rice/Exception.hpp +2 -8
- data/rice/Exception.ipp +65 -0
- data/rice/Exception_defn.hpp +46 -47
- data/rice/Identifier.hpp +28 -28
- data/rice/Identifier.ipp +23 -27
- data/rice/Return.hpp +39 -0
- data/rice/Return.ipp +33 -0
- data/rice/detail/Exception_Handler.ipp +22 -62
- data/rice/detail/Exception_Handler_defn.hpp +76 -91
- data/rice/detail/Iterator.hpp +18 -88
- data/rice/detail/Iterator.ipp +47 -0
- data/rice/detail/Jump_Tag.hpp +21 -0
- data/rice/detail/MethodInfo.hpp +44 -0
- data/rice/detail/MethodInfo.ipp +78 -0
- data/rice/detail/NativeAttribute.hpp +53 -0
- data/rice/detail/NativeAttribute.ipp +83 -0
- data/rice/detail/NativeFunction.hpp +69 -0
- data/rice/detail/NativeFunction.ipp +248 -0
- data/rice/detail/RubyFunction.hpp +39 -0
- data/rice/detail/RubyFunction.ipp +92 -0
- data/rice/detail/Type.hpp +29 -0
- data/rice/detail/Type.ipp +138 -0
- data/rice/detail/TypeRegistry.hpp +50 -0
- data/rice/detail/TypeRegistry.ipp +106 -0
- data/rice/detail/Wrapper.hpp +51 -0
- data/rice/detail/Wrapper.ipp +151 -0
- data/rice/detail/default_allocation_func.hpp +8 -19
- data/rice/detail/default_allocation_func.ipp +9 -8
- data/rice/detail/from_ruby.hpp +2 -37
- data/rice/detail/from_ruby.ipp +1020 -46
- data/rice/detail/from_ruby_defn.hpp +38 -0
- data/rice/detail/function_traits.hpp +124 -0
- data/rice/detail/method_data.hpp +23 -15
- data/rice/detail/method_data.ipp +53 -0
- data/rice/detail/rice_traits.hpp +116 -0
- data/rice/detail/ruby.hpp +9 -46
- data/rice/detail/to_ruby.hpp +3 -17
- data/rice/detail/to_ruby.ipp +409 -31
- data/rice/detail/to_ruby_defn.hpp +48 -0
- data/rice/forward_declares.ipp +82 -0
- data/rice/global_function.hpp +16 -20
- data/rice/global_function.ipp +8 -17
- data/rice/rice.hpp +59 -0
- data/rice/ruby_mark.hpp +5 -3
- data/rice/ruby_try_catch.hpp +4 -4
- data/rice/stl.hpp +11 -0
- data/sample/callbacks/extconf.rb +3 -0
- data/sample/callbacks/sample_callbacks.cpp +10 -13
- data/sample/enum/extconf.rb +3 -0
- data/sample/enum/sample_enum.cpp +3 -17
- data/sample/enum/test.rb +2 -2
- data/sample/inheritance/animals.cpp +8 -24
- data/sample/inheritance/extconf.rb +3 -0
- data/sample/inheritance/test.rb +1 -1
- data/sample/map/extconf.rb +3 -0
- data/sample/map/map.cpp +10 -18
- data/sample/map/test.rb +1 -1
- data/test/embed_ruby.cpp +18 -5
- data/test/ext/t1/extconf.rb +3 -0
- data/test/ext/t1/t1.cpp +1 -3
- data/test/ext/t2/extconf.rb +3 -0
- data/test/ext/t2/t2.cpp +1 -1
- data/test/extconf.rb +23 -0
- data/test/ruby/test_callbacks_sample.rb +28 -0
- data/test/ruby/test_multiple_extensions.rb +18 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
- data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
- data/test/test_Address_Registration_Guard.cpp +23 -10
- data/test/test_Array.cpp +129 -73
- data/test/test_Attribute.cpp +147 -0
- data/test/test_Builtin_Object.cpp +34 -14
- data/test/test_Class.cpp +149 -275
- data/test/test_Constructor.cpp +10 -9
- data/test/test_Data_Object.cpp +133 -192
- data/test/test_Data_Type.cpp +322 -252
- data/test/test_Director.cpp +54 -41
- data/test/test_Enum.cpp +228 -103
- data/test/test_Exception.cpp +5 -6
- data/test/test_Hash.cpp +31 -30
- data/test/test_Identifier.cpp +4 -5
- data/test/test_Inheritance.cpp +221 -0
- data/test/test_Iterator.cpp +161 -0
- data/test/test_Jump_Tag.cpp +1 -1
- data/test/test_Keep_Alive.cpp +161 -0
- data/test/test_Memory_Management.cpp +2 -4
- data/test/test_Module.cpp +167 -110
- data/test/test_Object.cpp +41 -21
- data/test/test_Ownership.cpp +275 -0
- data/test/test_Self.cpp +205 -0
- data/test/test_Stl_Optional.cpp +90 -0
- data/test/test_Stl_Pair.cpp +144 -0
- data/test/test_Stl_SmartPointer.cpp +200 -0
- data/test/test_Stl_String.cpp +74 -0
- data/test/test_Stl_Vector.cpp +652 -0
- data/test/test_String.cpp +1 -2
- data/test/test_Struct.cpp +29 -39
- data/test/test_Symbol.cpp +1 -2
- data/test/test_To_From_Ruby.cpp +249 -285
- data/test/test_global_functions.cpp +39 -19
- data/test/unittest.hpp +0 -4
- metadata +63 -139
- data/Doxyfile +0 -2268
- data/Makefile.am +0 -26
- data/Makefile.in +0 -931
- data/README.mingw +0 -8
- data/aclocal.m4 +0 -1085
- data/ax_cxx_compile_stdcxx.m4 +0 -951
- data/bootstrap +0 -8
- data/config.guess +0 -1421
- data/config.sub +0 -1807
- data/configure +0 -7792
- data/configure.ac +0 -55
- data/depcomp +0 -791
- data/doxygen.ac +0 -314
- data/doxygen.am +0 -186
- data/extconf.rb +0 -70
- data/install-sh +0 -501
- data/missing +0 -215
- data/post-autoconf.rb +0 -22
- data/post-automake.rb +0 -28
- data/rice/Address_Registration_Guard.cpp +0 -22
- data/rice/Arg_impl.hpp +0 -129
- data/rice/Arg_operators.cpp +0 -21
- data/rice/Arg_operators.hpp +0 -19
- data/rice/Array.hpp +0 -214
- data/rice/Array.ipp +0 -256
- data/rice/Builtin_Object.hpp +0 -8
- data/rice/Builtin_Object.ipp +0 -50
- data/rice/Builtin_Object_defn.hpp +0 -50
- data/rice/Class.cpp +0 -57
- data/rice/Class.hpp +0 -8
- data/rice/Class.ipp +0 -6
- data/rice/Class_defn.hpp +0 -84
- data/rice/Data_Type.cpp +0 -54
- data/rice/Data_Type_fwd.hpp +0 -12
- data/rice/Director.cpp +0 -13
- data/rice/Exception.cpp +0 -54
- data/rice/Exception_Base.hpp +0 -8
- data/rice/Exception_Base.ipp +0 -13
- data/rice/Exception_Base_defn.hpp +0 -27
- data/rice/Hash.hpp +0 -230
- data/rice/Hash.ipp +0 -329
- data/rice/Identifier.cpp +0 -8
- data/rice/Jump_Tag.hpp +0 -24
- data/rice/Makefile.am +0 -121
- data/rice/Makefile.in +0 -884
- data/rice/Module.cpp +0 -84
- data/rice/Module.hpp +0 -8
- data/rice/Module.ipp +0 -6
- data/rice/Module_defn.hpp +0 -88
- data/rice/Module_impl.hpp +0 -281
- data/rice/Module_impl.ipp +0 -345
- data/rice/Object.cpp +0 -169
- data/rice/Object.hpp +0 -8
- data/rice/Object.ipp +0 -33
- data/rice/Object_defn.hpp +0 -214
- data/rice/Require_Guard.hpp +0 -21
- data/rice/String.cpp +0 -89
- data/rice/String.hpp +0 -91
- data/rice/Struct.cpp +0 -117
- data/rice/Struct.hpp +0 -162
- data/rice/Struct.ipp +0 -26
- data/rice/Symbol.cpp +0 -25
- data/rice/Symbol.hpp +0 -66
- data/rice/Symbol.ipp +0 -44
- data/rice/config.hpp +0 -47
- data/rice/config.hpp.in +0 -46
- data/rice/detail/Arguments.hpp +0 -118
- data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
- data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
- data/rice/detail/Caster.hpp +0 -103
- data/rice/detail/Not_Copyable.hpp +0 -25
- data/rice/detail/Wrapped_Function.hpp +0 -33
- data/rice/detail/cfp.hpp +0 -24
- data/rice/detail/cfp.ipp +0 -51
- data/rice/detail/check_ruby_type.cpp +0 -27
- data/rice/detail/check_ruby_type.hpp +0 -23
- data/rice/detail/creation_funcs.hpp +0 -37
- data/rice/detail/creation_funcs.ipp +0 -36
- data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
- data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
- data/rice/detail/demangle.cpp +0 -56
- data/rice/detail/demangle.hpp +0 -19
- data/rice/detail/env.hpp +0 -11
- data/rice/detail/method_data.cpp +0 -92
- data/rice/detail/node.hpp +0 -13
- data/rice/detail/protect.cpp +0 -29
- data/rice/detail/protect.hpp +0 -34
- data/rice/detail/ruby_version_code.hpp +0 -6
- data/rice/detail/ruby_version_code.hpp.in +0 -6
- data/rice/detail/st.hpp +0 -22
- data/rice/detail/win32.hpp +0 -16
- data/rice/detail/wrap_function.hpp +0 -66
- data/rice/protect.hpp +0 -38
- data/rice/protect.ipp +0 -1134
- data/rice/rubypp.rb +0 -97
- data/rice/to_from_ruby.hpp +0 -8
- data/rice/to_from_ruby.ipp +0 -418
- data/rice/to_from_ruby_defn.hpp +0 -70
- data/ruby.ac +0 -135
- data/ruby/Makefile.am +0 -1
- data/ruby/Makefile.in +0 -628
- data/ruby/lib/Makefile.am +0 -3
- data/ruby/lib/Makefile.in +0 -506
- data/ruby/lib/mkmf-rice.rb.in +0 -217
- data/ruby/lib/version.rb +0 -3
- data/sample/Makefile.am +0 -53
- data/sample/Makefile.in +0 -495
- data/test/Makefile.am +0 -73
- data/test/Makefile.in +0 -1219
- data/test/ext/Makefile.am +0 -41
- data/test/ext/Makefile.in +0 -483
- data/test/test_rice.rb +0 -45
@@ -0,0 +1,38 @@
|
|
1
|
+
#ifndef Rice__detail__from_ruby_defn__hpp_
|
2
|
+
#define Rice__detail__from_ruby_defn__hpp_
|
3
|
+
|
4
|
+
#include <type_traits>
|
5
|
+
|
6
|
+
#include "ruby.hpp"
|
7
|
+
|
8
|
+
namespace Rice::detail
|
9
|
+
{
|
10
|
+
//! Convert a Ruby object to C++.
|
11
|
+
/*! If the Ruby object can be converted to an immediate value, returns a
|
12
|
+
* copy of the Ruby object. If the Ruby object is holding a C++
|
13
|
+
* object and the type specified is a pointer to that type, returns a
|
14
|
+
* pointer to that object.
|
15
|
+
*
|
16
|
+
* Conversions from ruby to a pointer type are automatically generated
|
17
|
+
* when a type is bound using Data_Type. If no conversion exists an
|
18
|
+
* exception is thrown.
|
19
|
+
*
|
20
|
+
* \param T the C++ type to which to convert.
|
21
|
+
* \param x the Ruby object to convert.
|
22
|
+
* \return a C++ representation of the Ruby object.
|
23
|
+
*
|
24
|
+
* Example:
|
25
|
+
* \code
|
26
|
+
* Object x = INT2NUM(42);
|
27
|
+
* std::cout << From_Ruby<int>::convert(x);
|
28
|
+
*
|
29
|
+
* Data_Object<Foo> foo(new Foo);
|
30
|
+
* std::cout << *From_Ruby<Foo *>(foo) << std::endl;
|
31
|
+
* \endcode
|
32
|
+
*/
|
33
|
+
|
34
|
+
template <typename T>
|
35
|
+
class From_Ruby;
|
36
|
+
}
|
37
|
+
|
38
|
+
#endif // Rice__detail__From_Ruby2_defn__hpp_
|
@@ -0,0 +1,124 @@
|
|
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
|
+
// -------------- Function Traits --------------
|
9
|
+
// Base class
|
10
|
+
template<typename Function_T>
|
11
|
+
struct function_traits;
|
12
|
+
|
13
|
+
// Base definition that support functors and lambdas
|
14
|
+
template<class Function_T>
|
15
|
+
struct function_traits
|
16
|
+
{
|
17
|
+
private:
|
18
|
+
using functor_t = function_traits<decltype(&Function_T::operator())>;
|
19
|
+
|
20
|
+
public:
|
21
|
+
using arg_types = typename functor_t::arg_types;
|
22
|
+
|
23
|
+
static constexpr std::size_t arity = functor_t::arity - 1;
|
24
|
+
|
25
|
+
template<std::size_t N>
|
26
|
+
using nth_arg = typename std::tuple_element<N, typename functor_t::arg_types>::type;
|
27
|
+
|
28
|
+
using return_type = typename functor_t::return_type;
|
29
|
+
using class_type = std::nullptr_t;
|
30
|
+
};
|
31
|
+
|
32
|
+
// Specialization for functions, member functions and static member functions
|
33
|
+
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
34
|
+
struct function_traits<Return_T(Class_T, Arg_Ts...)>
|
35
|
+
{
|
36
|
+
using arg_types = std::tuple<Arg_Ts...>;
|
37
|
+
|
38
|
+
static constexpr std::size_t arity = sizeof...(Arg_Ts);
|
39
|
+
|
40
|
+
template<std::size_t N>
|
41
|
+
using nth_arg = typename std::tuple_element<N, arg_types>::type;
|
42
|
+
|
43
|
+
using return_type = Return_T;
|
44
|
+
using class_type = Class_T;
|
45
|
+
};
|
46
|
+
|
47
|
+
// Free functions and static member functions passed by pointer or reference
|
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
|
+
template<typename Return_T, typename ...Arg_Ts>
|
54
|
+
struct function_traits<Return_T(&)(Arg_Ts...)> : public function_traits<Return_T(std::nullptr_t, Arg_Ts...)>
|
55
|
+
{
|
56
|
+
};
|
57
|
+
|
58
|
+
// Member Functions
|
59
|
+
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
60
|
+
struct function_traits<Return_T(Class_T::*)(Arg_Ts...)> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
61
|
+
{
|
62
|
+
};
|
63
|
+
|
64
|
+
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
65
|
+
struct function_traits<Return_T(Class_T::*)(Arg_Ts...) const> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
66
|
+
{
|
67
|
+
};
|
68
|
+
|
69
|
+
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
70
|
+
struct function_traits<Return_T(Class_T::*)(Arg_Ts...) noexcept> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
71
|
+
{
|
72
|
+
};
|
73
|
+
|
74
|
+
template<typename Return_T, typename Class_T, typename...Arg_Ts>
|
75
|
+
struct function_traits<Return_T(Class_T::*)(Arg_Ts...) const noexcept> : public function_traits<Return_T(Class_T*, Arg_Ts...)>
|
76
|
+
{
|
77
|
+
};
|
78
|
+
|
79
|
+
// Functors and lambdas
|
80
|
+
template<class Function_T>
|
81
|
+
struct function_traits<Function_T&> : public function_traits<Function_T>
|
82
|
+
{
|
83
|
+
};
|
84
|
+
|
85
|
+
template<class Function_T>
|
86
|
+
struct function_traits<Function_T&&> : public function_traits<Function_T>
|
87
|
+
{
|
88
|
+
};
|
89
|
+
|
90
|
+
// -------------- Method Traits --------------
|
91
|
+
// Declare struct
|
92
|
+
template<typename Function_T, bool IsMethod, typename = void>
|
93
|
+
struct method_traits;
|
94
|
+
|
95
|
+
// Functions that do not have a self parameter
|
96
|
+
template<typename Function_T, bool IsMethod>
|
97
|
+
struct method_traits<Function_T, IsMethod, std::enable_if_t<!IsMethod>>
|
98
|
+
{
|
99
|
+
using Self_T = std::nullptr_t;
|
100
|
+
using Arg_Ts = typename function_traits<Function_T>::arg_types;
|
101
|
+
static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
|
102
|
+
};
|
103
|
+
|
104
|
+
// Functions that do have a self parameter (thus we call them methods)
|
105
|
+
template<typename Function_T, bool IsMethod>
|
106
|
+
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>>>
|
107
|
+
{
|
108
|
+
using Self_T = typename function_traits<Function_T>::template nth_arg<0>;
|
109
|
+
using Arg_Ts = typename tuple_shift<typename function_traits<Function_T>::arg_types>::type;
|
110
|
+
static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
|
111
|
+
};
|
112
|
+
|
113
|
+
// Member functions that have an implied self parameter of an object instance
|
114
|
+
template<typename Function_T, bool IsMethod>
|
115
|
+
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>>>
|
116
|
+
{
|
117
|
+
using Self_T = typename function_traits<Function_T>::class_type;
|
118
|
+
using Arg_Ts = typename function_traits<Function_T>::arg_types;
|
119
|
+
static constexpr std::size_t arity = std::tuple_size_v<Arg_Ts>;
|
120
|
+
};
|
121
|
+
|
122
|
+
}
|
123
|
+
|
124
|
+
#endif // Rice__detail__function_traits__hpp_
|
data/rice/detail/method_data.hpp
CHANGED
@@ -1,21 +1,29 @@
|
|
1
1
|
#ifndef Rice__detail__method_data__hpp
|
2
2
|
#define Rice__detail__method_data__hpp
|
3
3
|
|
4
|
-
#include
|
4
|
+
#include <unordered_map>
|
5
|
+
#include <any>
|
5
6
|
|
6
|
-
|
7
|
-
{
|
7
|
+
#include "ruby.hpp"
|
8
8
|
|
9
|
-
namespace detail
|
9
|
+
namespace Rice::detail
|
10
10
|
{
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
class MethodData
|
12
|
+
{
|
13
|
+
public:
|
14
|
+
// Defines a new Ruby method and stores the Rice metadata about it
|
15
|
+
template<typename Function_T>
|
16
|
+
static void define_method(VALUE klass, ID id, Function_T func, int arity, std::any data);
|
17
|
+
|
18
|
+
// Returns the Rice data for the currently active Ruby method
|
19
|
+
template <typename Return_T>
|
20
|
+
static Return_T data();
|
21
|
+
|
22
|
+
private:
|
23
|
+
static size_t key(VALUE klass, ID id);
|
24
|
+
inline static std::unordered_map<size_t, std::any> methodWrappers_ = {};
|
25
|
+
};
|
26
|
+
}
|
27
|
+
#include "method_data.ipp"
|
28
|
+
|
29
|
+
#endif // Rice__detail__method_data__hpp
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
// Ruby 2.7 now includes a similarly named macro that uses templates to
|
3
|
+
// pick the right overload for the underlying function. That doesn't work
|
4
|
+
// for our cases because we are using this method dynamically and get a
|
5
|
+
// compilation error otherwise. This removes the macro and lets us fall
|
6
|
+
// back to the C-API underneath again.
|
7
|
+
#undef rb_define_method_id
|
8
|
+
|
9
|
+
namespace Rice::detail
|
10
|
+
{
|
11
|
+
// Effective Java (2nd edition)
|
12
|
+
// https://stackoverflow.com/a/2634715
|
13
|
+
inline size_t MethodData::key(VALUE klass, ID id)
|
14
|
+
{
|
15
|
+
if (rb_type(klass) == T_ICLASS)
|
16
|
+
{
|
17
|
+
klass = detail::protect(rb_class_of, klass);
|
18
|
+
}
|
19
|
+
|
20
|
+
uint32_t prime = 53;
|
21
|
+
return (prime + klass) * prime + id;
|
22
|
+
}
|
23
|
+
|
24
|
+
template <typename Return_T>
|
25
|
+
inline Return_T MethodData::data()
|
26
|
+
{
|
27
|
+
ID id;
|
28
|
+
VALUE klass;
|
29
|
+
if (!rb_frame_method_id_and_class(&id, &klass))
|
30
|
+
{
|
31
|
+
rb_raise(rb_eRuntimeError, "Cannot get method id and class for function");
|
32
|
+
}
|
33
|
+
|
34
|
+
auto iter = methodWrappers_.find(key(klass, id));
|
35
|
+
if (iter == methodWrappers_.end())
|
36
|
+
{
|
37
|
+
rb_raise(rb_eRuntimeError, "Could not find data for klass and method id");
|
38
|
+
}
|
39
|
+
|
40
|
+
std::any data = iter->second;
|
41
|
+
return std::any_cast<Return_T>(data);
|
42
|
+
}
|
43
|
+
|
44
|
+
template<typename Function_T>
|
45
|
+
inline void MethodData::define_method(VALUE klass, ID id, Function_T func, int arity, std::any data)
|
46
|
+
{
|
47
|
+
// Define the method
|
48
|
+
protect(rb_define_method_id, klass, id, (RUBY_METHOD_FUNC)func, arity);
|
49
|
+
|
50
|
+
// Now store data about it
|
51
|
+
methodWrappers_[key(klass, id)] = data;
|
52
|
+
}
|
53
|
+
}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#ifndef Rice__detail__traits__hpp_
|
2
|
+
#define Rice__detail__traits__hpp_
|
3
|
+
|
4
|
+
#include <ostream>
|
5
|
+
#include <string>
|
6
|
+
#include <type_traits>
|
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
|
14
|
+
template<typename T>
|
15
|
+
using intrinsic_type = typename std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<T>>>;
|
16
|
+
|
17
|
+
// Recursively remove const/volatilr
|
18
|
+
template<typename T>
|
19
|
+
struct remove_cv_recursive
|
20
|
+
{
|
21
|
+
using type = T;
|
22
|
+
};
|
23
|
+
|
24
|
+
template<typename T>
|
25
|
+
struct remove_cv_recursive<T const volatile>
|
26
|
+
{
|
27
|
+
using type = typename remove_cv_recursive<T>::type;
|
28
|
+
};
|
29
|
+
|
30
|
+
template<typename T>
|
31
|
+
struct remove_cv_recursive<T volatile>
|
32
|
+
{
|
33
|
+
using type = typename remove_cv_recursive<T>::type;
|
34
|
+
};
|
35
|
+
|
36
|
+
template<typename T>
|
37
|
+
struct remove_cv_recursive<T const>
|
38
|
+
{
|
39
|
+
using type = typename remove_cv_recursive<T>::type;
|
40
|
+
};
|
41
|
+
|
42
|
+
template<typename T>
|
43
|
+
struct remove_cv_recursive<T&>
|
44
|
+
{
|
45
|
+
using type = typename remove_cv_recursive<T>::type&;
|
46
|
+
};
|
47
|
+
|
48
|
+
/* template<typename T>
|
49
|
+
struct remove_cv_recursive<T&&>
|
50
|
+
{
|
51
|
+
using type = typename remove_cv_recursive<T>::type&&;
|
52
|
+
};*/
|
53
|
+
|
54
|
+
template<typename T>
|
55
|
+
struct remove_cv_recursive<T*>
|
56
|
+
{
|
57
|
+
using type = typename remove_cv_recursive<T>::type*;
|
58
|
+
};
|
59
|
+
|
60
|
+
template<typename T>
|
61
|
+
using remove_cv_recursive_t = typename remove_cv_recursive<T>::type;
|
62
|
+
|
63
|
+
// Does the Type work with ostreams? This is used to implement #to_s
|
64
|
+
template<typename T, typename = void>
|
65
|
+
struct is_ostreamable : std::false_type {};
|
66
|
+
|
67
|
+
template<typename T>
|
68
|
+
struct is_ostreamable<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<T>())>> : std::true_type {};
|
69
|
+
|
70
|
+
template<typename T>
|
71
|
+
constexpr bool is_ostreamable_v = is_ostreamable<T>::value;
|
72
|
+
|
73
|
+
// Is the type comparable?
|
74
|
+
template<typename T, typename SFINAE = void>
|
75
|
+
struct is_comparable : std::false_type {};
|
76
|
+
|
77
|
+
template<typename T>
|
78
|
+
struct is_comparable<T, std::void_t<decltype(std::declval<T>() == std::declval<T>())>> : std::true_type {};
|
79
|
+
|
80
|
+
template<typename T>
|
81
|
+
constexpr bool is_comparable_v = is_comparable<T>::value;
|
82
|
+
|
83
|
+
template <typename U, typename V>
|
84
|
+
struct is_comparable<std::pair<U, V>>
|
85
|
+
{
|
86
|
+
static const bool value = is_comparable_v<U> && is_comparable_v<V>;
|
87
|
+
};
|
88
|
+
|
89
|
+
template <typename T>
|
90
|
+
struct is_comparable<std::vector<T>>
|
91
|
+
{
|
92
|
+
static const bool value = is_comparable_v<T>;
|
93
|
+
};
|
94
|
+
|
95
|
+
// -- Tuple Helpers ---
|
96
|
+
template<typename T>
|
97
|
+
struct tuple_shift;
|
98
|
+
|
99
|
+
template<typename T, typename...Arg_Ts>
|
100
|
+
struct tuple_shift<std::tuple<T, Arg_Ts...>>
|
101
|
+
{
|
102
|
+
using type = std::tuple<Arg_Ts...>;
|
103
|
+
};
|
104
|
+
|
105
|
+
template<template<typename, typename...> typename T, typename...Arg_Ts>
|
106
|
+
struct tuple_map;
|
107
|
+
|
108
|
+
template<template<typename, typename...> typename T, typename...Arg_Ts>
|
109
|
+
struct tuple_map<T, std::tuple<Arg_Ts...>>
|
110
|
+
{
|
111
|
+
using type = std::tuple<T<remove_cv_recursive_t<Arg_Ts>>...>;
|
112
|
+
};
|
113
|
+
} // detail
|
114
|
+
} // Rice
|
115
|
+
|
116
|
+
#endif // Rice__detail__traits__hpp_
|
data/rice/detail/ruby.hpp
CHANGED
@@ -8,23 +8,19 @@
|
|
8
8
|
|
9
9
|
#include <cmath>
|
10
10
|
|
11
|
-
// missing.h that comes with the one-click installer doesn't properly
|
12
|
-
// check for double-definition of isinf
|
13
|
-
#ifdef isinf
|
14
|
-
#define HAVE_ISINF
|
15
|
-
#endif
|
16
|
-
|
17
|
-
#include "ruby_version_code.hpp"
|
18
|
-
#include "../config.hpp"
|
19
|
-
|
20
11
|
#include <ruby.h>
|
21
12
|
|
22
|
-
|
23
|
-
#
|
13
|
+
// ruby.h has a few defines that conflict with Visual Studio's STL
|
14
|
+
#if defined(_MSC_VER)
|
15
|
+
#undef write
|
16
|
+
#undef read
|
17
|
+
#undef bind
|
24
18
|
#endif
|
25
19
|
|
26
|
-
//
|
27
|
-
#undef
|
20
|
+
// And some c library conflicts
|
21
|
+
#undef isnan
|
22
|
+
#undef snprintf
|
23
|
+
#undef vsnprintf
|
28
24
|
|
29
25
|
//! A function that takes a VALUE as a parameter and returns a VALUE.
|
30
26
|
// TODO: Casting from a C++ function to an extern "C" function won't
|
@@ -37,38 +33,5 @@ extern "C" typedef VALUE (*RUBY_VALUE_FUNC)(VALUE);
|
|
37
33
|
extern "C" typedef VALUE (*RUBY_METHOD_FUNC)(ANYARGS);
|
38
34
|
#endif
|
39
35
|
|
40
|
-
#ifndef RSTRING_LEN
|
41
|
-
#define RSTRING_LEN(str) RSTRING(str)->len
|
42
|
-
#endif
|
43
|
-
|
44
|
-
#ifndef RSTRING_PTR
|
45
|
-
#define RSTRING_PTR(str) RSTRING(str)->ptr
|
46
|
-
#endif
|
47
|
-
|
48
|
-
#ifndef RARRAY_LEN
|
49
|
-
#define RARRAY_LEN(arr) RARRAY(arr)->len
|
50
|
-
#endif
|
51
|
-
|
52
|
-
#ifndef RARRAY_PTR
|
53
|
-
#define RARRAY_PTR(arr) RARRAY(arr)->ptr
|
54
|
-
#endif
|
55
|
-
|
56
|
-
#ifndef RHASH_TBL
|
57
|
-
#define RHASH_TBL(hsh) RHASH(hsh)->tbl
|
58
|
-
#endif
|
59
|
-
|
60
|
-
#ifndef RCLASS_M_TBL
|
61
|
-
#define RCLASS_M_TBL(c) RCLASS(c)->m_tbl
|
62
|
-
#endif
|
63
|
-
|
64
|
-
// ruby.h has a few defines that conflict with Visual Studio's STL
|
65
|
-
#if defined(_MSC_VER)
|
66
|
-
#undef write
|
67
|
-
#undef read
|
68
|
-
#undef bind
|
69
|
-
#endif
|
70
|
-
|
71
|
-
#define std_unique_ptr std::unique_ptr
|
72
|
-
|
73
36
|
#endif // Rice__detail__ruby__hpp_
|
74
37
|
|