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.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +45 -1028
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/include/rice/stl.hpp +1113 -0
  10. data/lib/mkmf-rice.rb +127 -0
  11. data/lib/version.rb +3 -0
  12. data/rice/Address_Registration_Guard.ipp +75 -32
  13. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  14. data/rice/Arg.hpp +80 -4
  15. data/rice/Arg.ipp +51 -0
  16. data/rice/Constructor.hpp +30 -376
  17. data/rice/Data_Object.ipp +234 -107
  18. data/rice/Data_Object_defn.hpp +77 -117
  19. data/rice/Data_Type.hpp +1 -2
  20. data/rice/Data_Type.ipp +251 -295
  21. data/rice/Data_Type_defn.hpp +175 -243
  22. data/rice/Director.hpp +14 -9
  23. data/rice/Enum.hpp +54 -104
  24. data/rice/Enum.ipp +104 -230
  25. data/rice/Exception.hpp +2 -8
  26. data/rice/Exception.ipp +65 -0
  27. data/rice/Exception_defn.hpp +46 -47
  28. data/rice/Identifier.hpp +28 -28
  29. data/rice/Identifier.ipp +23 -27
  30. data/rice/Return.hpp +39 -0
  31. data/rice/Return.ipp +33 -0
  32. data/rice/detail/Exception_Handler.ipp +22 -62
  33. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  34. data/rice/detail/Iterator.hpp +18 -88
  35. data/rice/detail/Iterator.ipp +47 -0
  36. data/rice/detail/Jump_Tag.hpp +21 -0
  37. data/rice/detail/MethodInfo.hpp +44 -0
  38. data/rice/detail/MethodInfo.ipp +78 -0
  39. data/rice/detail/NativeAttribute.hpp +53 -0
  40. data/rice/detail/NativeAttribute.ipp +83 -0
  41. data/rice/detail/NativeFunction.hpp +69 -0
  42. data/rice/detail/NativeFunction.ipp +248 -0
  43. data/rice/detail/RubyFunction.hpp +39 -0
  44. data/rice/detail/RubyFunction.ipp +92 -0
  45. data/rice/detail/Type.hpp +29 -0
  46. data/rice/detail/Type.ipp +138 -0
  47. data/rice/detail/TypeRegistry.hpp +50 -0
  48. data/rice/detail/TypeRegistry.ipp +106 -0
  49. data/rice/detail/Wrapper.hpp +51 -0
  50. data/rice/detail/Wrapper.ipp +151 -0
  51. data/rice/detail/default_allocation_func.hpp +8 -19
  52. data/rice/detail/default_allocation_func.ipp +9 -8
  53. data/rice/detail/from_ruby.hpp +2 -37
  54. data/rice/detail/from_ruby.ipp +1020 -46
  55. data/rice/detail/from_ruby_defn.hpp +38 -0
  56. data/rice/detail/function_traits.hpp +124 -0
  57. data/rice/detail/method_data.hpp +23 -15
  58. data/rice/detail/method_data.ipp +53 -0
  59. data/rice/detail/rice_traits.hpp +116 -0
  60. data/rice/detail/ruby.hpp +9 -50
  61. data/rice/detail/to_ruby.hpp +3 -17
  62. data/rice/detail/to_ruby.ipp +409 -31
  63. data/rice/detail/to_ruby_defn.hpp +48 -0
  64. data/rice/forward_declares.ipp +82 -0
  65. data/rice/global_function.hpp +16 -20
  66. data/rice/global_function.ipp +8 -17
  67. data/rice/rice.hpp +59 -0
  68. data/rice/ruby_mark.hpp +5 -3
  69. data/rice/ruby_try_catch.hpp +4 -4
  70. data/rice/stl.hpp +11 -0
  71. data/sample/callbacks/extconf.rb +6 -0
  72. data/sample/callbacks/sample_callbacks.cpp +35 -0
  73. data/sample/callbacks/test.rb +28 -0
  74. data/sample/enum/extconf.rb +3 -0
  75. data/sample/enum/sample_enum.cpp +3 -17
  76. data/sample/enum/test.rb +2 -2
  77. data/sample/inheritance/animals.cpp +8 -24
  78. data/sample/inheritance/extconf.rb +3 -0
  79. data/sample/inheritance/test.rb +1 -1
  80. data/sample/map/extconf.rb +3 -0
  81. data/sample/map/map.cpp +10 -18
  82. data/sample/map/test.rb +1 -1
  83. data/test/embed_ruby.cpp +34 -0
  84. data/test/embed_ruby.hpp +4 -0
  85. data/test/ext/t1/extconf.rb +3 -0
  86. data/test/ext/t1/t1.cpp +1 -3
  87. data/test/ext/t2/extconf.rb +3 -0
  88. data/test/ext/t2/t2.cpp +1 -1
  89. data/test/extconf.rb +23 -0
  90. data/test/ruby/test_callbacks_sample.rb +28 -0
  91. data/test/ruby/test_multiple_extensions.rb +18 -0
  92. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  93. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  94. data/test/test_Address_Registration_Guard.cpp +25 -11
  95. data/test/test_Array.cpp +131 -74
  96. data/test/test_Attribute.cpp +147 -0
  97. data/test/test_Builtin_Object.cpp +36 -15
  98. data/test/test_Class.cpp +151 -276
  99. data/test/test_Constructor.cpp +10 -9
  100. data/test/test_Data_Object.cpp +135 -193
  101. data/test/test_Data_Type.cpp +323 -252
  102. data/test/test_Director.cpp +56 -42
  103. data/test/test_Enum.cpp +230 -104
  104. data/test/test_Exception.cpp +7 -7
  105. data/test/test_Hash.cpp +33 -31
  106. data/test/test_Identifier.cpp +6 -6
  107. data/test/test_Inheritance.cpp +221 -0
  108. data/test/test_Iterator.cpp +161 -0
  109. data/test/test_Jump_Tag.cpp +1 -1
  110. data/test/test_Keep_Alive.cpp +161 -0
  111. data/test/test_Memory_Management.cpp +4 -5
  112. data/test/test_Module.cpp +169 -111
  113. data/test/test_Object.cpp +51 -19
  114. data/test/test_Ownership.cpp +275 -0
  115. data/test/test_Self.cpp +205 -0
  116. data/test/test_Stl_Optional.cpp +90 -0
  117. data/test/test_Stl_Pair.cpp +144 -0
  118. data/test/test_Stl_SmartPointer.cpp +200 -0
  119. data/test/test_Stl_String.cpp +74 -0
  120. data/test/test_Stl_Vector.cpp +652 -0
  121. data/test/test_String.cpp +3 -3
  122. data/test/test_Struct.cpp +31 -40
  123. data/test/test_Symbol.cpp +3 -3
  124. data/test/test_To_From_Ruby.cpp +283 -218
  125. data/test/test_global_functions.cpp +41 -20
  126. data/test/unittest.cpp +34 -8
  127. data/test/unittest.hpp +0 -4
  128. metadata +121 -136
  129. data/Doxyfile +0 -2268
  130. data/Makefile.am +0 -26
  131. data/Makefile.in +0 -923
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -103
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7367
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -125
  173. data/rice/Makefile.in +0 -888
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -628
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -506
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -489
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1213
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -483
  246. 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 "detail/check_ruby_type.hpp"
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
- namespace detail
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
- inline VALUE data_wrap_struct(
20
- VALUE klass,
21
- RUBY_DATA_FUNC mark,
22
- RUBY_DATA_FUNC free,
23
- void * obj)
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 VALUE wrap(
30
- VALUE klass,
31
- typename Data_Object<T>::Ruby_Data_Func mark,
32
- typename Data_Object<T>::Ruby_Data_Func free,
33
- T * obj)
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
- inline VALUE data_get_struct(VALUE value, T * * obj)
48
- {
49
- Data_Get_Struct(value, T, *obj);
50
- return Qnil;
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
- template<typename T>
54
- inline T * unwrap(VALUE value)
94
+ namespace Rice::detail
55
95
  {
56
- T * obj;
57
- Rice::protect(data_get_struct<T>, value, &obj);
58
- return obj;
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
- } // namespace detail
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
- } // namespace Rice
111
+ template <typename T>
112
+ class To_Ruby<T&>
113
+ {
114
+ public:
115
+ To_Ruby() = default;
64
116
 
65
- template<typename T>
66
- inline Rice::Data_Object<T>::
67
- Data_Object(
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
- template<typename T>
78
- inline Rice::Data_Object<T>::
79
- Data_Object(
80
- Object value)
81
- : Object(value)
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
- template<typename T>
90
- template<typename U>
91
- inline Rice::Data_Object<T>::
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
- template<typename T>
103
- inline Rice::Data_Object<T>::
104
- Data_Object(Data_Object const & other)
105
- : Object(other.value())
106
- , obj_(other.obj_)
107
- {
108
- }
131
+ private:
132
+ Return* returnInfo_ = nullptr;
133
+ };
109
134
 
110
- template<typename T>
111
- template<typename U>
112
- inline void Rice::Data_Object<T>::
113
- swap(Data_Object<U> & ref)
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
- template<typename T>
120
- inline void Rice::Data_Object<T>::
121
- check_cpp_type(Data_Type<T> const & /* klass */)
122
- {
123
- }
141
+ explicit To_Ruby(Return* returnInfo) : returnInfo_(returnInfo)
142
+ {
143
+ }
124
144
 
125
- template<typename T>
126
- Rice::Object Rice::detail::to_ruby_<Rice::Data_Object<T> >::
127
- convert(Rice::Data_Object<T> const & x)
128
- {
129
- return x;
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
- #endif // Rice__Data_Object__ipp_
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_
@@ -1,11 +1,11 @@
1
1
  #ifndef Rice__Data_Object_defn__hpp_
2
2
  #define Rice__Data_Object_defn__hpp_
3
3
 
4
- #include "Object_defn.hpp"
5
- #include "Data_Type_fwd.hpp"
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
- template<typename T>
19
- struct Default_Mark_Function
20
- {
21
- typedef void (*Ruby_Data_Func)(T * obj);
22
- static const Ruby_Data_Func mark;
23
- };
24
-
25
- template<typename T>
26
- struct Default_Free_Function
27
- {
28
- static void free(T * obj) { delete obj; }
29
- };
30
-
31
-
32
- //! A smartpointer-like wrapper for Ruby data objects.
33
- /*! A data object is a ruby object of type T_DATA, which is usually
34
- * created by using the Data_Wrap_Struct or Data_Make_Struct macro.
35
- * This class wraps creation of the data structure, providing a
36
- * type-safe object-oriented interface to the underlying C interface.
37
- * This class works in conjunction with the Data_Type class to ensure
38
- * type safety.
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
- struct to_ruby_<Data_Object<T> >
42
+ class Data_Object : public Object
130
43
  {
131
- static Rice::Object convert(Data_Object<T> const & x);
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_