rice 2.1.1 → 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 (246) hide show
  1. checksums.yaml +5 -5
  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 +69 -0
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -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 +30 -376
  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 +14 -9
  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 -49
  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 +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -274
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +117 -137
  128. data/Doxyfile +0 -2280
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README +0 -1055
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -142
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7481
  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 -124
  173. data/rice/Makefile.in +0 -839
  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 -625
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -503
  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 -486
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1150
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -480
  246. data/test/test_rice.rb +0 -41
@@ -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,7 +1,6 @@
1
1
  #include "unittest.hpp"
2
- #include "rice/Data_Object.hpp"
3
- #include "rice/Data_Type.hpp"
4
- #include "rice/Exception.hpp"
2
+ #include "embed_ruby.hpp"
3
+ #include <rice/rice.hpp>
5
4
 
6
5
  using namespace Rice;
7
6
 
@@ -9,267 +8,210 @@ TESTSUITE(Data_Object);
9
8
 
10
9
  namespace
11
10
  {
12
- struct Foo { Foo() : x_(42) { } int x_; };
11
+ bool test_destructor_called = false;
12
+ bool test_ruby_mark_called = false;
13
13
 
14
- 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
+ };
15
31
  }
16
32
 
17
- template<>
18
- void ruby_mark(Foo * foo)
33
+ namespace Rice
19
34
  {
20
- test_ruby_mark__marked = true;
35
+ template<>
36
+ void ruby_mark(MyDataType* myDataType)
37
+ {
38
+ test_ruby_mark_called = true;
39
+ }
21
40
  }
22
41
 
23
42
  SETUP(Data_Object)
24
43
  {
25
- ruby_init();
44
+ embed_ruby();
26
45
 
27
- if(!Data_Type<Foo>::is_bound())
46
+ if (!Data_Type<MyDataType>::is_bound())
28
47
  {
29
48
  Class object(rb_cObject);
30
- if(object.const_defined("Foo"))
49
+ if(object.const_defined("MyDataType"))
31
50
  {
32
- object.remove_const("Foo");
51
+ object.remove_const("MyDataType");
33
52
  }
34
53
 
35
- define_class<Foo>("Foo");
54
+ define_class<MyDataType>("MyDataType");
55
+ define_class<Bar>("Bar");
36
56
  }
37
57
  }
38
58
 
39
- TESTCASE(construct_from_pointer_with_defaults)
59
+ TESTCASE(construct_from_pointer)
40
60
  {
41
- Data_Type<Foo> rb_cFoo;
42
- Foo * foo = new Foo;
43
- Data_Object<Foo> wrapped_foo(foo);
44
- ASSERT_EQUAL(foo, wrapped_foo.get());
45
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
46
- typedef void (*Mark_Func)(void *);
47
- typedef void (*Mark_Func_Foo)(Foo *);
48
- Mark_Func expected_mark_func =
49
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
50
- ASSERT_EQUAL(
51
- expected_mark_func,
52
- RDATA(wrapped_foo.value())->dmark);
53
- ASSERT_EQUAL(
54
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
55
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
56
- 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()));
57
66
  }
58
67
 
59
- TESTCASE(construct_from_pointer_and_klass)
68
+ TESTCASE(construct_from_ruby_object)
60
69
  {
61
- Data_Type<Foo> rb_cFoo;
62
- Foo * foo = new Foo;
63
- Data_Object<Foo> wrapped_foo(foo, Data_Type<Foo>::klass());
64
- ASSERT_EQUAL(foo, wrapped_foo.get());
65
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
66
- typedef void (*Mark_Func)(void *);
67
- typedef void (*Mark_Func_Foo)(Foo *);
68
- Mark_Func expected_mark_func =
69
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
70
- ASSERT_EQUAL(
71
- expected_mark_func,
72
- RDATA(wrapped_foo.value())->dmark);
73
- ASSERT_EQUAL(
74
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
75
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
76
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
77
- }
70
+ MyDataType * myDataType = new MyDataType;
71
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
78
72
 
79
- TESTCASE(construct_from_pointer_and_alternate_klass)
80
- {
81
- Data_Type<Foo> rb_cFoo;
82
- Foo * foo = new Foo;
83
- Data_Object<Foo> wrapped_foo(foo, rb_cObject);
84
- ASSERT_EQUAL(foo, wrapped_foo.get());
85
- ASSERT_EQUAL(rb_cObject, CLASS_OF(wrapped_foo.value()));
86
- typedef void (*Mark_Func)(void *);
87
- typedef void (*Mark_Func_Foo)(Foo *);
88
- Mark_Func expected_mark_func =
89
- Mark_Func(Mark_Func_Foo(ruby_mark<Foo>));
90
- ASSERT_EQUAL(
91
- expected_mark_func,
92
- RDATA(wrapped_foo.value())->dmark);
93
- ASSERT_EQUAL(
94
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
95
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
96
- 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()));
97
78
  }
