rice 3.0.0 → 4.0.0

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