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.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/lib/mkmf-rice.rb +127 -0
  9. data/lib/version.rb +3 -0
  10. data/rice/Address_Registration_Guard.ipp +75 -32
  11. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  12. data/rice/Arg.hpp +80 -4
  13. data/rice/Arg.ipp +51 -0
  14. data/rice/Constructor.hpp +12 -14
  15. data/rice/Data_Object.ipp +234 -107
  16. data/rice/Data_Object_defn.hpp +77 -117
  17. data/rice/Data_Type.hpp +1 -2
  18. data/rice/Data_Type.ipp +251 -295
  19. data/rice/Data_Type_defn.hpp +175 -243
  20. data/rice/Director.hpp +11 -6
  21. data/rice/Enum.hpp +54 -104
  22. data/rice/Enum.ipp +104 -230
  23. data/rice/Exception.hpp +2 -8
  24. data/rice/Exception.ipp +65 -0
  25. data/rice/Exception_defn.hpp +46 -47
  26. data/rice/Identifier.hpp +28 -28
  27. data/rice/Identifier.ipp +23 -27
  28. data/rice/Return.hpp +39 -0
  29. data/rice/Return.ipp +33 -0
  30. data/rice/detail/Exception_Handler.ipp +22 -62
  31. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  32. data/rice/detail/Iterator.hpp +18 -88
  33. data/rice/detail/Iterator.ipp +47 -0
  34. data/rice/detail/Jump_Tag.hpp +21 -0
  35. data/rice/detail/MethodInfo.hpp +44 -0
  36. data/rice/detail/MethodInfo.ipp +78 -0
  37. data/rice/detail/NativeAttribute.hpp +53 -0
  38. data/rice/detail/NativeAttribute.ipp +83 -0
  39. data/rice/detail/NativeFunction.hpp +69 -0
  40. data/rice/detail/NativeFunction.ipp +248 -0
  41. data/rice/detail/RubyFunction.hpp +39 -0
  42. data/rice/detail/RubyFunction.ipp +92 -0
  43. data/rice/detail/Type.hpp +29 -0
  44. data/rice/detail/Type.ipp +138 -0
  45. data/rice/detail/TypeRegistry.hpp +50 -0
  46. data/rice/detail/TypeRegistry.ipp +106 -0
  47. data/rice/detail/Wrapper.hpp +51 -0
  48. data/rice/detail/Wrapper.ipp +151 -0
  49. data/rice/detail/default_allocation_func.hpp +8 -19
  50. data/rice/detail/default_allocation_func.ipp +9 -8
  51. data/rice/detail/from_ruby.hpp +2 -37
  52. data/rice/detail/from_ruby.ipp +1020 -46
  53. data/rice/detail/from_ruby_defn.hpp +38 -0
  54. data/rice/detail/function_traits.hpp +124 -0
  55. data/rice/detail/method_data.hpp +23 -15
  56. data/rice/detail/method_data.ipp +53 -0
  57. data/rice/detail/rice_traits.hpp +116 -0
  58. data/rice/detail/ruby.hpp +9 -46
  59. data/rice/detail/to_ruby.hpp +3 -17
  60. data/rice/detail/to_ruby.ipp +409 -31
  61. data/rice/detail/to_ruby_defn.hpp +48 -0
  62. data/rice/forward_declares.ipp +82 -0
  63. data/rice/global_function.hpp +16 -20
  64. data/rice/global_function.ipp +8 -17
  65. data/rice/rice.hpp +59 -0
  66. data/rice/ruby_mark.hpp +5 -3
  67. data/rice/ruby_try_catch.hpp +4 -4
  68. data/rice/stl.hpp +11 -0
  69. data/sample/callbacks/extconf.rb +3 -0
  70. data/sample/callbacks/sample_callbacks.cpp +10 -13
  71. data/sample/enum/extconf.rb +3 -0
  72. data/sample/enum/sample_enum.cpp +3 -17
  73. data/sample/enum/test.rb +2 -2
  74. data/sample/inheritance/animals.cpp +8 -24
  75. data/sample/inheritance/extconf.rb +3 -0
  76. data/sample/inheritance/test.rb +1 -1
  77. data/sample/map/extconf.rb +3 -0
  78. data/sample/map/map.cpp +10 -18
  79. data/sample/map/test.rb +1 -1
  80. data/test/embed_ruby.cpp +18 -5
  81. data/test/ext/t1/extconf.rb +3 -0
  82. data/test/ext/t1/t1.cpp +1 -3
  83. data/test/ext/t2/extconf.rb +3 -0
  84. data/test/ext/t2/t2.cpp +1 -1
  85. data/test/extconf.rb +23 -0
  86. data/test/ruby/test_callbacks_sample.rb +28 -0
  87. data/test/ruby/test_multiple_extensions.rb +18 -0
  88. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  89. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  90. data/test/test_Address_Registration_Guard.cpp +23 -10
  91. data/test/test_Array.cpp +129 -73
  92. data/test/test_Attribute.cpp +147 -0
  93. data/test/test_Builtin_Object.cpp +34 -14
  94. data/test/test_Class.cpp +149 -275
  95. data/test/test_Constructor.cpp +10 -9
  96. data/test/test_Data_Object.cpp +133 -192
  97. data/test/test_Data_Type.cpp +322 -252
  98. data/test/test_Director.cpp +54 -41
  99. data/test/test_Enum.cpp +228 -103
  100. data/test/test_Exception.cpp +5 -6
  101. data/test/test_Hash.cpp +31 -30
  102. data/test/test_Identifier.cpp +4 -5
  103. data/test/test_Inheritance.cpp +221 -0
  104. data/test/test_Iterator.cpp +161 -0
  105. data/test/test_Jump_Tag.cpp +1 -1
  106. data/test/test_Keep_Alive.cpp +161 -0
  107. data/test/test_Memory_Management.cpp +2 -4
  108. data/test/test_Module.cpp +167 -110
  109. data/test/test_Object.cpp +41 -21
  110. data/test/test_Ownership.cpp +275 -0
  111. data/test/test_Self.cpp +205 -0
  112. data/test/test_Stl_Optional.cpp +90 -0
  113. data/test/test_Stl_Pair.cpp +144 -0
  114. data/test/test_Stl_SmartPointer.cpp +200 -0
  115. data/test/test_Stl_String.cpp +74 -0
  116. data/test/test_Stl_Vector.cpp +652 -0
  117. data/test/test_String.cpp +1 -2
  118. data/test/test_Struct.cpp +29 -39
  119. data/test/test_Symbol.cpp +1 -2
  120. data/test/test_To_From_Ruby.cpp +249 -285
  121. data/test/test_global_functions.cpp +39 -19
  122. data/test/unittest.hpp +0 -4
  123. metadata +63 -139
  124. data/Doxyfile +0 -2268
  125. data/Makefile.am +0 -26
  126. data/Makefile.in +0 -931
  127. data/README.mingw +0 -8
  128. data/aclocal.m4 +0 -1085
  129. data/ax_cxx_compile_stdcxx.m4 +0 -951
  130. data/bootstrap +0 -8
  131. data/config.guess +0 -1421
  132. data/config.sub +0 -1807
  133. data/configure +0 -7792
  134. data/configure.ac +0 -55
  135. data/depcomp +0 -791
  136. data/doxygen.ac +0 -314
  137. data/doxygen.am +0 -186
  138. data/extconf.rb +0 -70
  139. data/install-sh +0 -501
  140. data/missing +0 -215
  141. data/post-autoconf.rb +0 -22
  142. data/post-automake.rb +0 -28
  143. data/rice/Address_Registration_Guard.cpp +0 -22
  144. data/rice/Arg_impl.hpp +0 -129
  145. data/rice/Arg_operators.cpp +0 -21
  146. data/rice/Arg_operators.hpp +0 -19
  147. data/rice/Array.hpp +0 -214
  148. data/rice/Array.ipp +0 -256
  149. data/rice/Builtin_Object.hpp +0 -8
  150. data/rice/Builtin_Object.ipp +0 -50
  151. data/rice/Builtin_Object_defn.hpp +0 -50
  152. data/rice/Class.cpp +0 -57
  153. data/rice/Class.hpp +0 -8
  154. data/rice/Class.ipp +0 -6
  155. data/rice/Class_defn.hpp +0 -84
  156. data/rice/Data_Type.cpp +0 -54
  157. data/rice/Data_Type_fwd.hpp +0 -12
  158. data/rice/Director.cpp +0 -13
  159. data/rice/Exception.cpp +0 -54
  160. data/rice/Exception_Base.hpp +0 -8
  161. data/rice/Exception_Base.ipp +0 -13
  162. data/rice/Exception_Base_defn.hpp +0 -27
  163. data/rice/Hash.hpp +0 -230
  164. data/rice/Hash.ipp +0 -329
  165. data/rice/Identifier.cpp +0 -8
  166. data/rice/Jump_Tag.hpp +0 -24
  167. data/rice/Makefile.am +0 -121
  168. data/rice/Makefile.in +0 -884
  169. data/rice/Module.cpp +0 -84
  170. data/rice/Module.hpp +0 -8
  171. data/rice/Module.ipp +0 -6
  172. data/rice/Module_defn.hpp +0 -88
  173. data/rice/Module_impl.hpp +0 -281
  174. data/rice/Module_impl.ipp +0 -345
  175. data/rice/Object.cpp +0 -169
  176. data/rice/Object.hpp +0 -8
  177. data/rice/Object.ipp +0 -33
  178. data/rice/Object_defn.hpp +0 -214
  179. data/rice/Require_Guard.hpp +0 -21
  180. data/rice/String.cpp +0 -89
  181. data/rice/String.hpp +0 -91
  182. data/rice/Struct.cpp +0 -117
  183. data/rice/Struct.hpp +0 -162
  184. data/rice/Struct.ipp +0 -26
  185. data/rice/Symbol.cpp +0 -25
  186. data/rice/Symbol.hpp +0 -66
  187. data/rice/Symbol.ipp +0 -44
  188. data/rice/config.hpp +0 -47
  189. data/rice/config.hpp.in +0 -46
  190. data/rice/detail/Arguments.hpp +0 -118
  191. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  192. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  193. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  194. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  195. data/rice/detail/Caster.hpp +0 -103
  196. data/rice/detail/Not_Copyable.hpp +0 -25
  197. data/rice/detail/Wrapped_Function.hpp +0 -33
  198. data/rice/detail/cfp.hpp +0 -24
  199. data/rice/detail/cfp.ipp +0 -51
  200. data/rice/detail/check_ruby_type.cpp +0 -27
  201. data/rice/detail/check_ruby_type.hpp +0 -23
  202. data/rice/detail/creation_funcs.hpp +0 -37
  203. data/rice/detail/creation_funcs.ipp +0 -36
  204. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  205. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  206. data/rice/detail/demangle.cpp +0 -56
  207. data/rice/detail/demangle.hpp +0 -19
  208. data/rice/detail/env.hpp +0 -11
  209. data/rice/detail/method_data.cpp +0 -92
  210. data/rice/detail/node.hpp +0 -13
  211. data/rice/detail/protect.cpp +0 -29
  212. data/rice/detail/protect.hpp +0 -34
  213. data/rice/detail/ruby_version_code.hpp +0 -6
  214. data/rice/detail/ruby_version_code.hpp.in +0 -6
  215. data/rice/detail/st.hpp +0 -22
  216. data/rice/detail/win32.hpp +0 -16
  217. data/rice/detail/wrap_function.hpp +0 -66
  218. data/rice/protect.hpp +0 -38
  219. data/rice/protect.ipp +0 -1134
  220. data/rice/rubypp.rb +0 -97
  221. data/rice/to_from_ruby.hpp +0 -8
  222. data/rice/to_from_ruby.ipp +0 -418
  223. data/rice/to_from_ruby_defn.hpp +0 -70
  224. data/ruby.ac +0 -135
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/sample/Makefile.am +0 -53
  232. data/sample/Makefile.in +0 -495
  233. data/test/Makefile.am +0 -73
  234. data/test/Makefile.in +0 -1219
  235. data/test/ext/Makefile.am +0 -41
  236. data/test/ext/Makefile.in +0 -483
  237. 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_
@@ -1,21 +1,29 @@
1
1
  #ifndef Rice__detail__method_data__hpp
2
2
  #define Rice__detail__method_data__hpp
3
3
 
4
- #include "ruby.hpp"
4
+ #include <unordered_map>
5
+ #include <any>
5
6
 
6
- namespace Rice
7
- {
7
+ #include "ruby.hpp"
8
8
 
9
- namespace detail
9
+ namespace Rice::detail
10
10
  {
11
-
12
- VALUE define_method_with_data(
13
- VALUE klass, ID id, VALUE (*cfunc)(ANYARGS), int arity, VALUE data);
14
-
15
- VALUE method_data();
16
-
17
- } // namespace detail
18
-
19
- } // namespace Rice
20
-
21
- #endif // Rice__detail__method_data__hpp
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
- #ifdef WIN32
23
- #include "win32.hpp"
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
- // This causes problems with certain C++ libraries
27
- #undef TYPE
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