rice 2.1.2 → 4.0.1

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 (245) 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 +45 -1028
  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 -276
  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 +120 -136
  128. data/Doxyfile +0 -2268
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README.mingw +0 -8
  132. data/aclocal.m4 +0 -1088
  133. data/bootstrap +0 -8
  134. data/check_stdcxx_11.ac +0 -142
  135. data/config.guess +0 -1421
  136. data/config.sub +0 -1807
  137. data/configure +0 -7481
  138. data/configure.ac +0 -55
  139. data/depcomp +0 -791
  140. data/doxygen.ac +0 -314
  141. data/doxygen.am +0 -186
  142. data/extconf.rb +0 -69
  143. data/install-sh +0 -501
  144. data/missing +0 -215
  145. data/post-autoconf.rb +0 -22
  146. data/post-automake.rb +0 -28
  147. data/rice/Address_Registration_Guard.cpp +0 -22
  148. data/rice/Arg_impl.hpp +0 -129
  149. data/rice/Arg_operators.cpp +0 -21
  150. data/rice/Arg_operators.hpp +0 -19
  151. data/rice/Array.hpp +0 -214
  152. data/rice/Array.ipp +0 -256
  153. data/rice/Builtin_Object.hpp +0 -8
  154. data/rice/Builtin_Object.ipp +0 -50
  155. data/rice/Builtin_Object_defn.hpp +0 -50
  156. data/rice/Class.cpp +0 -57
  157. data/rice/Class.hpp +0 -8
  158. data/rice/Class.ipp +0 -6
  159. data/rice/Class_defn.hpp +0 -83
  160. data/rice/Data_Type.cpp +0 -54
  161. data/rice/Data_Type_fwd.hpp +0 -12
  162. data/rice/Director.cpp +0 -13
  163. data/rice/Exception.cpp +0 -59
  164. data/rice/Exception_Base.hpp +0 -8
  165. data/rice/Exception_Base.ipp +0 -13
  166. data/rice/Exception_Base_defn.hpp +0 -27
  167. data/rice/Hash.hpp +0 -227
  168. data/rice/Hash.ipp +0 -329
  169. data/rice/Identifier.cpp +0 -8
  170. data/rice/Jump_Tag.hpp +0 -24
  171. data/rice/Makefile.am +0 -124
  172. data/rice/Makefile.in +0 -839
  173. data/rice/Module.cpp +0 -84
  174. data/rice/Module.hpp +0 -8
  175. data/rice/Module.ipp +0 -6
  176. data/rice/Module_defn.hpp +0 -88
  177. data/rice/Module_impl.hpp +0 -281
  178. data/rice/Module_impl.ipp +0 -345
  179. data/rice/Object.cpp +0 -169
  180. data/rice/Object.hpp +0 -8
  181. data/rice/Object.ipp +0 -19
  182. data/rice/Object_defn.hpp +0 -191
  183. data/rice/Require_Guard.hpp +0 -21
  184. data/rice/String.cpp +0 -94
  185. data/rice/String.hpp +0 -91
  186. data/rice/Struct.cpp +0 -117
  187. data/rice/Struct.hpp +0 -162
  188. data/rice/Struct.ipp +0 -26
  189. data/rice/Symbol.cpp +0 -25
  190. data/rice/Symbol.hpp +0 -66
  191. data/rice/Symbol.ipp +0 -44
  192. data/rice/config.hpp +0 -47
  193. data/rice/config.hpp.in +0 -46
  194. data/rice/detail/Arguments.hpp +0 -118
  195. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  196. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  197. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  198. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  199. data/rice/detail/Caster.hpp +0 -103
  200. data/rice/detail/Not_Copyable.hpp +0 -25
  201. data/rice/detail/Wrapped_Function.hpp +0 -33
  202. data/rice/detail/cfp.hpp +0 -24
  203. data/rice/detail/cfp.ipp +0 -51
  204. data/rice/detail/check_ruby_type.cpp +0 -27
  205. data/rice/detail/check_ruby_type.hpp +0 -23
  206. data/rice/detail/creation_funcs.hpp +0 -37
  207. data/rice/detail/creation_funcs.ipp +0 -36
  208. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  209. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  210. data/rice/detail/demangle.cpp +0 -56
  211. data/rice/detail/demangle.hpp +0 -19
  212. data/rice/detail/env.hpp +0 -11
  213. data/rice/detail/method_data.cpp +0 -86
  214. data/rice/detail/node.hpp +0 -13
  215. data/rice/detail/object_call.hpp +0 -69
  216. data/rice/detail/object_call.ipp +0 -131
  217. data/rice/detail/protect.cpp +0 -29
  218. data/rice/detail/protect.hpp +0 -34
  219. data/rice/detail/ruby_version_code.hpp +0 -6
  220. data/rice/detail/ruby_version_code.hpp.in +0 -6
  221. data/rice/detail/st.hpp +0 -22
  222. data/rice/detail/traits.hpp +0 -43
  223. data/rice/detail/win32.hpp +0 -16
  224. data/rice/detail/wrap_function.hpp +0 -341
  225. data/rice/detail/wrap_function.ipp +0 -514
  226. data/rice/protect.hpp +0 -92
  227. data/rice/protect.ipp +0 -1134
  228. data/rice/rubypp.rb +0 -97
  229. data/rice/to_from_ruby.hpp +0 -8
  230. data/rice/to_from_ruby.ipp +0 -294
  231. data/rice/to_from_ruby_defn.hpp +0 -70
  232. data/ruby.ac +0 -135
  233. data/ruby/Makefile.am +0 -1
  234. data/ruby/Makefile.in +0 -625
  235. data/ruby/lib/Makefile.am +0 -3
  236. data/ruby/lib/Makefile.in +0 -503
  237. data/ruby/lib/mkmf-rice.rb.in +0 -217
  238. data/ruby/lib/version.rb +0 -3
  239. data/sample/Makefile.am +0 -47
  240. data/sample/Makefile.in +0 -486
  241. data/test/Makefile.am +0 -72
  242. data/test/Makefile.in +0 -1150
  243. data/test/ext/Makefile.am +0 -41
  244. data/test/ext/Makefile.in +0 -480
  245. data/test/test_rice.rb +0 -41
