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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +121 -0
- data/CONTRIBUTORS.md +19 -0
- data/Gemfile +3 -0
- data/README.md +44 -1025
- data/Rakefile +95 -12
- data/include/rice/rice.hpp +7766 -0
- data/lib/mkmf-rice.rb +127 -0
- data/lib/version.rb +3 -0
- data/rice/Address_Registration_Guard.ipp +75 -32
- data/rice/Address_Registration_Guard_defn.hpp +60 -56
- data/rice/Arg.hpp +80 -4
- data/rice/Arg.ipp +51 -0
- data/rice/Constructor.hpp +12 -14
- data/rice/Data_Object.ipp +234 -107
- data/rice/Data_Object_defn.hpp +77 -117
- data/rice/Data_Type.hpp +1 -2
- data/rice/Data_Type.ipp +251 -295
- data/rice/Data_Type_defn.hpp +175 -243
- data/rice/Director.hpp +11 -6
- data/rice/Enum.hpp +54 -104
- data/rice/Enum.ipp +104 -230
- data/rice/Exception.hpp +2 -8
- data/rice/Exception.ipp +65 -0
- data/rice/Exception_defn.hpp +46 -47
- data/rice/Identifier.hpp +28 -28
- data/rice/Identifier.ipp +23 -27
- data/rice/Return.hpp +39 -0
- data/rice/Return.ipp +33 -0
- data/rice/detail/Exception_Handler.ipp +22 -62
- data/rice/detail/Exception_Handler_defn.hpp +76 -91
- data/rice/detail/Iterator.hpp +18 -88
- data/rice/detail/Iterator.ipp +47 -0
- data/rice/detail/Jump_Tag.hpp +21 -0
- data/rice/detail/MethodInfo.hpp +44 -0
- data/rice/detail/MethodInfo.ipp +78 -0
- data/rice/detail/NativeAttribute.hpp +53 -0
- data/rice/detail/NativeAttribute.ipp +83 -0
- data/rice/detail/NativeFunction.hpp +69 -0
- data/rice/detail/NativeFunction.ipp +248 -0
- data/rice/detail/RubyFunction.hpp +39 -0
- data/rice/detail/RubyFunction.ipp +92 -0
- data/rice/detail/Type.hpp +29 -0
- data/rice/detail/Type.ipp +138 -0
- data/rice/detail/TypeRegistry.hpp +50 -0
- data/rice/detail/TypeRegistry.ipp +106 -0
- data/rice/detail/Wrapper.hpp +51 -0
- data/rice/detail/Wrapper.ipp +151 -0
- data/rice/detail/default_allocation_func.hpp +8 -19
- data/rice/detail/default_allocation_func.ipp +9 -8
- data/rice/detail/from_ruby.hpp +2 -37
- data/rice/detail/from_ruby.ipp +1020 -46
- data/rice/detail/from_ruby_defn.hpp +38 -0
- data/rice/detail/function_traits.hpp +124 -0
- data/rice/detail/method_data.hpp +23 -15
- data/rice/detail/method_data.ipp +53 -0
- data/rice/detail/rice_traits.hpp +116 -0
- data/rice/detail/ruby.hpp +9 -46
- data/rice/detail/to_ruby.hpp +3 -17
- data/rice/detail/to_ruby.ipp +409 -31
- data/rice/detail/to_ruby_defn.hpp +48 -0
- data/rice/forward_declares.ipp +82 -0
- data/rice/global_function.hpp +16 -20
- data/rice/global_function.ipp +8 -17
- data/rice/rice.hpp +59 -0
- data/rice/ruby_mark.hpp +5 -3
- data/rice/ruby_try_catch.hpp +4 -4
- data/rice/stl.hpp +11 -0
- data/sample/callbacks/extconf.rb +3 -0
- data/sample/callbacks/sample_callbacks.cpp +10 -13
- data/sample/enum/extconf.rb +3 -0
- data/sample/enum/sample_enum.cpp +3 -17
- data/sample/enum/test.rb +2 -2
- data/sample/inheritance/animals.cpp +8 -24
- data/sample/inheritance/extconf.rb +3 -0
- data/sample/inheritance/test.rb +1 -1
- data/sample/map/extconf.rb +3 -0
- data/sample/map/map.cpp +10 -18
- data/sample/map/test.rb +1 -1
- data/test/embed_ruby.cpp +18 -5
- data/test/ext/t1/extconf.rb +3 -0
- data/test/ext/t1/t1.cpp +1 -3
- data/test/ext/t2/extconf.rb +3 -0
- data/test/ext/t2/t2.cpp +1 -1
- data/test/extconf.rb +23 -0
- data/test/ruby/test_callbacks_sample.rb +28 -0
- data/test/ruby/test_multiple_extensions.rb +18 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
- data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
- data/test/test_Address_Registration_Guard.cpp +23 -10
- data/test/test_Array.cpp +129 -73
- data/test/test_Attribute.cpp +147 -0
- data/test/test_Builtin_Object.cpp +34 -14
- data/test/test_Class.cpp +149 -275
- data/test/test_Constructor.cpp +10 -9
- data/test/test_Data_Object.cpp +133 -192
- data/test/test_Data_Type.cpp +322 -252
- data/test/test_Director.cpp +54 -41
- data/test/test_Enum.cpp +228 -103
- data/test/test_Exception.cpp +5 -6
- data/test/test_Hash.cpp +31 -30
- data/test/test_Identifier.cpp +4 -5
- data/test/test_Inheritance.cpp +221 -0
- data/test/test_Iterator.cpp +161 -0
- data/test/test_Jump_Tag.cpp +1 -1
- data/test/test_Keep_Alive.cpp +161 -0
- data/test/test_Memory_Management.cpp +2 -4
- data/test/test_Module.cpp +167 -110
- data/test/test_Object.cpp +41 -21
- data/test/test_Ownership.cpp +275 -0
- data/test/test_Self.cpp +205 -0
- data/test/test_Stl_Optional.cpp +90 -0
- data/test/test_Stl_Pair.cpp +144 -0
- data/test/test_Stl_SmartPointer.cpp +200 -0
- data/test/test_Stl_String.cpp +74 -0
- data/test/test_Stl_Vector.cpp +652 -0
- data/test/test_String.cpp +1 -2
- data/test/test_Struct.cpp +29 -39
- data/test/test_Symbol.cpp +1 -2
- data/test/test_To_From_Ruby.cpp +249 -285
- data/test/test_global_functions.cpp +39 -19
- data/test/unittest.hpp +0 -4
- metadata +63 -139
- data/Doxyfile +0 -2268
- data/Makefile.am +0 -26
- data/Makefile.in +0 -931
- data/README.mingw +0 -8
- data/aclocal.m4 +0 -1085
- data/ax_cxx_compile_stdcxx.m4 +0 -951
- data/bootstrap +0 -8
- data/config.guess +0 -1421
- data/config.sub +0 -1807
- data/configure +0 -7792
- data/configure.ac +0 -55
- data/depcomp +0 -791
- data/doxygen.ac +0 -314
- data/doxygen.am +0 -186
- data/extconf.rb +0 -70
- data/install-sh +0 -501
- data/missing +0 -215
- data/post-autoconf.rb +0 -22
- data/post-automake.rb +0 -28
- data/rice/Address_Registration_Guard.cpp +0 -22
- data/rice/Arg_impl.hpp +0 -129
- data/rice/Arg_operators.cpp +0 -21
- data/rice/Arg_operators.hpp +0 -19
- data/rice/Array.hpp +0 -214
- data/rice/Array.ipp +0 -256
- data/rice/Builtin_Object.hpp +0 -8
- data/rice/Builtin_Object.ipp +0 -50
- data/rice/Builtin_Object_defn.hpp +0 -50
- data/rice/Class.cpp +0 -57
- data/rice/Class.hpp +0 -8
- data/rice/Class.ipp +0 -6
- data/rice/Class_defn.hpp +0 -84
- data/rice/Data_Type.cpp +0 -54
- data/rice/Data_Type_fwd.hpp +0 -12
- data/rice/Director.cpp +0 -13
- data/rice/Exception.cpp +0 -54
- data/rice/Exception_Base.hpp +0 -8
- data/rice/Exception_Base.ipp +0 -13
- data/rice/Exception_Base_defn.hpp +0 -27
- data/rice/Hash.hpp +0 -230
- data/rice/Hash.ipp +0 -329
- data/rice/Identifier.cpp +0 -8
- data/rice/Jump_Tag.hpp +0 -24
- data/rice/Makefile.am +0 -121
- data/rice/Makefile.in +0 -884
- data/rice/Module.cpp +0 -84
- data/rice/Module.hpp +0 -8
- data/rice/Module.ipp +0 -6
- data/rice/Module_defn.hpp +0 -88
- data/rice/Module_impl.hpp +0 -281
- data/rice/Module_impl.ipp +0 -345
- data/rice/Object.cpp +0 -169
- data/rice/Object.hpp +0 -8
- data/rice/Object.ipp +0 -33
- data/rice/Object_defn.hpp +0 -214
- data/rice/Require_Guard.hpp +0 -21
- data/rice/String.cpp +0 -89
- data/rice/String.hpp +0 -91
- data/rice/Struct.cpp +0 -117
- data/rice/Struct.hpp +0 -162
- data/rice/Struct.ipp +0 -26
- data/rice/Symbol.cpp +0 -25
- data/rice/Symbol.hpp +0 -66
- data/rice/Symbol.ipp +0 -44
- data/rice/config.hpp +0 -47
- data/rice/config.hpp.in +0 -46
- data/rice/detail/Arguments.hpp +0 -118
- data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
- data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
- data/rice/detail/Caster.hpp +0 -103
- data/rice/detail/Not_Copyable.hpp +0 -25
- data/rice/detail/Wrapped_Function.hpp +0 -33
- data/rice/detail/cfp.hpp +0 -24
- data/rice/detail/cfp.ipp +0 -51
- data/rice/detail/check_ruby_type.cpp +0 -27
- data/rice/detail/check_ruby_type.hpp +0 -23
- data/rice/detail/creation_funcs.hpp +0 -37
- data/rice/detail/creation_funcs.ipp +0 -36
- data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
- data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
- data/rice/detail/demangle.cpp +0 -56
- data/rice/detail/demangle.hpp +0 -19
- data/rice/detail/env.hpp +0 -11
- data/rice/detail/method_data.cpp +0 -92
- data/rice/detail/node.hpp +0 -13
- data/rice/detail/protect.cpp +0 -29
- data/rice/detail/protect.hpp +0 -34
- data/rice/detail/ruby_version_code.hpp +0 -6
- data/rice/detail/ruby_version_code.hpp.in +0 -6
- data/rice/detail/st.hpp +0 -22
- data/rice/detail/win32.hpp +0 -16
- data/rice/detail/wrap_function.hpp +0 -66
- data/rice/protect.hpp +0 -38
- data/rice/protect.ipp +0 -1134
- data/rice/rubypp.rb +0 -97
- data/rice/to_from_ruby.hpp +0 -8
- data/rice/to_from_ruby.ipp +0 -418
- data/rice/to_from_ruby_defn.hpp +0 -70
- data/ruby.ac +0 -135
- data/ruby/Makefile.am +0 -1
- data/ruby/Makefile.in +0 -628
- data/ruby/lib/Makefile.am +0 -3
- data/ruby/lib/Makefile.in +0 -506
- data/ruby/lib/mkmf-rice.rb.in +0 -217
- data/ruby/lib/version.rb +0 -3
- data/sample/Makefile.am +0 -53
- data/sample/Makefile.in +0 -495
- data/test/Makefile.am +0 -73
- data/test/Makefile.in +0 -1219
- data/test/ext/Makefile.am +0 -41
- data/test/ext/Makefile.in +0 -483
- 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
|
5
|
-
#
|
4
|
+
#include <memory>
|
5
|
+
#include "ruby.hpp"
|
6
6
|
|
7
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
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_
|
data/rice/detail/Iterator.hpp
CHANGED
@@ -1,93 +1,23 @@
|
|
1
|
-
#ifndef
|
2
|
-
#define
|
1
|
+
#ifndef Rice_Iterator__hpp_
|
2
|
+
#define Rice_Iterator__hpp_
|
3
3
|
|
4
|
-
|
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
|
-
|
38
|
-
|
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
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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
|
-
|
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
|
+
}
|