rice 2.1.1 → 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 (246) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +69 -0
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +30 -376
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +14 -9
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -49
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -274
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +117 -137
  128. data/Doxyfile +0 -2280
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README +0 -1055
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -142
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7481
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -124
  173. data/rice/Makefile.in +0 -839
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -625
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -503
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -486
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1150
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -480
  246. data/test/test_rice.rb +0 -41
@@ -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,22 +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
-
19
11
  #include <ruby.h>
20
12
 
21
- #ifdef WIN32
22
- #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
23
18
  #endif
24
19
 
25
- // This causes problems with certain C++ libraries
26
- #undef TYPE
20
+ // And some c library conflicts
21
+ #undef isnan
22
+ #undef snprintf
23
+ #undef vsnprintf
27
24
 
28
25
  //! A function that takes a VALUE as a parameter and returns a VALUE.
29
26
  // TODO: Casting from a C++ function to an extern "C" function won't
@@ -36,42 +33,5 @@ extern "C" typedef VALUE (*RUBY_VALUE_FUNC)(VALUE);
36
33
  extern "C" typedef VALUE (*RUBY_METHOD_FUNC)(ANYARGS);
37
34
  #endif
38
35
 
39
- #ifndef RSTRING_LEN
40
- #define RSTRING_LEN(str) RSTRING(str)->len
41
- #endif
42
-
43
- #ifndef RSTRING_PTR
44
- #define RSTRING_PTR(str) RSTRING(str)->ptr
45
- #endif
46
-
47
- #ifndef RARRAY_LEN
48
- #define RARRAY_LEN(arr) RARRAY(arr)->len
49
- #endif
50
-
51
- #ifndef RARRAY_PTR
52
- #define RARRAY_PTR(arr) RARRAY(arr)->ptr
53
- #endif
54
-
55
- #ifndef RHASH_TBL
56
- #define RHASH_TBL(hsh) RHASH(hsh)->tbl
57
- #endif
58
-
59
- #ifndef RCLASS_M_TBL
60
- #define RCLASS_M_TBL(c) RCLASS(c)->m_tbl
61
- #endif
62
-
63
- // ruby.h has a few defines that conflict with Visual Studio's STL
64
- #if defined(_MSC_VER)
65
- #undef write
66
- #undef read
67
- #undef bind
68
- #endif
69
-
70
- #ifdef HAVE_CXX11
71
- #define std_unique_ptr std::unique_ptr
72
- #else
73
- #define std_unique_ptr std::auto_ptr
74
- #endif
75
-
76
36
  #endif // Rice__detail__ruby__hpp_
77
37