rice 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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