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.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/lib/mkmf-rice.rb +127 -0
  9. data/lib/version.rb +3 -0
  10. data/rice/Address_Registration_Guard.ipp +75 -32
  11. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  12. data/rice/Arg.hpp +80 -4
  13. data/rice/Arg.ipp +51 -0
  14. data/rice/Constructor.hpp +12 -14
  15. data/rice/Data_Object.ipp +234 -107
  16. data/rice/Data_Object_defn.hpp +77 -117
  17. data/rice/Data_Type.hpp +1 -2
  18. data/rice/Data_Type.ipp +251 -295
  19. data/rice/Data_Type_defn.hpp +175 -243
  20. data/rice/Director.hpp +11 -6
  21. data/rice/Enum.hpp +54 -104
  22. data/rice/Enum.ipp +104 -230
  23. data/rice/Exception.hpp +2 -8
  24. data/rice/Exception.ipp +65 -0
  25. data/rice/Exception_defn.hpp +46 -47
  26. data/rice/Identifier.hpp +28 -28
  27. data/rice/Identifier.ipp +23 -27
  28. data/rice/Return.hpp +39 -0
  29. data/rice/Return.ipp +33 -0
  30. data/rice/detail/Exception_Handler.ipp +22 -62
  31. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  32. data/rice/detail/Iterator.hpp +18 -88
  33. data/rice/detail/Iterator.ipp +47 -0
  34. data/rice/detail/Jump_Tag.hpp +21 -0
  35. data/rice/detail/MethodInfo.hpp +44 -0
  36. data/rice/detail/MethodInfo.ipp +78 -0
  37. data/rice/detail/NativeAttribute.hpp +53 -0
  38. data/rice/detail/NativeAttribute.ipp +83 -0
  39. data/rice/detail/NativeFunction.hpp +69 -0
  40. data/rice/detail/NativeFunction.ipp +248 -0
  41. data/rice/detail/RubyFunction.hpp +39 -0
  42. data/rice/detail/RubyFunction.ipp +92 -0
  43. data/rice/detail/Type.hpp +29 -0
  44. data/rice/detail/Type.ipp +138 -0
  45. data/rice/detail/TypeRegistry.hpp +50 -0
  46. data/rice/detail/TypeRegistry.ipp +106 -0
  47. data/rice/detail/Wrapper.hpp +51 -0
  48. data/rice/detail/Wrapper.ipp +151 -0
  49. data/rice/detail/default_allocation_func.hpp +8 -19
  50. data/rice/detail/default_allocation_func.ipp +9 -8
  51. data/rice/detail/from_ruby.hpp +2 -37
  52. data/rice/detail/from_ruby.ipp +1020 -46
  53. data/rice/detail/from_ruby_defn.hpp +38 -0
  54. data/rice/detail/function_traits.hpp +124 -0
  55. data/rice/detail/method_data.hpp +23 -15
  56. data/rice/detail/method_data.ipp +53 -0
  57. data/rice/detail/rice_traits.hpp +116 -0
  58. data/rice/detail/ruby.hpp +9 -46
  59. data/rice/detail/to_ruby.hpp +3 -17
  60. data/rice/detail/to_ruby.ipp +409 -31
  61. data/rice/detail/to_ruby_defn.hpp +48 -0
  62. data/rice/forward_declares.ipp +82 -0
  63. data/rice/global_function.hpp +16 -20
  64. data/rice/global_function.ipp +8 -17
  65. data/rice/rice.hpp +59 -0
  66. data/rice/ruby_mark.hpp +5 -3
  67. data/rice/ruby_try_catch.hpp +4 -4
  68. data/rice/stl.hpp +11 -0
  69. data/sample/callbacks/extconf.rb +3 -0
  70. data/sample/callbacks/sample_callbacks.cpp +10 -13
  71. data/sample/enum/extconf.rb +3 -0
  72. data/sample/enum/sample_enum.cpp +3 -17
  73. data/sample/enum/test.rb +2 -2
  74. data/sample/inheritance/animals.cpp +8 -24
  75. data/sample/inheritance/extconf.rb +3 -0
  76. data/sample/inheritance/test.rb +1 -1
  77. data/sample/map/extconf.rb +3 -0
  78. data/sample/map/map.cpp +10 -18
  79. data/sample/map/test.rb +1 -1
  80. data/test/embed_ruby.cpp +18 -5
  81. data/test/ext/t1/extconf.rb +3 -0
  82. data/test/ext/t1/t1.cpp +1 -3
  83. data/test/ext/t2/extconf.rb +3 -0
  84. data/test/ext/t2/t2.cpp +1 -1
  85. data/test/extconf.rb +23 -0
  86. data/test/ruby/test_callbacks_sample.rb +28 -0
  87. data/test/ruby/test_multiple_extensions.rb +18 -0
  88. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  89. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  90. data/test/test_Address_Registration_Guard.cpp +23 -10
  91. data/test/test_Array.cpp +129 -73
  92. data/test/test_Attribute.cpp +147 -0
  93. data/test/test_Builtin_Object.cpp +34 -14
  94. data/test/test_Class.cpp +149 -275
  95. data/test/test_Constructor.cpp +10 -9
  96. data/test/test_Data_Object.cpp +133 -192
  97. data/test/test_Data_Type.cpp +322 -252
  98. data/test/test_Director.cpp +54 -41
  99. data/test/test_Enum.cpp +228 -103
  100. data/test/test_Exception.cpp +5 -6
  101. data/test/test_Hash.cpp +31 -30
  102. data/test/test_Identifier.cpp +4 -5
  103. data/test/test_Inheritance.cpp +221 -0
  104. data/test/test_Iterator.cpp +161 -0
  105. data/test/test_Jump_Tag.cpp +1 -1
  106. data/test/test_Keep_Alive.cpp +161 -0
  107. data/test/test_Memory_Management.cpp +2 -4
  108. data/test/test_Module.cpp +167 -110
  109. data/test/test_Object.cpp +41 -21
  110. data/test/test_Ownership.cpp +275 -0
  111. data/test/test_Self.cpp +205 -0
  112. data/test/test_Stl_Optional.cpp +90 -0
  113. data/test/test_Stl_Pair.cpp +144 -0
  114. data/test/test_Stl_SmartPointer.cpp +200 -0
  115. data/test/test_Stl_String.cpp +74 -0
  116. data/test/test_Stl_Vector.cpp +652 -0
  117. data/test/test_String.cpp +1 -2
  118. data/test/test_Struct.cpp +29 -39
  119. data/test/test_Symbol.cpp +1 -2
  120. data/test/test_To_From_Ruby.cpp +249 -285
  121. data/test/test_global_functions.cpp +39 -19
  122. data/test/unittest.hpp +0 -4
  123. metadata +63 -139
  124. data/Doxyfile +0 -2268
  125. data/Makefile.am +0 -26
  126. data/Makefile.in +0 -931
  127. data/README.mingw +0 -8
  128. data/aclocal.m4 +0 -1085
  129. data/ax_cxx_compile_stdcxx.m4 +0 -951
  130. data/bootstrap +0 -8
  131. data/config.guess +0 -1421
  132. data/config.sub +0 -1807
  133. data/configure +0 -7792
  134. data/configure.ac +0 -55
  135. data/depcomp +0 -791
  136. data/doxygen.ac +0 -314
  137. data/doxygen.am +0 -186
  138. data/extconf.rb +0 -70
  139. data/install-sh +0 -501
  140. data/missing +0 -215
  141. data/post-autoconf.rb +0 -22
  142. data/post-automake.rb +0 -28
  143. data/rice/Address_Registration_Guard.cpp +0 -22
  144. data/rice/Arg_impl.hpp +0 -129
  145. data/rice/Arg_operators.cpp +0 -21
  146. data/rice/Arg_operators.hpp +0 -19
  147. data/rice/Array.hpp +0 -214
  148. data/rice/Array.ipp +0 -256
  149. data/rice/Builtin_Object.hpp +0 -8
  150. data/rice/Builtin_Object.ipp +0 -50
  151. data/rice/Builtin_Object_defn.hpp +0 -50
  152. data/rice/Class.cpp +0 -57
  153. data/rice/Class.hpp +0 -8
  154. data/rice/Class.ipp +0 -6
  155. data/rice/Class_defn.hpp +0 -84
  156. data/rice/Data_Type.cpp +0 -54
  157. data/rice/Data_Type_fwd.hpp +0 -12
  158. data/rice/Director.cpp +0 -13
  159. data/rice/Exception.cpp +0 -54
  160. data/rice/Exception_Base.hpp +0 -8
  161. data/rice/Exception_Base.ipp +0 -13
  162. data/rice/Exception_Base_defn.hpp +0 -27
  163. data/rice/Hash.hpp +0 -230
  164. data/rice/Hash.ipp +0 -329
  165. data/rice/Identifier.cpp +0 -8
  166. data/rice/Jump_Tag.hpp +0 -24
  167. data/rice/Makefile.am +0 -121
  168. data/rice/Makefile.in +0 -884
  169. data/rice/Module.cpp +0 -84
  170. data/rice/Module.hpp +0 -8
  171. data/rice/Module.ipp +0 -6
  172. data/rice/Module_defn.hpp +0 -88
  173. data/rice/Module_impl.hpp +0 -281
  174. data/rice/Module_impl.ipp +0 -345
  175. data/rice/Object.cpp +0 -169
  176. data/rice/Object.hpp +0 -8
  177. data/rice/Object.ipp +0 -33
  178. data/rice/Object_defn.hpp +0 -214
  179. data/rice/Require_Guard.hpp +0 -21
  180. data/rice/String.cpp +0 -89
  181. data/rice/String.hpp +0 -91
  182. data/rice/Struct.cpp +0 -117
  183. data/rice/Struct.hpp +0 -162
  184. data/rice/Struct.ipp +0 -26
  185. data/rice/Symbol.cpp +0 -25
  186. data/rice/Symbol.hpp +0 -66
  187. data/rice/Symbol.ipp +0 -44
  188. data/rice/config.hpp +0 -47
  189. data/rice/config.hpp.in +0 -46
  190. data/rice/detail/Arguments.hpp +0 -118
  191. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  192. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  193. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  194. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  195. data/rice/detail/Caster.hpp +0 -103
  196. data/rice/detail/Not_Copyable.hpp +0 -25
  197. data/rice/detail/Wrapped_Function.hpp +0 -33
  198. data/rice/detail/cfp.hpp +0 -24
  199. data/rice/detail/cfp.ipp +0 -51
  200. data/rice/detail/check_ruby_type.cpp +0 -27
  201. data/rice/detail/check_ruby_type.hpp +0 -23
  202. data/rice/detail/creation_funcs.hpp +0 -37
  203. data/rice/detail/creation_funcs.ipp +0 -36
  204. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  205. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  206. data/rice/detail/demangle.cpp +0 -56
  207. data/rice/detail/demangle.hpp +0 -19
  208. data/rice/detail/env.hpp +0 -11
  209. data/rice/detail/method_data.cpp +0 -92
  210. data/rice/detail/node.hpp +0 -13
  211. data/rice/detail/protect.cpp +0 -29
  212. data/rice/detail/protect.hpp +0 -34
  213. data/rice/detail/ruby_version_code.hpp +0 -6
  214. data/rice/detail/ruby_version_code.hpp.in +0 -6
  215. data/rice/detail/st.hpp +0 -22
  216. data/rice/detail/win32.hpp +0 -16
  217. data/rice/detail/wrap_function.hpp +0 -66
  218. data/rice/protect.hpp +0 -38
  219. data/rice/protect.ipp +0 -1134
  220. data/rice/rubypp.rb +0 -97
  221. data/rice/to_from_ruby.hpp +0 -8
  222. data/rice/to_from_ruby.ipp +0 -418
  223. data/rice/to_from_ruby_defn.hpp +0 -70
  224. data/ruby.ac +0 -135
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/sample/Makefile.am +0 -53
  232. data/sample/Makefile.in +0 -495
  233. data/test/Makefile.am +0 -73
  234. data/test/Makefile.in +0 -1219
  235. data/test/ext/Makefile.am +0 -41
  236. data/test/ext/Makefile.in +0 -483
  237. 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
- // This causes problems with certain C++ libraries
5
- #undef TYPE
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 ...Arg_T>
22
+ template<typename T, typename...Arg_Ts>
25
23
  class Constructor
26
24
  {
27
25
  public:
28
- static void construct(Object self, Arg_T... args)
26
+ static void construct(VALUE self, Arg_Ts...args)
29
27
  {
30
- DATA_PTR(self.value()) = new T(args...);
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 ...Arg_T>
36
- class Constructor<T, Object, Arg_T...>
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, Arg_T... args)
38
+ static void construct(Object self, Arg_Ts...args)
40
39
  {
41
- DATA_PTR(self.value()) = new T(self, args...);
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 "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_