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
@@ -1,11 +1,9 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Constructor.hpp"
3
- #include "rice/Data_Type.hpp"
2
+ #include "embed_ruby.hpp"
4
3
 
5
- #include "rice/detail/env.hpp"
4
+ #include <rice/rice.hpp>
6
5
 
7
6
  #include <iostream>
8
- using namespace std;
9
7
 
10
8
  using namespace Rice;
11
9
 
@@ -22,12 +20,15 @@ namespace
22
20
  };
23
21
  }
24
22
 
23
+ SETUP(Array)
24
+ {
25
+ embed_ruby();
26
+ }
27
+
25
28
  TESTCASE(default_constructor)
26
29
  {
27
- Data_Type<Default_Constructible> rb_cDefault_Constructible(
28
- anonymous_class());
29
- rb_cDefault_Constructible
30
- .define_constructor(Constructor<Default_Constructible>());
30
+ Data_Type<Default_Constructible> rb_cDefault_Constructible(anonymous_class());
31
+ rb_cDefault_Constructible.define_constructor(Constructor<Default_Constructible>());
31
32
  Object o = rb_cDefault_Constructible.call("new");
32
33
  ASSERT_EQUAL(rb_cDefault_Constructible, o.class_of());
33
34
  }
@@ -96,7 +97,7 @@ TESTCASE(constructor_supports_default_arguments)
96
97
  {
97
98
  Class klass = define_class<WithDefaultArgs>("WithDefaultArgs").
98
99
  define_constructor(Constructor<WithDefaultArgs, int, float, bool>(),
99
- ( Arg("x"), Arg("y") = (float)2.0, Arg("yes") = (bool)false ));
100
+ Arg("x"), Arg("y") = (float)2.0, Arg("yes") = (bool)false);
100
101
 
101
102
  klass.call("new", 4);
102
103
  ASSERT_EQUAL(4, withArgsX);
@@ -1,8 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Data_Object.hpp"
4
- #include "rice/Data_Type.hpp"
5
- #include "rice/Exception.hpp"
3
+ #include <rice/rice.hpp>
6
4
 
7
5
  using namespace Rice;
8
6
 
@@ -10,267 +8,210 @@ TESTSUITE(Data_Object);
10
8
 
11
9
  namespace
12
10
  {
13
- struct Foo { Foo() : x_(42) { } int x_; };
11
+ bool test_destructor_called = false;
12
+ bool test_ruby_mark_called = false;
14
13
 
15
- bool test_ruby_mark__marked = false;
14
+ struct MyDataType
15
+ {
16
+ MyDataType() : x(42)
17
+ {
18
+ }
19
+
20
+ ~MyDataType()
21
+ {
22
+ test_destructor_called = true;
23
+ }
24
+
25
+ int x;
26
+ };
27
+
28
+ struct Bar
29
+ {
30
+ };
16
31
  }
17
32
 
18
- template<>
19
- void ruby_mark(Foo * foo)
33
+ namespace Rice
20
34
  {
21
- test_ruby_mark__marked = true;
35
+ template<>
36
+ void ruby_mark(MyDataType* myDataType)
37
+ {
38
+ test_ruby_mark_called = true;
39
+ }
22
40
  }
23
41
 
24
42
  SETUP(Data_Object)
25
43
  {
26
44
  embed_ruby();
27
45
 
28
- if(!Data_Type<Foo>::is_bound())
46
+ if (!Data_Type<MyDataType>::is_bound())
29
47
  {
30
48
  Class object(rb_cObject);
31
- if(object.const_defined("Foo"))
49
+ if(object.const_defined("MyDataType"))
32
50
  {
33
- object.remove_const("Foo");
51
+ object.remove_const("MyDataType");
34
52
  }
35
53
 
36
- define_class<Foo>("Foo");
54
+ define_class<MyDataType>("MyDataType");
55
+ define_class<Bar>("Bar");
37
56
  }
38
57
  }
39
58
 
40
- TESTCASE(construct_from_pointer_with_defaults)
59
+ TESTCASE(construct_from_pointer)
41
60
  {
42
- Data_Type<Foo> rb_cFoo;
43
- Foo * foo = new Foo;
44
- Data_Object<Foo> wrapped_foo(foo);
45
- ASSERT_EQUAL(foo, wrapped_foo.get());
46
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
47
- typedef void (*Mark_Func)(void *);
48
- typedef void (*Mark_Func_Foo)(Foo *);
49
- Mark_Func expected_mark_func =
50
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
51
- ASSERT_EQUAL(
52
- expected_mark_func,
53
- RDATA(wrapped_foo.value())->dmark);
54
- ASSERT_EQUAL(
55
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
56
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
57
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
61
+ MyDataType* myDataType = new MyDataType;
62
+ Data_Object<MyDataType> wrapped_foo(myDataType);
63
+ ASSERT_EQUAL(myDataType, wrapped_foo.get());
64
+ ASSERT_EQUAL(Data_Type<MyDataType>::klass(), wrapped_foo.class_of());
65
+ ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::rb_type()));
58
66
  }