98
79
 
99
- namespace
80
+ TESTCASE(construct_from_ruby_object_and_wrong_class)
100
81
  {
101
- void dummy_mark(Foo *)
102
- {
103
- }
104
- }
82
+ MyDataType * myDataType = new MyDataType;
83
+ VALUE wrapped_foo = detail::wrap(Data_Type<MyDataType>::klass(), Data_Type<MyDataType>::rb_type(), myDataType, true);
105
84
 
106
- TESTCASE(construct_from_pointer_and_klass_and_mark_function)
107
- {
108
- Data_Type<Foo> rb_cFoo;
109
- Foo * foo = new Foo;
110
- Data_Object<Foo> wrapped_foo(foo, rb_cFoo, dummy_mark);
111
- ASSERT_EQUAL(foo, wrapped_foo.get());
112
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
113
- ASSERT_EQUAL((void *)dummy_mark, RDATA(wrapped_foo.value())->dmark);
114
- ASSERT_EQUAL(
115
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
116
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
117
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
118
- }
85
+ ASSERT_EXCEPTION_CHECK(
86
+ Exception,
87
+ Data_Object<Bar> bar(wrapped_foo),
88
+ ASSERT_EQUAL(rb_eTypeError, CLASS_OF(ex.value())));
119
89
 
120
- namespace
121
- {
122
- void my_free(Foo * f)
123
- {
124
- delete f;
125
- }
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()));
126
94
  }
127
95
 
128
- TESTCASE(construct_from_pointer_and_klass_and_mark_and_free)
96
+ TESTCASE(copy_construct)
129
97
  {
130
- Data_Type<Foo> rb_cFoo;
131
- Foo * foo = new Foo;
132
- Data_Object<Foo> wrapped_foo(foo, rb_cFoo, dummy_mark, my_free);
133
- ASSERT_EQUAL(foo, wrapped_foo.get());
134
- ASSERT_EQUAL(Data_Type<Foo>::klass(), wrapped_foo.class_of());
135
- ASSERT_EQUAL((void *)dummy_mark, RDATA(wrapped_foo.value())->dmark);
136
- ASSERT_EQUAL(
137
- RUBY_DATA_FUNC(my_free),
138
- RUBY_DATA_FUNC(RDATA(wrapped_foo.value())->dfree));
139
- ASSERT_EQUAL(foo, DATA_PTR(wrapped_foo.value()));
140
- }
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);
141
102
 
142
- TESTCASE(construct_from_ruby_object)
143
- {
144
- Foo * foo = new Foo;
145
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
146
- Data_Object<Foo> data_object_foo(wrapped_foo);
147
- ASSERT_EQUAL(foo, data_object_foo.get());
148
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
149
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
150
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
151
- ASSERT_EQUAL(
152
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
153
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
154
- 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()));
155
107
  }
156
108
 
157
- TESTCASE(construct_from_ruby_object_and_class)
109
+ TESTCASE(move_construct)
158
110
  {
159
- Data_Type<Foo> rb_cFoo;
160
- Foo * foo = new Foo;
161
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
162
- Data_Object<Foo> data_object_foo(wrapped_foo, rb_cFoo);
163
- ASSERT_EQUAL(foo, data_object_foo.get());
164
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
165
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
166
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
167
- ASSERT_EQUAL(
168
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
169
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
170
- ASSERT_EQUAL(foo, DATA_PTR(data_object_foo.value()));
171
- }
111
+ MyDataType* myDataType = new MyDataType;
172
112
 
173
- TESTCASE(construct_from_ruby_object_and_wrong_class)
174
- {
175
- Foo * foo = new Foo;
176
- Data_Type<Foo> rb_cFoo;
177
- VALUE wrapped_foo = Data_Wrap_Struct(rb_cObject, 0, Default_Free_Function<Foo>::free, foo);
178
- ASSERT_EXCEPTION_CHECK(
179
- Exception,
180
- Data_Object<Foo> data_object_foo(wrapped_foo, rb_cFoo),
181
- ASSERT_EQUAL(
182
- Object(rb_eTypeError),
183
- Object(CLASS_OF(ex.value()))
184
- )
185
- );
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));
186
118
  }
