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
@@ -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
+ }