rice 2.1.3 → 4.0.2
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/COPYING +2 -2
- data/Gemfile +3 -0
- data/README.md +45 -1028
- data/Rakefile +95 -12
- data/include/rice/rice.hpp +7766 -0
- data/include/rice/stl.hpp +1113 -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 +30 -376
- 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 +14 -9
- 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 -50
- 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 +6 -0
- data/sample/callbacks/sample_callbacks.cpp +35 -0
- data/sample/callbacks/test.rb +28 -0
- 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 +34 -0
- data/test/embed_ruby.hpp +4 -0
- 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 +25 -11
- data/test/test_Array.cpp +131 -74
- data/test/test_Attribute.cpp +147 -0
- data/test/test_Builtin_Object.cpp +36 -15
- data/test/test_Class.cpp +151 -276
- data/test/test_Constructor.cpp +10 -9
- data/test/test_Data_Object.cpp +135 -193
- data/test/test_Data_Type.cpp +323 -252
- data/test/test_Director.cpp +56 -42
- data/test/test_Enum.cpp +230 -104
- data/test/test_Exception.cpp +7 -7
- data/test/test_Hash.cpp +33 -31
- data/test/test_Identifier.cpp +6 -6
- 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 +4 -5
- data/test/test_Module.cpp +169 -111
- data/test/test_Object.cpp +51 -19
- 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 +3 -3
- data/test/test_Struct.cpp +31 -40
- data/test/test_Symbol.cpp +3 -3
- data/test/test_To_From_Ruby.cpp +283 -218
- data/test/test_global_functions.cpp +41 -20
- data/test/unittest.cpp +34 -8
- data/test/unittest.hpp +0 -4
- metadata +121 -136
- data/Doxyfile +0 -2268
- data/Makefile.am +0 -26
- data/Makefile.in +0 -923
- data/README.mingw +0 -8
- data/aclocal.m4 +0 -1088
- data/bootstrap +0 -8
- data/check_stdcxx_11.ac +0 -103
- data/config.guess +0 -1421
- data/config.sub +0 -1807
- data/configure +0 -7367
- data/configure.ac +0 -55
- data/depcomp +0 -791
- data/doxygen.ac +0 -314
- data/doxygen.am +0 -186
- data/extconf.rb +0 -69
- 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 -83
- 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 -59
- 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 -227
- data/rice/Hash.ipp +0 -329
- data/rice/Identifier.cpp +0 -8
- data/rice/Jump_Tag.hpp +0 -24
- data/rice/Makefile.am +0 -125
- data/rice/Makefile.in +0 -888
- 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 -19
- data/rice/Object_defn.hpp +0 -191
- data/rice/Require_Guard.hpp +0 -21
- data/rice/String.cpp +0 -94
- 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 -3694
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
- 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 -86
- data/rice/detail/node.hpp +0 -13
- data/rice/detail/object_call.hpp +0 -69
- data/rice/detail/object_call.ipp +0 -131
- 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/traits.hpp +0 -43
- data/rice/detail/win32.hpp +0 -16
- data/rice/detail/wrap_function.hpp +0 -341
- data/rice/detail/wrap_function.ipp +0 -514
- data/rice/protect.hpp +0 -92
- 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 -294
- 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 -47
- data/sample/Makefile.in +0 -489
- data/test/Makefile.am +0 -72
- data/test/Makefile.in +0 -1213
- data/test/ext/Makefile.am +0 -41
- data/test/ext/Makefile.in +0 -483
- data/test/test_rice.rb +0 -41
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_
|
data/rice/Data_Object_defn.hpp
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
#ifndef Rice__Data_Object_defn__hpp_
|
2
2
|
#define Rice__Data_Object_defn__hpp_
|
3
3
|
|
4
|
-
#include
|
5
|
-
|
6
|
-
#include "ruby_mark.hpp"
|
4
|
+
#include <optional>
|
5
|
+
|
7
6
|
#include "detail/to_ruby.hpp"
|
8
7
|
#include "detail/ruby.hpp"
|
8
|
+
#include "cpp_api/Object_defn.hpp"
|
9
9
|
|
10
10
|
/*! \file
|
11
11
|
* \brief Provides a helper class for wrapping and unwrapping C++
|
@@ -14,124 +14,84 @@
|
|
14
14
|
|
15
15
|
namespace Rice
|
16
16
|
{
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
{
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
* Example:
|
41
|
-
* \code
|
42
|
-
* class Foo { };
|
43
|
-
* ...
|
44
|
-
* Data_Type<Foo> rb_cFoo = define_class("Foo");
|
45
|
-
* ...
|
46
|
-
* // Wrap:
|
47
|
-
* Data_Object<Foo> foo1(new Foo);
|
48
|
-
*
|
49
|
-
* // Get value to return:
|
50
|
-
* VALUE v = foo1.value()
|
51
|
-
*
|
52
|
-
* // Unwrap:
|
53
|
-
* Data_Object<Foo> foo2(v, rb_cFoo);
|
54
|
-
* \endcode
|
55
|
-
*/
|
56
|
-
template<typename T>
|
57
|
-
class Data_Object
|
58
|
-
: public Object
|
59
|
-
{
|
60
|
-
public:
|
61
|
-
//! A function that takes a T* and returns void.
|
62
|
-
typedef void (*Ruby_Data_Func)(T * obj);
|
63
|
-
|
64
|
-
//! Wrap a C++ object.
|
65
|
-
/*! This constructor is analogous to calling Data_Wrap_Struct. Be
|
66
|
-
* careful not to call this function more than once for the same
|
67
|
-
* pointer (in general, it should only be called for newly
|
68
|
-
* constructed objects that need to be managed by Ruby's garbage
|
69
|
-
* collector).
|
70
|
-
* \param obj the object to wrap.
|
71
|
-
* \param klass the Ruby class to use for the newly created Ruby
|
72
|
-
* object.
|
73
|
-
* \param mark_func a function that gets called by the garbage
|
74
|
-
* collector to mark the object's children.
|
75
|
-
* \param free_func a function that gets called by the garbage
|
76
|
-
* collector to free the object.
|
77
|
-
*/
|
78
|
-
Data_Object(
|
79
|
-
T * obj,
|
80
|
-
VALUE klass = Data_Type<T>::klass(),
|
81
|
-
Ruby_Data_Func mark_func = Default_Mark_Function<T>::mark,
|
82
|
-
Ruby_Data_Func free_func = Default_Free_Function<T>::free);
|
83
|
-
|
84
|
-
//! Unwrap a Ruby object.
|
85
|
-
/*! This constructor is analogous to calling Data_Get_Struct. Uses
|
86
|
-
* Data_Type<T>::klass as the class of the object.
|
87
|
-
* \param value the Ruby object to unwrap.
|
17
|
+
//! A smartpointer-like wrapper for Ruby data objects.
|
18
|
+
/*! A data object is a ruby object of type T_DATA, which is usually
|
19
|
+
* created by using the Data_Wrap_Struct or Data_Make_Struct macro.
|
20
|
+
* This class wraps creation of the data structure, providing a
|
21
|
+
* type-safe object-oriented interface to the underlying C interface.
|
22
|
+
* This class works in conjunction with the Data_Type class to ensure
|
23
|
+
* type safety.
|
24
|
+
*
|
25
|
+
* Example:
|
26
|
+
* \code
|
27
|
+
* class Foo { };
|
28
|
+
* ...
|
29
|
+
* Data_Type<Foo> rb_cFoo = define_class("Foo");
|
30
|
+
* ...
|
31
|
+
* // Wrap:
|
32
|
+
* Data_Object<Foo> foo1(new Foo);
|
33
|
+
*
|
34
|
+
* // Get value to return:
|
35
|
+
* VALUE v = foo1.value()
|
36
|
+
*
|
37
|
+
* // Unwrap:
|
38
|
+
* Data_Object<Foo> foo2(v, rb_cFoo);
|
39
|
+
* \endcode
|
88
40
|
*/
|
89
|
-
Data_Object(
|
90
|
-
Object value);
|
91
|
-
|
92
|
-
//! Unwrap a Ruby object.
|
93
|
-
/*! This constructor is analogous to calling Data_Get_Struct. Will
|
94
|
-
* throw an exception if the class of the object differs from the
|
95
|
-
* specified class.
|
96
|
-
* \param value the Ruby object to unwrap.
|
97
|
-
* \param klass the expected class of the object.
|
98
|
-
*/
|
99
|
-
template<typename U>
|
100
|
-
Data_Object(
|
101
|
-
Object value,
|
102
|
-
Data_Type<U> const & klass = Data_Type<T>::klass());
|
103
|
-
|
104
|
-
//! Make a copy of a Data_Object
|
105
|
-
/*! \param other the Data_Object to copy.
|
106
|
-
*/
|
107
|
-
Data_Object(Data_Object const & other);
|
108
|
-
|
109
|
-
T & operator*() const { return *obj_; } //!< Return a reference to obj_
|
110
|
-
T * operator->() const { return obj_; } //!< Return a pointer to obj_
|
111
|
-
T * get() const { return obj_; } //!< Return a pointer to obj_
|
112
|
-
|
113
|
-
//! Swap with another data object of the same type
|
114
|
-
/*! \param ref the object with which to swap.
|
115
|
-
*/
|
116
|
-
template<typename U>
|
117
|
-
void swap(Data_Object<U> & ref);
|
118
|
-
|
119
|
-
private:
|
120
|
-
static void check_cpp_type(Data_Type<T> const & klass);
|
121
|
-
|
122
|
-
private:
|
123
|
-
T * obj_;
|
124
|
-
};
|
125
|
-
|
126
|
-
namespace detail
|
127
|
-
{
|
128
41
|
template<typename T>
|
129
|
-
|
42
|
+
class Data_Object : public Object
|
130
43
|
{
|
131
|
-
|
44
|
+
static_assert(!std::is_pointer_v<T>);
|
45
|
+
static_assert(!std::is_reference_v<T>);
|
46
|
+
static_assert(!std::is_const_v<T>);
|
47
|
+
static_assert(!std::is_volatile_v<T>);
|
48
|
+
|
49
|
+
public:
|
50
|
+
static T* from_ruby(VALUE value);
|
51
|
+
static std::optional<T> implicit_from_ruby(VALUE value);
|
52
|
+
|
53
|
+
public:
|
54
|
+
//! Wrap a C++ object.
|
55
|
+
/*! This constructor is analogous to calling Data_Wrap_Struct. Be
|
56
|
+
* careful not to call this function more than once for the same
|
57
|
+
* pointer (in general, it should only be called for newly
|
58
|
+
* constructed objects that need to be managed by Ruby's garbage
|
59
|
+
* collector).
|
60
|
+
* \param obj the object to wrap.
|
61
|
+
* \param klass the Ruby class to use for the newly created Ruby
|
62
|
+
* object.
|
63
|
+
* \param mark_func a function that gets called by the garbage
|
64
|
+
* collector to mark the object's children.
|
65
|
+
* \param free_func a function that gets called by the garbage
|
66
|
+
* collector to free the object.
|
67
|
+
*/
|
68
|
+
Data_Object(T* obj, bool isOwner = false, Class klass = Data_Type<T>::klass());
|
69
|
+
Data_Object(T& obj, bool isOwner = false, Class klass = Data_Type<T>::klass());
|
70
|
+
|
71
|
+
//! Unwrap a Ruby object.
|
72
|
+
/*! This constructor is analogous to calling Data_Get_Struct. Uses
|
73
|
+
* Data_Type<T>::klass as the class of the object.
|
74
|
+
* \param value the Ruby object to unwrap.
|
75
|
+
*/
|
76
|
+
Data_Object(Object value);
|
77
|
+
|
78
|
+
//! Unwrap a Ruby object.
|
79
|
+
/*! This constructor is analogous to calling Data_Get_Struct. Will
|
80
|
+
* throw an exception if the class of the object differs from the
|
81
|
+
* specified class.
|
82
|
+
* \param value the Ruby object to unwrap.
|
83
|
+
* \param klass the expected class of the object.
|
84
|
+
*/
|
85
|
+
template<typename U>
|
86
|
+
Data_Object(Object value);
|
87
|
+
|
88
|
+
T& operator*() const; //!< Return a reference to obj_
|
89
|
+
T* operator->() const; //!< Return a pointer to obj_
|
90
|
+
T* get() const; //!< Return a pointer to obj_
|
91
|
+
|
92
|
+
private:
|
93
|
+
static void check_ruby_type(VALUE value);
|
132
94
|
};
|
133
|
-
}
|
134
|
-
|
135
95
|
} // namespace Rice
|
136
96
|
|
137
97
|
#endif // Rice__Data_Object_defn__hpp_
|