187
119
 
188
- TESTCASE(copy_construct)
120
+ TESTCASE(move_assign)
189
121
  {
190
- Data_Type<Foo> rb_cFoo;
191
- Foo * foo = new Foo;
192
- VALUE wrapped_foo = Data_Wrap_Struct(Data_Type<Foo>::klass(), 0, Default_Free_Function<Foo>::free, foo);
193
- Data_Object<Foo> orig_data_object_foo(wrapped_foo, rb_cFoo);
194
- Data_Object<Foo> data_object_foo(orig_data_object_foo);
195
- ASSERT_EQUAL(foo, data_object_foo.get());
196
- ASSERT_EQUAL(Data_Type<Foo>::klass(), data_object_foo.class_of());
197
- ASSERT_EQUAL(RDATA(wrapped_foo), RDATA(data_object_foo.value()));
198
- ASSERT_EQUAL(RUBY_DATA_FUNC(0), RDATA(data_object_foo.value())->dmark);
199
- ASSERT_EQUAL(
200
- RUBY_DATA_FUNC(Default_Free_Function<Foo>::free),
201
- RUBY_DATA_FUNC(RDATA(data_object_foo.value())->dfree));
202
- 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));
203
132
  }
204
133
 
205
134
  TESTCASE(dereference)
206
135
  {
207
- Data_Type<Foo> rb_cFoo;
208
- Foo * foo = new Foo;
209
- Data_Object<Foo> wrapped_foo(foo);
210
- 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);
211
140
  }
212
141
 
213
142
  TESTCASE(arrow)
214
143
  {
215
- Data_Type<Foo> rb_cFoo;
216
- Foo * foo = new Foo;
217
- Data_Object<Foo> wrapped_foo(foo);
218
- 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);
219
148
  }
220
149
 
221
150
  TESTCASE(get)
222
151
  {
223
- Data_Type<Foo> rb_cFoo;
224
- Foo * foo = new Foo;
225
- Data_Object<Foo> wrapped_foo(foo);
226
- 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());
227
156
  }
228
157
 
229
- // TODO: swap
230
-
231
158
  TESTCASE(to_ruby)
232
159
  {
233
- Data_Type<Foo> rb_cFoo;
234
- Foo * foo = new Foo;
235
- Data_Object<Foo> wrapped_foo(foo);
236
- 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());
237
164
  }
238
165
 
239
166
  TESTCASE(from_ruby)
240
167
  {
241
- Data_Type<Foo> rb_cFoo;
242
- Foo * foo = new Foo;
243
- Data_Object<Foo> wrapped_foo(foo);
244
- 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());
245
172
  }
246
173
 
247
174
  TESTCASE(from_ruby_const_ref)
248
175
  {
249
- Data_Type<Foo> rb_cFoo;
250
- Foo * foo = new Foo;
251
- Data_Object<Foo> wrapped_foo(foo);
252
- 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);
253
180
  }
254
181
 
255
182
  TESTCASE(from_ruby_copy)
256
183
  {
257
- Data_Type<Foo> rb_cFoo;
258
- Foo * foo = new Foo;
259
- Data_Object<Foo> wrapped_foo(foo);
260
- 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);
261
188
  }
262
189
 
263
- TESTCASE(ruby_mark)
190
+ TESTCASE(ruby_custom_mark)
264
191
  {
265
- Data_Type<Foo> rb_cFoo;
266
- Foo * foo = new Foo;
267
- Data_Object<Foo> wrapped_foo(foo);
268
-
269
- test_ruby_mark__marked = false;
192
+ test_ruby_mark_called = false;
270
193
 
194
+ MyDataType* myDataType = new MyDataType;
195
+ Data_Object<MyDataType> wrapped_foo(myDataType);
271
196
  rb_gc_start();
272
197
 
273
- ASSERT_EQUAL(true, test_ruby_mark__marked);
198
+ ASSERT_EQUAL(true, test_ruby_mark_called);
274
199
  }
275
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
+ }