@@ -1,96 +1,81 @@
1
1
  #ifndef Rice__detail__Exception_Handler_defn__hpp_
2
2
  #define Rice__detail__Exception_Handler_defn__hpp_
3
3
 
4
- #include "ruby.h"
5
- #undef TYPE
4
+ #include <memory>
5
+ #include "ruby.hpp"
6
6
 
7
- #include "Not_Copyable.hpp"
8
- #include "../Address_Registration_Guard_defn.hpp"
9
- #include "../Data_Object_defn.hpp"
10
-
11
- namespace Rice
12
- {
13
-
14
- namespace detail
15
- {
16
-
17
- // A class for converting C++ exceptions to ruby exceptions. It's used
18
- // like this:
19
- //
20
- // try
21
- // {
22
- // }
23
- // catch(...)
24
- // {
25
- // handler->handle_exception();
26
- // }
27
- //
28
- // If an exception is thrown the handler will pass the exception up the
29
- // chain, then the last handler in the chain will throw the exception
30
- // down the chain until a lower handler can handle it, e.g.:
31
- //
32
- // try
33
- // {
34
- // return call_next_exception_handler();
35
- // }
36
- // catch(MyException const & ex)
37
- // {
38
- // throw Rice::Exception(rb_cMyException, "%s", ex.what());
39
- // }
40
- //
41
- class Exception_Handler
42
- : public Rice::detail::Not_Copyable
43
- {
44
- public:
45
- Exception_Handler(
46
- Data_Object<Exception_Handler> next_exception_handler);
47
-
48
- virtual ~Exception_Handler();
49
-
50
- virtual VALUE handle_exception() const = 0;
51
-
52
- VALUE call_next_exception_handler() const;
53
-
54
- private:
55
- Data_Object<Exception_Handler> next_exception_handler_;
56
- Address_Registration_Guard next_exception_handler_guard_;
57
- };
58
-
59
- // The default exception handler just rethrows the exception. If there
60
- // are other handlers in the chain, they will try to handle the rethrown
61
- // exception.
62
- class Default_Exception_Handler
63
- : public Exception_Handler
7
+ namespace Rice::detail
64
8
  {
65
- public:
66
- Default_Exception_Handler();
67
-
68
- virtual VALUE handle_exception() const;
69
- };
70
-
71
- // An exception handler that takes a functor as an argument. The
72
- // functor should throw a Rice::Exception to handle the exception. If
73
- // the functor does not handle the exception, the exception will be
74
- // re-thrown.
75
- template <typename Exception_T, typename Functor_T>
76
- class Functor_Exception_Handler
77
- : public Exception_Handler
78
- {
79
- public:
80
- Functor_Exception_Handler(
81
- Functor_T handler,
82
- Data_Object<Exception_Handler> next_exception_handler);
83
-
84
- private:
85
- virtual VALUE handle_exception() const;
86
-
87
- private:
88
- Functor_T handler_;
89
- };
90
-
91
- } // namespace detail
92
-
93
- } // namespace Rice
94
-
95
- #endif // Rice__detail__Exception_Handler_defn__hpp_
96
-
9
+ /* An abstract class for converting C++ exceptions to ruby exceptions. It's used
10
+ like this:
11
+
12
+ try
13
+ {
14
+ }
15
+ catch(...)
16
+ {
17
+ handler->handle_exception();
18
+ }
19
+
20
+ If an exception is thrown the handler will pass the exception up the
21
+ chain, then the last handler in the chain will throw the exception
22
+ down the chain until a lower handler can handle it, e.g.:
23
+
24
+ try
25
+ {
26
+ return call_next_exception_handler();
27
+ }
28
+ catch(MyException const & ex)
29
+ {
30
+ throw Rice::Exception(rb_cMyException, "%s", ex.what());
31
+ }
32
+
33
+ Memory management. Handlers are created by the ModuleBase constructor. When the
34
+ module defines a new Ruby method, metadata is stored on the Ruby klass including
35
+ the exception handler. Since the metadata outlives the module, handlers are stored
36
+ using std::shared_ptr. Thus the Module (or its inherited children) can be destroyed
37
+ without corrupting the metadata references to the shared exception handler. */
38
+
39
+ class Exception_Handler
40
+ {
41
+ public:
42
+ Exception_Handler() = default;
43
+ virtual ~Exception_Handler() = default;
44
+
45
+ // Don't allow copying or assignment
46
+ Exception_Handler(const Exception_Handler& other) = delete;
47
+ Exception_Handler& operator=(const Exception_Handler& other) = delete;
48
+
49
+ virtual VALUE handle_exception() const = 0;
50
+ };
51
+
52
+ // The default exception handler just rethrows the exception. If there
53
+ // are other handlers in the chain, they will try to handle the rethrown
54
+ // exception.
55
+ class Default_Exception_Handler
56
+ : public Exception_Handler
57
+ {
58
+ public:
59
+ virtual VALUE handle_exception() const override;
60
+ };
61
+
62
+ // An exception handler that takes a functor as an argument. The
63
+ // functor should throw a Rice::Exception to handle the exception. If
64
+ // the functor does not handle the exception, the exception will be
65
+ // re-thrown.
66
+ template <typename Exception_T, typename Functor_T>
67
+ class Functor_Exception_Handler
68
+ : public Exception_Handler
69
+ {
70
+ public:
71
+ Functor_Exception_Handler(Functor_T handler,
72
+ std::shared_ptr<Exception_Handler> next_exception_handler);
73
+
74
+ virtual VALUE handle_exception() const override;
75
+
76
+ private:
77
+ Functor_T handler_;
78
+ std::shared_ptr<Exception_Handler> next_exception_handler_;
79
+ };
80
+ }
81
+ #endif // Rice__detail__Exception_Handler_defn__hpp_
@@ -1,93 +1,23 @@
1
- #ifndef Rice__detail__Iterator__hpp_
2
- #define Rice__detail__Iterator__hpp_
1
+ #ifndef Rice_Iterator__hpp_
2
+ #define Rice_Iterator__hpp_
3
3
 
