rice 3.0.0 → 4.0.3

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 (238) 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/include/rice/stl.hpp +1113 -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 +12 -14
  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 +11 -6
  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 -46
  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 +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  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/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. data/test/test_rice.rb +0 -45
data/rice/Return.hpp ADDED
@@ -0,0 +1,39 @@
1
+ #ifndef Rice__Return__hpp_
2
+ #define Rice__Return__hpp_
3
+
4
+ #include <any>
5
+
6
+ namespace Rice
7
+ {
8
+ //! Helper for defining Return argument of a method
9
+
10
+ class Return
11
+ {
12
+ public:
13
+ //! Specifies Ruby should take ownership of the returned value
14
+ Return& takeOwnership();
15
+
16
+ //! Does Ruby own the returned value?
17
+ bool isOwner();
18
+
19
+ //! Specifies the returned value is a Ruby value
20
+ Return& isValue();
21
+
22
+ //! Is the returned value a Ruby value?
23
+ bool getIsValue();
24
+
25
+ //! Tell the returned object to keep alive the receving object
26
+ Return& keepAlive();
27
+
28
+ public:
29
+ bool isKeepAlive = false;
30
+
31
+ private:
32
+ bool isOwner_ = false;
33
+ bool isValue_ = false;
34
+ };
35
+ } // Rice
36
+
37
+ #include "Return.ipp"
38
+
39
+ #endif // Rice__Return__hpp_
data/rice/Return.ipp ADDED
@@ -0,0 +1,33 @@
1
+ #include <any>
2
+ #include <string>
3
+
4
+ namespace Rice
5
+ {
6
+ inline Return& Return::takeOwnership()
7
+ {
8
+ this->isOwner_ = true;
9
+ return *this;
10
+ }
11
+
12
+ inline bool Return::isOwner()
13
+ {
14
+ return this->isOwner_;
15
+ }
16
+
17
+ inline Return& Return::isValue()
18
+ {
19
+ this->isValue_ = true;
20
+ return *this;
21
+ }
22
+
23
+ inline bool Return::getIsValue()
24
+ {
25
+ return this->isValue_;
26
+ }
27
+
28
+ inline Return& Return::keepAlive()
29
+ {
30
+ this->isKeepAlive = true;
31
+ return *this;
32
+ }
33
+ } // Rice
@@ -1,68 +1,28 @@
1
- #include "../Data_Type_defn.hpp"
2
-
3
- inline
4
- Rice::detail::Exception_Handler::
5
- Exception_Handler(
6
- Data_Object<Exception_Handler> next_exception_handler)
7
- : next_exception_handler_(next_exception_handler)
8
- , next_exception_handler_guard_(&next_exception_handler_)
9
- {
10
- }
11
-
12
- inline
13
- Rice::detail::Exception_Handler::
14
- ~Exception_Handler()
15
- {
16
- }
17
-
18
- inline
19
- VALUE
20
- Rice::detail::Exception_Handler::
21
- call_next_exception_handler() const
22
- {
23
- return next_exception_handler_->handle_exception();
24
- }
25
-
26
- inline Rice::detail::Default_Exception_Handler::
27
- Default_Exception_Handler()
28
- : Exception_Handler(
29
- Data_Object<Exception_Handler>(0, rb_cObject))
30
- {
31
- }
32
-
33
- inline
34
- VALUE
35
- Rice::detail::Default_Exception_Handler::
36
- handle_exception() const
1
+ namespace Rice::detail
37
2
  {
38
- throw;
39
- }
40
-
41
- template <typename Exception_T, typename Functor_T>
42
- inline
43
- Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::
44
- Functor_Exception_Handler(
45
- Functor_T handler,
46
- Data_Object<Exception_Handler> next_exception_handler)
47
- : Exception_Handler(next_exception_handler)
48
- , handler_(handler)
49
- {
50
- }
51
-
52
- template <typename Exception_T, typename Functor_T>
53
- inline
54
- VALUE
55
- Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::
56
- handle_exception() const
57
- {
58
- try
3
+ inline VALUE Rice::detail::Default_Exception_Handler::handle_exception() const
59
4
  {
60
- return call_next_exception_handler();
5
+ throw;
61
6
  }
62
- catch(Exception_T const & ex)
7
+
8
+ template <typename Exception_T, typename Functor_T>
9
+ inline Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::
10
+ Functor_Exception_Handler(Functor_T handler, std::shared_ptr<Exception_Handler> next_exception_handler)
11
+ : handler_(handler), next_exception_handler_(next_exception_handler)
63
12
  {
64
- handler_(ex);
65
- throw;
66
13
  }
67
- }
68
14
 
15
+ template <typename Exception_T, typename Functor_T>
16
+ inline VALUE Rice::detail::Functor_Exception_Handler<Exception_T, Functor_T>::handle_exception() const
17
+ {
18
+ try
19
+ {
20
+ return this->next_exception_handler_->handle_exception();
21
+ }
22
+ catch (Exception_T const& ex)
23
+ {
24
+ handler_(ex);
25
+ throw;
26
+ }
27
+ }
28
+ }
@@ -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
+ }
@@ -0,0 +1,53 @@
1
+ #ifndef Rice__detail__Native_Attribute__hpp_
2
+ #define Rice__detail__Native_Attribute__hpp_
3
+
4
+ #include "ruby.hpp"
5
+ #include "Exception_Handler_defn.hpp"
6
+ #include "MethodInfo.hpp"
7
+
8
+ namespace Rice
9
+ {
10
+ enum class AttrAccess
11
+ {
12
+ ReadWrite,
13
+ Read,
14
+ Write
15
+ };
16
+
17
+ namespace detail
18
+ {
19
+ template<typename Return_T, typename Attr_T, typename Self_T = void>
20
+ class NativeAttribute
21
+ {
22
+ public:
23
+ using Native_Return_T = Return_T;
24
+
25
+ // Static member functions that Ruby calls
26
+ static VALUE get(VALUE self);
27
+ static VALUE set(VALUE self, VALUE value);
28
+
29
+ public:
30
+ NativeAttribute(Attr_T attr, AttrAccess access = AttrAccess::ReadWrite);
31
+
32
+ // Invokes the wrapped function
33
+ VALUE read(VALUE self);
34
+ VALUE write(VALUE self, VALUE value);
35
+
36
+ private:
37
+ Attr_T attr_;
38
+ AttrAccess access_;
39
+ };
40
+
41
+ // A plain function or static member call
42
+ template<typename T>
43
+ auto* Make_Native_Attribute(T* attr, AttrAccess access);
44
+
45
+ // Lambda function that does not take Self as first parameter
46
+ template<typename Class_T, typename T>
47
+ auto* Make_Native_Attribute(T Class_T::* attr, AttrAccess access);
48
+ } // detail
49
+ } // Rice
50
+
51
+ #include "NativeAttribute.ipp"
52
+
53
+ #endif // Rice__detail__Native_Attribute__hpp_