rice 3.0.0 → 4.0.3

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 (238) 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/include/rice/stl.hpp +1113 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +12 -14
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +11 -6
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -46
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  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/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. data/test/test_rice.rb +0 -45
@@ -0,0 +1,50 @@
1
+ #ifndef Rice__TypeRegistry__hpp_
2
+ #define Rice__TypeRegistry__hpp_
3
+
4
+ #include <optional>
5
+ #include <string>
6
+ #include <typeindex>
7
+ #include <typeinfo>
8
+ #include <unordered_map>
9
+
10
+ #include "ruby.hpp"
11
+
12
+ /* The type registery keeps track of all C++ types wrapped by Rice. When a native function returns
13
+ an instance of a class/struct we look up its type to verity that it has been registered.
14
+
15
+ We have to do this to support C++ inheritance. If a C++ function returns a pointer/reference
16
+ to an Abstract class, the actual returned object will be a Child class. However, all we know
17
+ from the C++ method signature is that it is an Absract class - thus the need for a registry.*/
18
+
19
+ namespace Rice::detail
20
+ {
21
+ class TypeRegistry
22
+ {
23
+ public:
24
+ template <typename T>
25
+ static void add();
26
+
27
+ template <typename T>
28
+ static void add(VALUE klass, rb_data_type_t* rbType);
29
+
30
+ template <typename T>
31
+ static void remove();
32
+
33
+ template <typename T>
34
+ static bool isDefined();
35
+
36
+ template <typename T>
37
+ static void verifyDefined();
38
+
39
+ template <typename T>
40
+ static std::pair<VALUE, rb_data_type_t*> figureType(const T& object);
41
+
42
+ private:
43
+ static std::optional<std::pair<VALUE, rb_data_type_t*>> lookup(const std::type_info& typeInfo);
44
+ static inline std::unordered_map<std::type_index, std::pair<VALUE, rb_data_type_t*>> registry_{};
45
+ };
46
+ }
47
+
48
+ #include "TypeRegistry.ipp"
49
+
50
+ #endif // Rice__TypeRegistry__hpp_
@@ -0,0 +1,106 @@
1
+ #include <stdexcept>
2
+
3
+ #include "ruby.hpp"
4
+ #include "rice_traits.hpp"
5
+ #include "Type.hpp"
6
+
7
+ namespace Rice::detail
8
+ {
9
+ template <typename T>
10
+ inline void TypeRegistry::add()
11
+ {
12
+ std::type_index key(typeid(T));
13
+ registry_[key] = std::pair(Qnil, nullptr);
14
+ }
15
+
16
+ template <typename T>
17
+ inline void TypeRegistry::add(VALUE klass, rb_data_type_t* rbType)
18
+ {
19
+ std::type_index key(typeid(T));
20
+ registry_[key] = std::pair(klass, rbType);
21
+ }
22
+
23
+ template <typename T>
24
+ inline void TypeRegistry::remove()
25
+ {
26
+ std::type_index key(typeid(T));
27
+ registry_.erase(key);
28
+ }
29
+
30
+ template <typename T>
31
+ inline bool TypeRegistry::isDefined()
32
+ {
33
+ std::type_index key(typeid(T));
34
+ auto iter = registry_.find(key);
35
+ return iter != registry_.end();
36
+ }
37
+
38
+ template <typename T>
39
+ inline void TypeRegistry::verifyDefined()
40
+ {
41
+ if (!isDefined<T>())
42
+ {
43
+ std::string message = "Type is not defined with Rice: " + detail::typeName(typeid(T));
44
+ throw std::invalid_argument(message);
45
+ }
46
+ }
47
+
48
+ inline std::optional<std::pair<VALUE, rb_data_type_t*>> TypeRegistry::lookup(const std::type_info& typeInfo)
49
+ {
50
+ std::type_index key(typeInfo);
51
+ auto iter = registry_.find(key);
52
+
53
+ if (iter == registry_.end())
54
+ {
55
+ return std::nullopt;
56
+ }
57
+ else
58
+ {
59
+ return iter->second;
60
+ }
61
+ }
62
+
63
+ template <typename T>
64
+ inline std::pair<VALUE, rb_data_type_t*> TypeRegistry::figureType(const T& object)
65
+ {
66
+ // First check and see if the actual type of the object is registered
67
+ std::optional<std::pair<VALUE, rb_data_type_t*>> result = lookup(typeid(object));
68
+
69
+ if (result)
70
+ {
71
+ return result.value();
72
+ }
73
+
74
+ // If not, then we are willing to accept an ancestor class specified by T. This is needed
75
+ // to support Directors. Classes inherited from Directors are never actually registered
76
+ // with Rice - and what we really want it to return the C++ class they inherit from.
77
+ result = lookup(typeid(T));
78
+ if (result)
79
+ {
80
+ return result.value();
81
+ }
82
+
83
+ // Give up!
84
+ std::string message = "Type " + typeName(typeid(object)) + " is not registered";
85
+ throw std::runtime_error(message.c_str());
86
+ }
87
+
88
+ // TODO - hacky to put this here but there is a circular dependency between Type and TypeRegistry
89
+ template<typename T>
90
+ bool Type<T>::verify()
91
+ {
92
+ // Use intrinsic_type so that we don't have to define specializations
93
+ // for pointers, references, const, etc.
94
+ using Intrinsic_T = intrinsic_type<T>;
95
+
96
+ if constexpr (std::is_fundamental_v<Intrinsic_T>)
97
+ {
98
+ return true;
99
+ }
100
+ else
101
+ {
102
+ TypeRegistry::verifyDefined<Intrinsic_T>();
103
+ return true;
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,51 @@
1
+ #ifndef Rice__detail__Wrapper__hpp_
2
+ #define Rice__detail__Wrapper__hpp_
3
+
4
+ #include "ruby.hpp"
5
+
6
+ namespace Rice
7
+ {
8
+ namespace detail
9
+ {
10
+
11
+ class Wrapper
12
+ {
13
+ public:
14
+ virtual ~Wrapper() = default;
15
+ virtual void* get() = 0;
16
+
17
+ void ruby_mark();
18
+ void addKeepAlive(VALUE value);
19
+
20
+ private:
21
+ // We use a vector for speed and memory locality versus a set which does
22
+ // not scale well when getting to tens of thousands of objects (not expecting
23
+ // that to happen...but just in case)
24
+ std::vector<VALUE> keepAlive_;
25
+ };
26
+
27
+ template <typename T, typename Wrapper_T = void>
28
+ VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T& data, bool isOwner);
29
+
30
+ template <typename T, typename Wrapper_T = void>
31
+ VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T* data, bool isOwner);
32
+
33
+ template <typename T>
34
+ T* unwrap(VALUE value, rb_data_type_t* rb_type);
35
+
36
+ Wrapper* getWrapper(VALUE value, rb_data_type_t* rb_type);
37
+
38
+ void* unwrap(VALUE value);
39
+
40
+ template <typename T>
41
+ void replace(VALUE value, rb_data_type_t* rb_type, T* data, bool isOwner);
42
+
43
+ Wrapper* getWrapper(VALUE value);
44
+
45
+ } // namespace detail
46
+ } // namespace Rice
47
+
48
+ #include "Wrapper.ipp"
49
+
50
+ #endif // Rice__detail__Wrapper__hpp_
51
+
@@ -0,0 +1,151 @@
1
+ #include <memory>
2
+
3
+ namespace Rice::detail
4
+ {
5
+ inline void Wrapper::ruby_mark()
6
+ {
7
+ for (VALUE value : this->keepAlive_)
8
+ {
9
+ rb_gc_mark(value);
10
+ }
11
+ }
12
+
13
+ inline void Wrapper::addKeepAlive(VALUE value)
14
+ {
15
+ this->keepAlive_.push_back(value);
16
+ }
17
+
18
+ template <typename T>
19
+ class WrapperValue : public Wrapper
20
+ {
21
+ public:
22
+ WrapperValue(T& data): data_(std::move(data))
23
+ {
24
+ }
25
+
26
+ void* get() override
27
+ {
28
+ return (void*)&this->data_;
29
+ }
30
+
31
+ private:
32
+ T data_;
33
+ };
34
+
35
+ template <typename T>
36
+ class WrapperReference : public Wrapper
37
+ {
38
+ public:
39
+ WrapperReference(const T& data): data_(data)
40
+ {
41
+ }
42
+
43
+ void* get() override
44
+ {
45
+ return (void*)&this->data_;
46
+ }
47
+
48
+ private:
49
+ const T& data_;
50
+ };
51
+
52
+ template <typename T>
53
+ class WrapperPointer : public Wrapper
54
+ {
55
+ public:
56
+ WrapperPointer(T* data, bool isOwner) : data_(data), isOwner_(isOwner)
57
+ {
58
+ }
59
+
60
+ ~WrapperPointer()
61
+ {
62
+ if (this->isOwner_)
63
+ {
64
+ delete this->data_;
65
+ }
66
+ }
67
+
68
+ void* get() override
69
+ {
70
+ return (void*)this->data_;
71
+ }
72
+
73
+ private:
74
+ T* data_ = nullptr;
75
+ bool isOwner_ = false;
76
+ };
77
+
78
+ // ---- Helper Functions -------
79
+ template <typename T, typename Wrapper_T>
80
+ inline VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T& data, bool isOwner)
81
+ {
82
+ if constexpr (!std::is_void_v<Wrapper_T>)
83
+ {
84
+ Wrapper_T* wrapper = new Wrapper_T(data);
85
+ return TypedData_Wrap_Struct(klass, rb_type, wrapper);
86
+ }
87
+ else if (isOwner)
88
+ {
89
+ WrapperValue<T>* wrapper = new WrapperValue<T>(data);
90
+ return TypedData_Wrap_Struct(klass, rb_type, wrapper);
91
+ }
92
+ else
93
+ {
94
+ WrapperReference<T>* wrapper = new WrapperReference<T>(data);
95
+ return TypedData_Wrap_Struct(klass, rb_type, wrapper);
96
+ }
97
+ };
98
+
99
+ template <typename T, typename Wrapper_T>
100
+ inline VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T* data, bool isOwner)
101
+ {
102
+ if constexpr (!std::is_void_v<Wrapper_T>)
103
+ {
104
+ Wrapper_T* wrapper = new Wrapper_T(data);
105
+ return TypedData_Wrap_Struct(klass, rb_type, wrapper);
106
+ }
107
+ else
108
+ {
109
+ WrapperPointer<T>* wrapper = new WrapperPointer<T>(data, isOwner);
110
+ return TypedData_Wrap_Struct(klass, rb_type, wrapper);
111
+ }
112
+ };
113
+
114
+ template <typename T>
115
+ inline T* unwrap(VALUE value, rb_data_type_t* rb_type)
116
+ {
117
+ Wrapper* wrapper = getWrapper(value, rb_type);
118
+ TypedData_Get_Struct(value, Wrapper, rb_type, wrapper);
119
+ return static_cast<T*>(wrapper->get());
120
+ }
121
+
122
+ inline void* unwrap(VALUE value)
123
+ {
124
+ // Direct access to avoid any type checking
125
+ Wrapper* wrapper = (Wrapper*)RTYPEDDATA_DATA(value);
126
+ return wrapper->get();
127
+ }
128
+
129
+ inline Wrapper* getWrapper(VALUE value, rb_data_type_t* rb_type)
130
+ {
131
+ Wrapper* wrapper = nullptr;
132
+ TypedData_Get_Struct(value, Wrapper, rb_type, wrapper);
133
+ return wrapper;
134
+ }
135
+
136
+ template <typename T>
137
+ inline void replace(VALUE value, rb_data_type_t* rb_type, T* data, bool isOwner)
138
+ {
139
+ WrapperPointer<T>* wrapper = nullptr;
140
+ TypedData_Get_Struct(value, WrapperPointer<T>, rb_type, wrapper);
141
+ delete wrapper;
142
+
143
+ wrapper = new WrapperPointer<T>(data, true);
144
+ RTYPEDDATA_DATA(value) = wrapper;
145
+ }
146
+
147
+ inline Wrapper* getWrapper(VALUE value)
148
+ {
149
+ return static_cast<Wrapper*>(RTYPEDDATA_DATA(value));
150
+ }
151
+ } // namespace
@@ -1,23 +1,12 @@
1
1
  #ifndef Rice__detail__default_allocation_func__hpp_