4
- #include "method_data.hpp"
5
- #include "ruby.hpp"
6
- #include "../protect.hpp"
7
- #include "../Data_Object.hpp"
8
- #include "../Identifier.hpp"
9
-
10
- namespace Rice
11
- {
12
-
13
- namespace detail
14
- {
15
-
16
- class Iterator
17
- {
18
- public:
19
- virtual ~Iterator() { }
20
-
21
- virtual VALUE call_impl(VALUE self) = 0;
22
-
23
- static VALUE call(VALUE self)
24
- {
25
- VALUE data = (VALUE)method_data();
26
- Data_Object<Iterator> iterator(
27
- data,
28
- Data_Type<Iterator>());
29
- return iterator->call_impl(self);
30
- }
31
- };
32
-
33
- template<typename T, typename Iterator_T>
34
- class Iterator_Impl
35
- : public Iterator
4
+ namespace Rice::detail
36
5
  {
37
- public:
38
- Iterator_Impl(
39
- Iterator_T (T::*begin)(),
40
- Iterator_T (T::*end)(),
41
- Data_Type<T> data_type)
42
- : begin_(begin)
43
- , end_(end)
44
- , data_type_(data_type)
45
- {
46
- }
47
-
48
- virtual VALUE call_impl(VALUE self)
6
+ template<typename T, typename Iterator_T>
7
+ class Iterator
49
8
  {
50
- Data_Object<T> obj(self, data_type_);
51
- Iterator_T it = (*obj.*begin_)();
52
- Iterator_T end = (*obj.*end_)();
53
- for(; it != end; ++it)
54
- {
55
- Rice::protect(rb_yield, to_ruby(*it));
56
- }
57
- return self;
58
- }
59
-
60
- private:
61
- Iterator_T (T::*begin_)();
62
- Iterator_T (T::*end_)();
63
- Data_Type<T> data_type_;
64
- };
65
-
66
- template<typename T, typename Iterator_T>
67
- void define_iterator(
68
- Module klass,
69
- Identifier name,
70
- Iterator_T (T::*begin)(),
71
- Iterator_T (T::*end)())
72
- {
73
- Data_Type<Iterator> iterator_klass;
74
- Data_Object<Iterator> iterator(
75
- new Iterator_Impl<T, Iterator_T>(
76
- begin,
77
- end,
78
- Data_Type<T>(klass)),
79
- iterator_klass);
80
- define_method_with_data(
81
- klass,
82
- name,
83
- (RUBY_METHOD_FUNC)iterator->call,
84
- 0,
85
- iterator);
9
+ public:
10
+ static VALUE call(VALUE self);
11
+
12
+ public:
13
+ Iterator(Iterator_T(T::* begin)(), Iterator_T(T::* end)());
14
+ virtual ~Iterator() = default;
15
+ VALUE operator()(VALUE self);
16
+
17
+ private:
18
+ Iterator_T(T::* begin_)();
19
+ Iterator_T(T::* end_)();
20
+ };
86
21
  }
87
22
 
88
- } // namespace detail
89
-
90
- } // namespace Rice
91
-
92
- #endif // Rice__detail__Iterator__hpp_
93
-
23
+ #endif // Rice_Iterator__hpp_
@@ -0,0 +1,47 @@
1
+ #ifndef Rice_Iterator__ipp_
2
+ #define Rice_Iterator__ipp_
3
+
4
+ #include <iterator>
5
+ #include <functional>
6
+
7
+ #include "../Data_Object_defn.hpp"
8
+ #include "method_data.hpp"
9
+
10
+ namespace Rice::detail
11
+ {
12
+ template <typename T, typename Iterator_T>
13
+ inline Iterator<T, Iterator_T>::
14
+ Iterator(Iterator_T(T::* begin)(), Iterator_T(T::* end)()) :
15
+ begin_(begin), end_(end)
16
+ {
17
+ }
18
+
19
+ template<typename T, typename Iterator_T>
20
+ inline VALUE Iterator<T, Iterator_T>::
21
+ call(VALUE self)
22
+ {
23
+ using Iter_T = Iterator<T, Iterator_T>;
24
+ Iter_T* iterator = detail::MethodData::data<Iter_T*>();
25
+ return iterator->operator()(self);
26
+ }
27
+
28
+ template<typename T, typename Iterator_T>
29
+ inline VALUE Iterator<T, Iterator_T>::
30
+ operator()(VALUE self)
31
+ {
32
+ using Value_T = typename std::iterator_traits<Iterator_T>::value_type;
33
+
34
+ Data_Object<T> obj(self);
35
+ Iterator_T it = std::invoke(this->begin_, *obj);
36
+ Iterator_T end = std::invoke(this->end_, *obj);
37
+
38
+ for (; it != end; ++it)
39
+ {
40
+ protect(rb_yield, detail::To_Ruby<Value_T>().convert(*it));
41
+ }
42
+
43
+ return self;
44
+ }
45
+ }
46
+
47
+ #endif // Rice_Iterator__ipp_
@@ -0,0 +1,21 @@
1
+ #ifndef Rice__detail__Jump_Tag__hpp_
2
+ #define Rice__detail__Jump_Tag__hpp_
3
+
4
+ namespace Rice
5
+ {
6
+ //! A placeholder for Ruby longjmp data.
7
+ /*! When a Ruby exception is caught, the tag used for the longjmp is stored in
8
+ * a Jump_Tag, then later passed to rb_jump_tag() when there is no more
9
+ * C++ code to pass over.
10
+ */
11
+ struct Jump_Tag
12
+ {
13
+ //! Construct a Jump_Tag with tag t.
14
+ Jump_Tag(int t) : tag(t) {}
15
+
16
+ //! The tag being held.
17
+ int tag;
18
+ };
19
+ } // namespace Rice
20
+
21
+ #endif // Rice__detail__Jump_Tag__hpp_
@@ -0,0 +1,44 @@
1
+ #ifndef Rice__MethodInfo__hpp_
2
+ #define Rice__MethodInfo__hpp_
3
+
4
+ #include <vector>
5
+ #include "../Arg.hpp"
6
+ #include "../Return.hpp"
7
+
8
+ namespace Rice
9
+ {
10
+ class MethodInfo
11
+ {
12
+ public:
13
+ template <typename...Arg_Ts>
14
+ MethodInfo(size_t argCount, const Arg_Ts&...args);
15
+
16
+ /**
17
+ * Get the rb_scan_args format string for this
18
+ * list of arguments.
19
+ */
20
+ std::string formatString();
21
+
22
+ /**
23
+ * Add a defined Arg to this list of Arguments
24
+ */
25
+ void addArg(const Arg& arg);
26
+
27
+ Arg& arg(size_t pos);
28
+
29
+ // Iterator support
30
+ std::vector<Arg>::iterator begin();
31
+ std::vector<Arg>::iterator end();
32
+
33
+ Return returnInfo;
34
+
35
+ private:
36
+ template <typename Arg_T>
37
+ void processArg(const Arg_T& arg);
38
+
39
+ std::vector<Arg> args_;
40
+ };
41
+ }
42
+ #include "MethodInfo.ipp"
43
+
44
+ #endif // Rice__MethodInfo__hpp_
@@ -0,0 +1,78 @@
1
+ #include <sstream>
2
+ #include "from_ruby_defn.hpp"
3
+
4
+ namespace Rice
5
+ {
6
+ template <typename...Arg_Ts>
7
+ inline MethodInfo::MethodInfo(size_t argCount, const Arg_Ts&...args)
8
+ {
9
+ // Process the passed in arguments
10
+ (this->processArg(args), ...);
11
+
12
+ // Fill in any missing arguments
13
+ for (size_t i = this->args_.size(); i < argCount; i++)
14
+ {
15
+ Arg arg("arg_" + std::to_string(i));
16
+ this->args_.emplace_back(arg);
17
+ }
18
+
19
+ // TODO - so hacky but update the Arg positions
20
+ for (uint32_t i = 0; i < this->args_.size(); i++)
21
+ {
22
+ this->args_[i].position = i;
23
+ }
24
+ }
25
+
26
+ template <typename Arg_T>
27
+ inline void MethodInfo::processArg(const Arg_T& arg)
28
+ {
29
+ if constexpr (std::is_same_v<Arg_T, Arg>)
30
+ {
31
+ this->addArg(arg);
32
+ }
33
+ else
34
+ {
35
+ this->returnInfo = arg;
36
+ }
37
+ }
38
+
39
+ inline void MethodInfo::addArg(const Arg& arg)
40
+ {
41
+ this->args_.push_back(arg);
42
+ }
43
+
44
+ inline std::string MethodInfo::formatString()
45
+ {
46
+ size_t required = 0;
47
+ size_t optional = 0;
48
+
49
+ for (const Arg& arg : this->args_)
50
+ {
51
+ if (arg.hasDefaultValue())
52
+ {
53
+ optional++;
54
+ }
55
+ else
56
+ {
57
+ required++;
58
+ }
59
+ }
60
+
61
+ return std::to_string(required) + std::to_string(optional);
62
+ }
63
+
64
+ inline Arg& MethodInfo::arg(size_t pos)
65
+ {
66
+ return args_[pos];
67
+ }
68
+
69
+ inline std::vector<Arg>::iterator MethodInfo::begin()
70
+ {
71
+ return this->args_.begin();
72
+ }
73
+
74
+ inline std::vector<Arg>::iterator MethodInfo::end()
75
+ {
76
+ return this->args_.end();
77
+ }
78
+ }