59
67
 
60
- TESTCASE(construct_from_pointer_and_klass)
68
+ TESTCASE(construct_from_ruby_object)
61
69
  {
62
- Data_Type<Foo> rb_cFoo;
63
- Foo * foo = new Foo;
64
- Data_Object<Foo> wrapped_foo(foo, Data_Type<Foo>::klass());
65
- ASSERT_EQUAL(foo, wrapped_foo.get());
66
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
67
- typedef void (*Mark_Func)(void *);
68
- typedef void (*Mark_Func_Foo)(Foo *);
69
- Mark_Func expected_mark_func =
70
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
71
- ASSERT_EQUAL(
72
- expected_mark_func,
73
- RDATA(wrapped_foo.value())->dmark);
74
- ASSERT_EQUAL(
75
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
76
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
77
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
78
- }
70
+ MyDataType * myDataType = new MyDataType;
71
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
79
72
 
80
- TESTCASE(construct_from_pointer_and_alternate_klass)
81
- {
82
- Data_Type<Foo> rb_cFoo;
83
- Foo * foo = new Foo;
84
- Data_Object<Foo> wrapped_foo(foo, rb_cObject);
85
- ASSERT_EQUAL(foo, wrapped_foo.get());
86
- ASSERT_EQUAL(rb_cObject, CLASS_OF(wrapped_foo.value()));
87
- typedef void (*Mark_Func)(void *);
88
- typedef void (*Mark_Func_Foo)(Foo *);
89
- Mark_Func expected_mark_func =
90
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
91
- ASSERT_EQUAL(
92
- expected_mark_func,
93
- RDATA(wrapped_foo.value())->dmark);
94
- ASSERT_EQUAL(
95
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
96
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
97
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
73
+ Data_Object<MyDataType> data_object_foo(wrapped_foo);
74
+ ASSERT_EQUAL(myDataType, data_object_foo.get());
75
+ ASSERT_EQUAL(Data_Type<MyDataType>::klass(), data_object_foo.class_of());
76
+ ASSERT_EQUAL(RTYPEDDATA(wrapped_foo), RTYPEDDATA(data_object_foo.value()));
77
+ ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::rb_type()));
98
78
  }
99
79
 
100
- namespace
80
+ TESTCASE(construct_from_ruby_object_and_wrong_class)
101
81
  {
102
- void dummy_mark(Foo *)
103
- {
104
- }
105
- }
82
+ MyDataType * myDataType = new MyDataType;
83
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
106
84
 