2
2
  #define Rice__detail__default_allocation_func__hpp_
3
3
 
4
- namespace Rice
4
+ namespace Rice::detail
5
5
  {
6
-
7
- namespace detail
8
- {
9
-
10
- //! A default implementation of an allocate_func. This function does no
11
- //! actual allocation; the initialize_func can later do the real
12
- //! allocation with: DATA_PTR(self) = new Type(arg1, arg2, ...)
13
- template<typename T>
14
- VALUE default_allocation_func(VALUE klass);
15
-
16
- } // detail
17
-
18
- } // Rice
19
-
20
- #include "default_allocation_func.ipp"
21
-
22
- #endif // Rice__detail__default_allocation_func__hpp_
23
-
6
+ //! A default implementation of an allocate_func. This function does no
7
+ //! actual allocation; the initialize_func can later do the real
8
+ //! allocation with: DATA_PTR(self) = new Type(arg1, arg2, ...)
9
+ template<typename T>
10
+ VALUE default_allocation_func(VALUE klass);
11
+ }
12
+ #endif // Rice__detail__default_allocation_func__hpp_
@@ -1,11 +1,12 @@
1
1
  #include "../Data_Object.hpp"
2
2
 
3
- template<typename T>
4
- VALUE Rice::detail::
5
- default_allocation_func(VALUE klass)
3
+ namespace Rice::detail
6
4
  {
7
- Data_Object<T> m(static_cast<T*>(0), klass);
8
- return m.value();
9
- }
10
-
11
-
5
+ template<typename T>
6
+ VALUE default_allocation_func(VALUE klass)
7
+ {
8
+ // Create a new Ruby object but since we do not yet have a C++ object
9
+ // just pass a nullptr. It will be set via the Constructor call
10
+ return TypedData_Wrap_Struct(klass, Data_Type<T>::rb_type(), nullptr);
11
+ }
12
+ }
@@ -1,43 +1,8 @@
1
1
  #ifndef Rice__detail__from_ruby__hpp_
2
2
  #define Rice__detail__from_ruby__hpp_
3
3
 
4
- namespace Rice
5
- {
6
- namespace detail
7
- {
8
- template<typename T>
9
- struct from_ruby_
10
- {
11
- typedef T Retval_T;
12
-
13
- static T convert(Rice::Object x);
14
- };
15
-
16
- template<typename T>
17
- struct from_ruby_<T *>
18
- {
19
- typedef T * Retval_T;
20
-
21
- static T * convert(Rice::Object x);
22
- };
23
-
24
- template<typename T>
25
- struct from_ruby_<T const *>
26
- {
27
- typedef T const * Retval_T;
28
-
29
- static T const * convert(Rice::Object x);
30
- };
31
-
32
- template<typename T>
33
- struct from_ruby_<T &>
34
- {
35
- typedef T & Retval_T;
36
-
37
- static T & convert(Rice::Object x);
38
- };
39
- } // detail
40
- } // Rice
4
+ #include "from_ruby_defn.hpp"
5
+ #include "from_ruby.ipp"
41
6
 
42
7
  #endif // Rice__detail__from_ruby__hpp_
43
8