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
data/rice/Arg.ipp
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
namespace Rice
|
2
|
+
{
|
3
|
+
inline Arg::Arg(std::string name) : name(name)
|
4
|
+
{
|
5
|
+
}
|
6
|
+
|
7
|
+
template<typename Arg_Type>
|
8
|
+
inline Arg& Arg::operator=(Arg_Type val)
|
9
|
+
{
|
10
|
+
this->defaultValue_ = val;
|
11
|
+
return *this;
|
12
|
+
}
|
13
|
+
|
14
|
+
//! Check if this Arg has a default value associated with it
|
15
|
+
inline bool Arg::hasDefaultValue() const
|
16
|
+
{
|
17
|
+
return this->defaultValue_.has_value();
|
18
|
+
}
|
19
|
+
|
20
|
+
//! Return a reference to the default value associated with this Arg
|
21
|
+
/*! \return the type saved to this Arg
|
22
|
+
*/
|
23
|
+
template<typename Arg_Type>
|
24
|
+
inline Arg_Type& Arg::defaultValue()
|
25
|
+
{
|
26
|
+
return std::any_cast<Arg_Type&>(this->defaultValue_);
|
27
|
+
}
|
28
|
+
|
29
|
+
inline Arg& Arg::keepAlive()
|
30
|
+
{
|
31
|
+
this->isKeepAlive = true;
|
32
|
+
return *this;
|
33
|
+
}
|
34
|
+
|
35
|
+
inline Arg& Arg::isValue()
|
36
|
+
{
|
37
|
+
isValue_ = true;
|
38
|
+
return *this;
|
39
|
+
}
|
40
|
+
|
41
|
+
inline bool Arg::getIsValue()
|
42
|
+
{
|
43
|
+
return isValue_;
|
44
|
+
}
|
45
|
+
|
46
|
+
// Function to overload the, operator
|
47
|
+
inline Arg Arg::operator,(const Arg& other)
|
48
|
+
{
|
49
|
+
throw std::runtime_error("The Arg class no longer supports the comma operator, please remove the surounding parentheses");
|
50
|
+
}
|
51
|
+
} // Rice
|
data/rice/Constructor.hpp
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
#ifndef Rice__Constructor__hpp_
|
2
2
|
#define Rice__Constructor__hpp_
|
3
3
|
|
4
|
-
|
5
|
-
#
|
6
|
-
|
7
|
-
#include "to_from_ruby_defn.hpp"
|
4
|
+
#include "detail/Wrapper.hpp"
|
5
|
+
#include "cpp_api/Object_defn.hpp"
|
8
6
|
|
9
7
|
namespace Rice
|
10
8
|
{
|
@@ -21,27 +19,27 @@ namespace Rice
|
|
21
19
|
*
|
22
20
|
* For more information, see Rice::Data_Type::define_constructor.
|
23
21
|
*/
|
24
|
-
template<typename T, typename
|
22
|
+
template<typename T, typename...Arg_Ts>
|
25
23
|
class Constructor
|
26
24
|
{
|
27
25
|
public:
|
28
|
-
static void construct(
|
26
|
+
static void construct(VALUE self, Arg_Ts...args)
|
29
27
|
{
|
30
|
-
|
28
|
+
T* data = new T(args...);
|
29
|
+
detail::replace<T>(self, Data_Type<T>::rb_type(), data, true);
|
31
30
|
}
|
32
31
|
};
|
33
32
|
|
34
33
|
//! Special-case Constructor used when defining Directors.
|
35
|
-
template<typename T, typename
|
36
|
-
class Constructor<T, Object,
|
34
|
+
template<typename T, typename...Arg_Ts>
|
35
|
+
class Constructor<T, Object, Arg_Ts...>
|
37
36
|
{
|
38
37
|
public:
|
39
|
-
static void construct(Object self,
|
38
|
+
static void construct(Object self, Arg_Ts...args)
|
40
39
|
{
|
41
|
-
|
40
|
+
T* data = new T(self, args...);
|
41
|
+
detail::replace<T>(self.value(), Data_Type<T>::rb_type(), data, true);
|
42
42
|
}
|
43
43
|
};
|
44
44
|
}
|
45
|
-
|
46
|
-
#endif
|
47
|
-
|
45
|
+
#endif // Rice__Constructor__hpp_
|
data/rice/Data_Object.ipp
CHANGED
@@ -1,133 +1,260 @@
|
|
1
1
|
#ifndef Rice__Data_Object__ipp_
|
2
2
|
#define Rice__Data_Object__ipp_
|
3
3
|
|
4
|
-
#include "
|
5
|
-
#include "protect.hpp"
|
4
|
+
#include "Data_Type_defn.hpp"
|
6
5
|
|
7
6
|
#include <algorithm>
|
8
7
|
|
9
|
-
template<typename T>
|
10
|
-
const typename Rice::Default_Mark_Function<T>::Ruby_Data_Func
|
11
|
-
Rice::Default_Mark_Function<T>::mark = ruby_mark<T>;
|
12
|
-
|
13
8
|
namespace Rice
|
14
9
|
{
|
10
|
+
template <typename T>
|
11
|
+
Exception create_type_exception(VALUE value)
|
12
|
+
{
|
13
|
+
return Exception(rb_eTypeError, "Wrong argument type. Expected: %s. Received: %s.",
|
14
|
+
detail::protect(rb_class2name, Data_Type<T>::klass().value()),
|
15
|
+
detail::protect(rb_obj_classname, value));
|
16
|
+
}
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
template<typename T>
|
19
|
+
inline Data_Object<T>::Data_Object(T& data, bool isOwner, Class klass)
|
20
|
+
{
|
21
|
+
VALUE value = detail::wrap(klass, Data_Type<T>::rb_type(), data, isOwner);
|
22
|
+
this->set_value(value);
|
23
|
+
}
|
18
24
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
return Data_Wrap_Struct(klass, mark, free, obj);
|
26
|
-
}
|
25
|
+
template<typename T>
|
26
|
+
inline Data_Object<T>::Data_Object(T* data, bool isOwner, Class klass)
|
27
|
+
{
|
28
|
+
VALUE value = detail::wrap(klass, Data_Type<T>::rb_type(), data, isOwner);
|
29
|
+
this->set_value(value);
|
30
|
+
}
|
27
31
|
|
28
|
-
template<typename T>
|
29
|
-
inline
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
{
|
35
|
-
// We cast to obj void* here before passing to Data_Wrap_Struct,
|
36
|
-
// becuase otherwise compilation will fail if obj is const. It's safe
|
37
|
-
// to do this, because unwrap() will always add the const back when
|
38
|
-
// the object is unwrapped.
|
39
|
-
return Rice::protect(data_wrap_struct,
|
40
|
-
klass,
|
41
|
-
reinterpret_cast<RUBY_DATA_FUNC>(mark),
|
42
|
-
reinterpret_cast<RUBY_DATA_FUNC>(free),
|
43
|
-
(void *)obj);
|
44
|
-
}
|
32
|
+
template<typename T>
|
33
|
+
inline Data_Object<T>::Data_Object(Object value) : Object(value)
|
34
|
+
{
|
35
|
+
Data_Type<T> klass;
|
36
|
+
check_ruby_type(value);
|
37
|
+
}
|
45
38
|
|
46
|
-
template<typename T>
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
39
|
+
template<typename T>
|
40
|
+
template<typename U>
|
41
|
+
inline Data_Object<T>::Data_Object(Object value) : Object(value)
|
42
|
+
{
|
43
|
+
check_ruby_type(value);
|
44
|
+
}
|
45
|
+
|
46
|
+
template<typename T>
|
47
|
+
inline void Data_Object<T>::check_ruby_type(VALUE value)
|
48
|
+
{
|
49
|
+
if (rb_obj_is_kind_of(value, Data_Type<T>::klass()) == Qfalse)
|
50
|
+
{
|
51
|
+
throw create_type_exception<T>(value);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
template<typename T>
|
56
|
+
inline T& Data_Object<T>::operator*() const
|
57
|
+
{
|
58
|
+
return *this->get();
|
59
|
+
}
|
60
|
+
|
61
|
+
template<typename T>
|
62
|
+
inline T* Data_Object<T>::operator->() const
|
63
|
+
{
|
64
|
+
return this->get();
|
65
|
+
}
|
66
|
+
|
67
|
+
template<typename T>
|
68
|
+
inline T* Data_Object<T>::get() const
|
69
|
+
{
|
70
|
+
if (this->value() == Qnil)
|
71
|
+
{
|
72
|
+
return nullptr;
|
73
|
+
}
|
74
|
+
else
|
75
|
+
{
|
76
|
+
return detail::unwrap<T>(this->value(), Data_Type<T>::rb_type());
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
template<typename T>
|
81
|
+
inline T* Data_Object<T>::from_ruby(VALUE value)
|
82
|
+
{
|
83
|
+
if (Data_Type<T>::is_descendant(value))
|
84
|
+
{
|
85
|
+
return detail::unwrap<T>(value, Data_Type<T>::rb_type());
|
86
|
+
}
|
87
|
+
else
|
88
|
+
{
|
89
|
+
throw create_type_exception<T>(value);
|
90
|
+
}
|
91
|
+
}
|
51
92
|
}
|
52
93
|
|
53
|
-
|
54
|
-
inline T * unwrap(VALUE value)
|
94
|
+
namespace Rice::detail
|
55
95
|
{
|
56
|
-
T
|
57
|
-
|
58
|
-
|
59
|
-
|
96
|
+
template<typename T>
|
97
|
+
class To_Ruby
|
98
|
+
{
|
99
|
+
public:
|
100
|
+
VALUE convert(T& data)
|
101
|
+
{
|
102
|
+
// Get the ruby typeinfo
|
103
|
+
std::pair<VALUE, rb_data_type_t*> rubyTypeInfo = detail::TypeRegistry::figureType<T>(data);
|
60
104
|
|
61
|
-
|
105
|
+
// We always take ownership of data passed by value (yes the parameter is T& but the template
|
106
|
+
// matched <typename T> thus we have to tell wrap to copy the reference we are sending to it
|
107
|
+
return detail::wrap(rubyTypeInfo.first, rubyTypeInfo.second, data, true);
|
108
|
+
}
|
109
|
+
};
|
62
110
|
|
63
|
-
|
111
|
+
template <typename T>
|
112
|
+
class To_Ruby<T&>
|
113
|
+
{
|
114
|
+
public:
|
115
|
+
To_Ruby() = default;
|
64
116
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
T * obj,
|
69
|
-
VALUE klass,
|
70
|
-
Ruby_Data_Func mark_func,
|
71
|
-
Ruby_Data_Func free_func)
|
72
|
-
: Object(detail::wrap(klass, mark_func, free_func, obj))
|
73
|
-
, obj_(obj)
|
74
|
-
{
|
75
|
-
}
|
117
|
+
explicit To_Ruby(Return * returnInfo) : returnInfo_(returnInfo)
|
118
|
+
{
|
119
|
+
}
|
76
120
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
, obj_(detail::unwrap<T>(value))
|
83
|
-
{
|
84
|
-
Data_Type<T> klass;
|
85
|
-
check_cpp_type(klass);
|
86
|
-
detail::check_ruby_type(value, klass, true);
|
87
|
-
}
|
121
|
+
VALUE convert(T& data)
|
122
|
+
{
|
123
|
+
// Note that T could be a pointer or reference to a base class while data is in fact a
|
124
|
+
// child class. Lookup the correct type so we return an instance of the correct Ruby class
|
125
|
+
std::pair<VALUE, rb_data_type_t*> rubyTypeInfo = detail::TypeRegistry::figureType<T>(data);
|
88
126
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
Data_Object(
|
93
|
-
Object value,
|
94
|
-
Data_Type<U> const & klass)
|
95
|
-
: Object(value)
|
96
|
-
, obj_(detail::unwrap<T>(value))
|
97
|
-
{
|
98
|
-
check_cpp_type(klass);
|
99
|
-
detail::check_ruby_type(value, klass, true);
|
100
|
-
}
|
127
|
+
bool isOwner = this->returnInfo_ && this->returnInfo_->isOwner();
|
128
|
+
return detail::wrap(rubyTypeInfo.first, rubyTypeInfo.second, data, isOwner);
|
129
|
+
}
|
101
130
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
: Object(other.value())
|
106
|
-
, obj_(other.obj_)
|
107
|
-
{
|
108
|
-
}
|
131
|
+
private:
|
132
|
+
Return* returnInfo_ = nullptr;
|
133
|
+
};
|
109
134
|
|
110
|
-
template<typename T>
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
std::swap(obj_, ref.obj_);
|
116
|
-
Object::swap(ref);
|
117
|
-
}
|
135
|
+
template <typename T>
|
136
|
+
class To_Ruby<T*>
|
137
|
+
{
|
138
|
+
public:
|
139
|
+
To_Ruby() = default;
|
118
140
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
{
|
123
|
-
}
|
141
|
+
explicit To_Ruby(Return* returnInfo) : returnInfo_(returnInfo)
|
142
|
+
{
|
143
|
+
}
|
124
144
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
{
|
129
|
-
|
130
|
-
|
145
|
+
VALUE convert(const T* data)
|
146
|
+
{
|
147
|
+
if (data)
|
148
|
+
{
|
149
|
+
// Note that T could be a pointer or reference to a base class while data is in fact a
|
150
|
+
// child class. Lookup the correct type so we return an instance of the correct Ruby class
|
151
|
+
std::pair<VALUE, rb_data_type_t*> rubyTypeInfo = detail::TypeRegistry::figureType(*data);
|
152
|
+
bool isOwner = this->returnInfo_ && this->returnInfo_->isOwner();
|
153
|
+
return detail::wrap(rubyTypeInfo.first, rubyTypeInfo.second, data, isOwner);
|
154
|
+
}
|
155
|
+
else
|
156
|
+
{
|
157
|
+
return Qnil;
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
private:
|
162
|
+
Return* returnInfo_ = nullptr;
|
163
|
+
};
|
164
|
+
|
165
|
+
template<typename T>
|
166
|
+
class To_Ruby<Data_Object<T>>
|
167
|
+
{
|
168
|
+
public:
|
169
|
+
VALUE convert(const Object& x)
|
170
|
+
{
|
171
|
+
return x.value();
|
172
|
+
}
|
173
|
+
};
|
174
|
+
|
175
|
+
template <typename T>
|
176
|
+
class From_Ruby
|
177
|
+
{
|
178
|
+
public:
|
179
|
+
From_Ruby() = default;
|
180
|
+
|
181
|
+
explicit From_Ruby(Arg * arg) : arg_(arg)
|
182
|
+
{
|
183
|
+
}
|
184
|
+
|
185
|
+
T convert(VALUE value)
|
186
|
+
{
|
187
|
+
using Intrinsic_T = intrinsic_type<T>;
|
131
188
|
|
132
|
-
|
189
|
+
if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
|
190
|
+
{
|
191
|
+
return this->arg_->template defaultValue<Intrinsic_T>();
|
192
|
+
}
|
193
|
+
else
|
194
|
+
{
|
195
|
+
return *Data_Object<Intrinsic_T>::from_ruby(value);
|
196
|
+
}
|
197
|
+
}
|
133
198
|
|
199
|
+
private:
|
200
|
+
Arg* arg_ = nullptr;
|
201
|
+
};
|
202
|
+
|
203
|
+
template<typename T>
|
204
|
+
class From_Ruby<T&>
|
205
|
+
{
|
206
|
+
public:
|
207
|
+
From_Ruby() = default;
|
208
|
+
|
209
|
+
explicit From_Ruby(Arg * arg) : arg_(arg)
|
210
|
+
{
|
211
|
+
}
|
212
|
+
|
213
|
+
T& convert(VALUE value)
|
214
|
+
{
|
215
|
+
using Intrinsic_T = intrinsic_type<T>;
|
216
|
+
|
217
|
+
if (value == Qnil && this->arg_ && this->arg_->hasDefaultValue())
|
218
|
+
{
|
219
|
+
return this->arg_->template defaultValue<Intrinsic_T>();
|
220
|
+
}
|
221
|
+
else
|
222
|
+
{
|
223
|
+
return *Data_Object<Intrinsic_T>::from_ruby(value);
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
private:
|
228
|
+
Arg* arg_ = nullptr;
|
229
|
+
};
|
230
|
+
|
231
|
+
template<typename T>
|
232
|
+
class From_Ruby<T*>
|
233
|
+
{
|
234
|
+
public:
|
235
|
+
T* convert(VALUE value)
|
236
|
+
{
|
237
|
+
using Intrinsic_T = intrinsic_type<T>;
|
238
|
+
|
239
|
+
if (value == Qnil)
|
240
|
+
{
|
241
|
+
return nullptr;
|
242
|
+
}
|
243
|
+
else
|
244
|
+
{
|
245
|
+
return Data_Object<Intrinsic_T>::from_ruby(value);
|
246
|
+
}
|
247
|
+
}
|
248
|
+
};
|
249
|
+
|
250
|
+
template<typename T>
|
251
|
+
class From_Ruby<Data_Object<T>>
|
252
|
+
{
|
253
|
+
public:
|
254
|
+
static Data_Object<T> convert(VALUE value)
|
255
|
+
{
|
256
|
+
return Data_Object<T>(value);
|
257
|
+
}
|
258
|
+
};
|
259
|
+
}
|
260
|
+
#endif // Rice__Data_Object__ipp_
|