107
- TESTCASE(construct_from_pointer_and_klass_and_mark_function)
108
- {
109
- Data_Type<Foo> rb_cFoo;
110
- Foo * foo = new Foo;
111
- Data_Object<Foo> wrapped_foo(foo, rb_cFoo, dummy_mark);
112
- ASSERT_EQUAL(foo, wrapped_foo.get());
113
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
114
- ASSERT_EQUAL((void *)dummy_mark, RDATA(wrapped_foo.value())->dmark);
115
- ASSERT_EQUAL(
116
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
117
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
118
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
119
- }
85
+ ASSERT_EXCEPTION_CHECK(
86
+ Exception,
87
+ Data_Object<Bar> bar(wrapped_foo),
88
+ ASSERT_EQUAL(rb_eTypeError, CLASS_OF(ex.value())));
120
89
 
121
- namespace
122
- {
123
- void my_free(Foo * f)
124
- {
125
- delete f;
126
- }
90
+ ASSERT_EXCEPTION_CHECK(
91
+ Exception,
92
+ Data_Object<Bar> bar(wrapped_foo),
93
+ ASSERT_EQUAL("Wrong argument type. Expected: Bar. Received: MyDataType.", ex.what()));
127
94
  }
128
95
 
129
- TESTCASE(construct_from_pointer_and_klass_and_mark_and_free)
96
+ TESTCASE(copy_construct)
130
97
  {
131
- Data_Type<Foo> rb_cFoo;
132
- Foo * foo = new Foo;
133
- Data_Object<Foo> wrapped_foo(foo, rb_cFoo, dummy_mark, my_free);
134
- ASSERT_EQUAL(foo, wrapped_foo.get());
135
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
136
- ASSERT_EQUAL((void *)dummy_mark, RDATA(wrapped_foo.value())->dmark);
137
- ASSERT_EQUAL(
138
- RUBY_DATA_FUNC(my_free),
139
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
140
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
141
- }
98
+ MyDataType * myDataType = new MyDataType;
99
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
100
+ Data_Object<MyDataType> orig_data_object_foo(wrapped_foo);
101
+ Data_Object<MyDataType> data_object_foo(orig_data_object_foo);
142
102
 
143
- TESTCASE(construct_from_ruby_object)
144
- {
145
- Foo * foo = new Foo;
146
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
147
- Data_Object<Foo> data_object_foo(wrapped_foo);
148
- ASSERT_EQUAL(foo, data_object_foo.get());
149
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
150
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
151
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
152
- ASSERT_EQUAL(
153
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
154
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
155
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
103
+ ASSERT_EQUAL(myDataType, data_object_foo.get());
104
+ ASSERT_EQUAL(Data_Type<MyDataType>::klass(), data_object_foo.class_of());
105
+ ASSERT_EQUAL(RTYPEDDATA(wrapped_foo), RTYPEDDATA(data_object_foo.value()));
106
+ ASSERT_EQUAL(myDataType, detail::unwrap<MyDataType>(wrapped_foo, Data_Type<MyDataType>::rb_type()));
156
107
  }
157
108
 
158
- TESTCASE(construct_from_ruby_object_and_class)
109
+ TESTCASE(move_construct)
159
110
  {
160
- Data_Type<Foo> rb_cFoo;
161
- Foo * foo = new Foo;
162
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
163
- Data_Object<Foo> data_object_foo(wrapped_foo, rb_cFoo);
164
- ASSERT_EQUAL(foo, data_object_foo.get());
165
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
166
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
167
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
168
- ASSERT_EQUAL(
169
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
170
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
171
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
172
- }
111
+ MyDataType* myDataType = new MyDataType;
173
112
 
174
- TESTCASE(construct_from_ruby_object_and_wrong_class)
175
- {
176
- Foo * foo = new Foo;
177
- Data_Type<Foo> rb_cFoo;
178
- VALUE wrapped_foo = Data_Wrap_Struct(rb_cObject, 0, Default_Free_Function<Foo>::free, foo);
179
- ASSERT_EXCEPTION_CHECK(
180
- Exception,
181
- Data_Object<Foo> data_object_foo(wrapped_foo, rb_cFoo),
182
- ASSERT_EQUAL(
183
- Object(rb_eTypeError),
184
- Object(CLASS_OF(ex.value()))
185
- )
186
- );
113
+ Data_Object<MyDataType> wrapper1(myDataType);
114
+ Data_Object<MyDataType> wrapper2(std::move(wrapper1));
115
+
116
+ ASSERT_EQUAL(myDataType, wrapper2.get());
117
+ ASSERT((wrapper1.get() == nullptr));
187
118
  }
188
119
 
189
- TESTCASE(copy_construct)
120
+ TESTCASE(move_assign)
190
121
  {
191
- Data_Type<Foo> rb_cFoo;
192
- Foo * foo = new Foo;
193
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
194
- Data_Object<Foo> orig_data_object_foo(wrapped_foo, rb_cFoo);
195
- Data_Object<Foo> data_object_foo(orig_data_object_foo);
196
- ASSERT_EQUAL(foo, data_object_foo.get());
197
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
198
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
199
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
200
- ASSERT_EQUAL(
201
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
202
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
203
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
122
+ MyDataType* foo1 = new MyDataType;
123
+ Data_Object<MyDataType> wrapper1(foo1);
124
+
125
+ MyDataType* foo2 = new MyDataType;
126
+ Data_Object<MyDataType> wrapper2(foo2);
127
+
128
+ wrapper2 = std::move(wrapper1);
129
+
130
+ ASSERT_EQUAL(foo1, wrapper2.get());
131
+ ASSERT((wrapper1.get() == nullptr));
204
132
  }
205
133
 
206
134
  TESTCASE(dereference)
207
135
  {
208
- Data_Type<Foo> rb_cFoo;
209
- Foo * foo = new Foo;
210
- Data_Object<Foo> wrapped_foo(foo);
211
- ASSERT_EQUAL(foo, &*wrapped_foo);
136
+ Data_Type<MyDataType> rb_cFoo;
137
+ MyDataType * myDataType = new MyDataType;
138
+ Data_Object<MyDataType> wrapped_foo(myDataType);
139
+ ASSERT_EQUAL(myDataType, &*wrapped_foo);
212
140
  }
213
141
 
214
142
  TESTCASE(arrow)
215
143
  {
216
- Data_Type<Foo> rb_cFoo;
217
- Foo * foo = new Foo;
218
- Data_Object<Foo> wrapped_foo(foo);
219
- ASSERT_EQUAL(42, foo->x_);
144
+ Data_Type<MyDataType> rb_cFoo;
145
+ MyDataType * myDataType = new MyDataType;
146
+ Data_Object<MyDataType> wrapped_foo(myDataType);
147
+ ASSERT_EQUAL(42, myDataType->x);
220
148
  }
221
149
 
222
150
  TESTCASE(get)
223
151
  {
224
- Data_Type<Foo> rb_cFoo;
225
- Foo * foo = new Foo;
226
- Data_Object<Foo> wrapped_foo(foo);
227
- ASSERT_EQUAL(foo, wrapped_foo.get());
152
+ Data_Type<MyDataType> rb_cFoo;
153
+ MyDataType * myDataType = new MyDataType;
154
+ Data_Object<MyDataType> wrapped_foo(myDataType);
155
+ ASSERT_EQUAL(myDataType, wrapped_foo.get());
228
156
  }
229
157
 
230
- // TODO: swap
231
-
232
158
  TESTCASE(to_ruby)
233
159
  {
234
- Data_Type<Foo> rb_cFoo;
235
- Foo * foo = new Foo;
236
- Data_Object<Foo> wrapped_foo(foo);
237
- ASSERT_EQUAL(wrapped_foo.value(), to_ruby(wrapped_foo).value());
160
+ Data_Type<MyDataType> rb_cFoo;
161
+ MyDataType * myDataType = new MyDataType;
162
+ Data_Object<MyDataType> wrapped_foo(myDataType);
163
+ ASSERT_EQUAL(String("MyDataType"), wrapped_foo.class_name());
238
164
  }
239
165
 
240
166
  TESTCASE(from_ruby)
241
167
  {
242
- Data_Type<Foo> rb_cFoo;
243
- Foo * foo = new Foo;
244
- Data_Object<Foo> wrapped_foo(foo);
245
- ASSERT_EQUAL(foo, from_ruby<Foo *>(wrapped_foo));
168
+ Data_Type<MyDataType> rb_cFoo;
169
+ MyDataType* myDataType = new MyDataType();
170
+ Data_Object<MyDataType> wrapped_foo(myDataType);
171
+ ASSERT_EQUAL(myDataType, wrapped_foo.get());
246
172
  }
247
173
 
248
174
  TESTCASE(from_ruby_const_ref)
249
175
  {
250
- Data_Type<Foo> rb_cFoo;
251
- Foo * foo = new Foo;
252
- Data_Object<Foo> wrapped_foo(foo);
253
- ASSERT_EQUAL(foo->x_, from_ruby<Foo const &>(wrapped_foo).x_);
176
+ Data_Type<MyDataType> rb_cFoo;
177
+ MyDataType * myDataType = new MyDataType;
178
+ Data_Object<MyDataType> wrapped_foo(myDataType);
179
+ ASSERT_EQUAL(myDataType->x, detail::From_Ruby<MyDataType const &>().convert(wrapped_foo).x);
254
180
  }
255
181
 
256
182
  TESTCASE(from_ruby_copy)
257
183
  {
258
- Data_Type<Foo> rb_cFoo;
259
- Foo * foo = new Foo;
260
- Data_Object<Foo> wrapped_foo(foo);
261
- ASSERT_EQUAL(foo->x_, from_ruby<Foo>(wrapped_foo).x_);
184
+ Data_Type<MyDataType> rb_cFoo;
185
+ MyDataType * myDataType = new MyDataType;
186
+ Data_Object<MyDataType> wrapped_foo(myDataType);
187
+ ASSERT_EQUAL(myDataType->x, detail::From_Ruby<MyDataType>().convert(wrapped_foo).x);
262
188
  }
263
189
 
264
- TESTCASE(ruby_mark)
190
+ TESTCASE(ruby_custom_mark)
265
191
  {
266
- Data_Type<Foo> rb_cFoo;
267
- Foo * foo = new Foo;
268
- Data_Object<Foo> wrapped_foo(foo);
269
-
270
- test_ruby_mark__marked = false;
192
+ test_ruby_mark_called = false;
271
193
 
194
+ MyDataType* myDataType = new MyDataType;
195
+ Data_Object<MyDataType> wrapped_foo(myDataType);
272
196
  rb_gc_start();
273
197
 
274
- ASSERT_EQUAL(true, test_ruby_mark__marked);
198
+ ASSERT_EQUAL(true, test_ruby_mark_called);
275
199
  }
276
200
 
201
+ TESTCASE(ruby_custom_free)
202
+ {
203
+ test_ruby_mark_called = false;
204
+ test_destructor_called = false;
205
+
206
+ MyDataType* myDataType = new MyDataType;
207
+ {
208
+ Data_Object<MyDataType> wrapped_foo(myDataType, true);
209
+ }
210
+
211
+ rb_gc_start();
212
+
213
+ ASSERT_EQUAL(true, test_destructor_called);
214
+ // This fails somtimes on Ubuntu with Ruby 2.5 and 2.6. The important thing is that the destructor
215
+ // gets called
216
+ // ASSERT_EQUAL(false, test_ruby_mark_called);
217
+ }