rice 2.1.3 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +45 -1028
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/include/rice/stl.hpp +1113 -0
  10. data/lib/mkmf-rice.rb +127 -0
  11. data/lib/version.rb +3 -0
  12. data/rice/Address_Registration_Guard.ipp +75 -32
  13. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  14. data/rice/Arg.hpp +80 -4
  15. data/rice/Arg.ipp +51 -0
  16. data/rice/Constructor.hpp +30 -376
  17. data/rice/Data_Object.ipp +234 -107
  18. data/rice/Data_Object_defn.hpp +77 -117
  19. data/rice/Data_Type.hpp +1 -2
  20. data/rice/Data_Type.ipp +251 -295
  21. data/rice/Data_Type_defn.hpp +175 -243
  22. data/rice/Director.hpp +14 -9
  23. data/rice/Enum.hpp +54 -104
  24. data/rice/Enum.ipp +104 -230
  25. data/rice/Exception.hpp +2 -8
  26. data/rice/Exception.ipp +65 -0
  27. data/rice/Exception_defn.hpp +46 -47
  28. data/rice/Identifier.hpp +28 -28
  29. data/rice/Identifier.ipp +23 -27
  30. data/rice/Return.hpp +39 -0
  31. data/rice/Return.ipp +33 -0
  32. data/rice/detail/Exception_Handler.ipp +22 -62
  33. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  34. data/rice/detail/Iterator.hpp +18 -88
  35. data/rice/detail/Iterator.ipp +47 -0
  36. data/rice/detail/Jump_Tag.hpp +21 -0
  37. data/rice/detail/MethodInfo.hpp +44 -0
  38. data/rice/detail/MethodInfo.ipp +78 -0
  39. data/rice/detail/NativeAttribute.hpp +53 -0
  40. data/rice/detail/NativeAttribute.ipp +83 -0
  41. data/rice/detail/NativeFunction.hpp +69 -0
  42. data/rice/detail/NativeFunction.ipp +248 -0
  43. data/rice/detail/RubyFunction.hpp +39 -0
  44. data/rice/detail/RubyFunction.ipp +92 -0
  45. data/rice/detail/Type.hpp +29 -0
  46. data/rice/detail/Type.ipp +138 -0
  47. data/rice/detail/TypeRegistry.hpp +50 -0
  48. data/rice/detail/TypeRegistry.ipp +106 -0
  49. data/rice/detail/Wrapper.hpp +51 -0
  50. data/rice/detail/Wrapper.ipp +151 -0
  51. data/rice/detail/default_allocation_func.hpp +8 -19
  52. data/rice/detail/default_allocation_func.ipp +9 -8
  53. data/rice/detail/from_ruby.hpp +2 -37
  54. data/rice/detail/from_ruby.ipp +1020 -46
  55. data/rice/detail/from_ruby_defn.hpp +38 -0
  56. data/rice/detail/function_traits.hpp +124 -0
  57. data/rice/detail/method_data.hpp +23 -15
  58. data/rice/detail/method_data.ipp +53 -0
  59. data/rice/detail/rice_traits.hpp +116 -0
  60. data/rice/detail/ruby.hpp +9 -50
  61. data/rice/detail/to_ruby.hpp +3 -17
  62. data/rice/detail/to_ruby.ipp +409 -31
  63. data/rice/detail/to_ruby_defn.hpp +48 -0
  64. data/rice/forward_declares.ipp +82 -0
  65. data/rice/global_function.hpp +16 -20
  66. data/rice/global_function.ipp +8 -17
  67. data/rice/rice.hpp +59 -0
  68. data/rice/ruby_mark.hpp +5 -3
  69. data/rice/ruby_try_catch.hpp +4 -4
  70. data/rice/stl.hpp +11 -0
  71. data/sample/callbacks/extconf.rb +6 -0
  72. data/sample/callbacks/sample_callbacks.cpp +35 -0
  73. data/sample/callbacks/test.rb +28 -0
  74. data/sample/enum/extconf.rb +3 -0
  75. data/sample/enum/sample_enum.cpp +3 -17
  76. data/sample/enum/test.rb +2 -2
  77. data/sample/inheritance/animals.cpp +8 -24
  78. data/sample/inheritance/extconf.rb +3 -0
  79. data/sample/inheritance/test.rb +1 -1
  80. data/sample/map/extconf.rb +3 -0
  81. data/sample/map/map.cpp +10 -18
  82. data/sample/map/test.rb +1 -1
  83. data/test/embed_ruby.cpp +34 -0
  84. data/test/embed_ruby.hpp +4 -0
  85. data/test/ext/t1/extconf.rb +3 -0
  86. data/test/ext/t1/t1.cpp +1 -3
  87. data/test/ext/t2/extconf.rb +3 -0
  88. data/test/ext/t2/t2.cpp +1 -1
  89. data/test/extconf.rb +23 -0
  90. data/test/ruby/test_callbacks_sample.rb +28 -0
  91. data/test/ruby/test_multiple_extensions.rb +18 -0
  92. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  93. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  94. data/test/test_Address_Registration_Guard.cpp +25 -11
  95. data/test/test_Array.cpp +131 -74
  96. data/test/test_Attribute.cpp +147 -0
  97. data/test/test_Builtin_Object.cpp +36 -15
  98. data/test/test_Class.cpp +151 -276
  99. data/test/test_Constructor.cpp +10 -9
  100. data/test/test_Data_Object.cpp +135 -193
  101. data/test/test_Data_Type.cpp +323 -252
  102. data/test/test_Director.cpp +56 -42
  103. data/test/test_Enum.cpp +230 -104
  104. data/test/test_Exception.cpp +7 -7
  105. data/test/test_Hash.cpp +33 -31
  106. data/test/test_Identifier.cpp +6 -6
  107. data/test/test_Inheritance.cpp +221 -0
  108. data/test/test_Iterator.cpp +161 -0
  109. data/test/test_Jump_Tag.cpp +1 -1
  110. data/test/test_Keep_Alive.cpp +161 -0
  111. data/test/test_Memory_Management.cpp +4 -5
  112. data/test/test_Module.cpp +169 -111
  113. data/test/test_Object.cpp +51 -19
  114. data/test/test_Ownership.cpp +275 -0
  115. data/test/test_Self.cpp +205 -0
  116. data/test/test_Stl_Optional.cpp +90 -0
  117. data/test/test_Stl_Pair.cpp +144 -0
  118. data/test/test_Stl_SmartPointer.cpp +200 -0
  119. data/test/test_Stl_String.cpp +74 -0
  120. data/test/test_Stl_Vector.cpp +652 -0
  121. data/test/test_String.cpp +3 -3
  122. data/test/test_Struct.cpp +31 -40
  123. data/test/test_Symbol.cpp +3 -3
  124. data/test/test_To_From_Ruby.cpp +283 -218
  125. data/test/test_global_functions.cpp +41 -20
  126. data/test/unittest.cpp +34 -8
  127. data/test/unittest.hpp +0 -4
  128. metadata +121 -136
  129. data/Doxyfile +0 -2268
  130. data/Makefile.am +0 -26
  131. data/Makefile.in +0 -923
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -103
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7367
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -125
  173. data/rice/Makefile.in +0 -888
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -628
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -506
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -489
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1213
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -483
  246. data/test/test_rice.rb +0 -41
@@ -2,260 +2,192 @@
2
2
  #define Rice__Data_Type_defn__hpp_
3
3
 
4
4
  #include "Class_defn.hpp"
5
- #include "Data_Type_fwd.hpp"
6
5
  #include "detail/ruby.hpp"
7
- #include <memory>
8
- #include <map>
9
6
  #include <set>
10
7
 
11
- /*!
12
- * \example map/map.cpp
13
- */
14
-
15
8
  namespace Rice
16
9
  {
17
-
18
- namespace detail
19
- {
20
- class Abstract_Caster;
21
- }
22
-
23
- class Module;
24
-
25
- //! The base class for all instantiations of Data_Type.
26
- class Data_Type_Base
27
- : public Module_impl<Class, Data_Type_Base>
28
- {
29
- public:
30
- //! Default constructor.
31
- Data_Type_Base();
32
-
33
- //! Constructor.
34
- Data_Type_Base(VALUE v);
35
-
36
- //! Destructor.
37
- virtual ~Data_Type_Base() = 0;
38
-
39
- // Must be public to workaround gcc 3.3
40
- typedef std::map<VALUE, detail::Abstract_Caster *> Casters;
41
-
42
- virtual detail::Abstract_Caster * caster() const = 0;
43
-
44
- static Casters & casters();
45
-
46
- private:
47
- static Casters * casters_;
48
- };
49
-
50
- //! Define a new data class in the namespace given by module.
51
- /*! The class will have a base class of Object.
52
- * \param T the C++ type of the wrapped class.
53
- * \param module the the Module in which to define the class.
54
- * \return the new class.
55
- */
56
- template<typename T>
57
- Rice::Data_Type<T> define_class_under(
58
- Object module,
59
- char const * name);
60
-
61
- //! Define a new data class in the namespace given by module.
62
- /*! The class with have a base class determined by Base_T (specifically,
63
- * Data_Type<Base_T>::klass). Therefore, the type Base_T must already
64
- * have been registered using define_class<> or define_class_under<>.
65
- * \param T the C++ type of the wrapped class.
66
- * \param module the the Module in which to define the class.
67
- * \return the new class.
68
- */
69
- template<typename T, typename Base_T>
70
- Rice::Data_Type<T> define_class_under(
71
- Object module,
72
- char const * name);
73
-
74
- //! Define a new data class in the default namespace.
75
- /*! The class will have a base class of Object.
76
- * \param T the C++ type of the wrapped class.
77
- * \return the new class.
78
- */
79
- template<typename T>
80
- Rice::Data_Type<T> define_class(
81
- char const * name);
82
-
83
- //! Define a new data class in the default namespace.
84
- /*! The class with have a base class determined by Base_T (specifically,
85
- * Data_Type<Base_T>::klass). Therefore, the type Base_T must already
86
- * have been registered using define_class<> or define_class_under<>.
87
- * \param T the C++ type of the wrapped class.
88
- * \param module the the Module in which to define the class.
89
- * \return the new class.
90
- */
91
- template<typename T, typename Base_T>
92
- Rice::Data_Type<T> define_class(
93
- char const * name);
94
-
95
- //! Define an implicit conversion rule between two types.
96
- /*! Given two types, which can be custom types already
97
- * wrapped into Rice or fundamental C++ types, this
98
- * tells Rice that the two types can be used interchangably.
99
- * \param From_T The type to convert from
100
- * \param To_T The type to convert to
101
- */
102
- template<typename From_T, typename To_T>
103
- void define_implicit_cast();
104
-
105
- //! A mechanism for binding ruby types to C++ types.
106
- /*! This class binds run-time types (Ruby VALUEs) to compile-time types
107
- * (C++ types). The binding can occur only once.
108
- */
109
- template<typename T>
110
- class Data_Type
111
- : public Module_impl<Data_Type_Base, Data_Type<T> >
112
- {
113
- public:
114
- //! The C++ type being held.
115
- typedef T Type;
116
-
117
- //! Default constructor which does not bind.
118
- /*! No member functions must be called on this Data_Type except bind,
119
- * until the type is bound.
120
- */
121
- Data_Type();
122
-
123
- //! Constructor which takes a Module.
124
- /*! Binds the type to the given VALUE according to the rules given
125
- * above.
126
- * \param klass the module to which to bind.
10
+ //! A mechanism for binding ruby types to C++ types.
11
+ /*! This class binds run-time types (Ruby VALUEs) to compile-time types
12
+ * (C++ types). The binding can occur only once.
127
13
  */
128
- Data_Type(Module const & v);
129
-
130
- //! Destructor.
131
- virtual ~Data_Type();
14
+ template<typename T>
15
+ class Data_Type : public Class
16
+ {
17
+ static_assert(std::is_same_v<detail::intrinsic_type<T>, T>);
18
+
19
+ public:
20
+ //! Default constructor which does not bind.
21
+ /*! No member functions must be called on this Data_Type except bind,
22
+ * until the type is bound.
23
+ */
24
+ Data_Type();
25
+
26
+ //! Constructor which takes a Module.
27
+ /*! Binds the type to the given VALUE according to the rules given
28
+ * above.
29
+ * \param klass the module to which to bind.
30
+ */
31
+ Data_Type(Module const & v);
32
+
33
+ //! Destructor.
34
+ virtual ~Data_Type();
132
35
 
133
- //! Explictly return the Ruby type.
134
- /*! \return the ruby class to which the type is bound.
135
- */
136
- static Module klass();
137
-
138
- //! Assignment operator which takes a Module
139
- /*! \param klass must be the class to which this data type is already
140
- * bound.
141
- * \return *this
142
- */
143
- virtual Data_Type & operator=(Module const & klass);
144
-
145
- //! Define a constructor for the class.
146
- /*! Creates a singleton method allocate and an instance method called
147
- * initialize which together create a new instance of the class. The
148
- * allocate method allocates memory for the object reference and the
149
- * initialize method constructs the object.
150
- * \param constructor an object that has a static member function
151
- * construct() that constructs a new instance of T and sets the object's data
152
- * member to point to the new instance. A helper class Constructor
153
- * is provided that does precisely this.
154
- * For example:
155
- * \code
156
- * define_class<Foo>("Foo")
157
- * .define_constructor(Constructor<Foo>());
158
- * \endcode
36
+ //! Return the Ruby class.
37
+ /*! \return the ruby class to which the type is bound.
38
+ */
39
+ static Class klass();
40
+
41
+ //! Return the Ruby type.
42
+ static rb_data_type_t* rb_type();
43
+
44
+ //! Assignment operator which takes a Module
45
+ /*! \param klass must be the class to which this data type is already
46
+ * bound.
47
+ * \return *this
48
+ */
49
+ virtual Data_Type & operator=(Module const & klass);
50
+
51
+ //! Define a constructor for the class.
52
+ template<typename Constructor_T>
53
+ [[deprecated("Please call define_constructor with Arg parameters")]]
54
+ Data_Type<T> & define_constructor(Constructor_T constructor, MethodInfo * methodInfo);
55
+
56
+ /*! Creates a singleton method allocate and an instance method called
57
+ * initialize which together create a new instance of the class. The
58
+ * allocate method allocates memory for the object reference and the
59
+ * initialize method constructs the object.
60
+ * \param constructor an object that has a static member function
61
+ * construct() that constructs a new instance of T and sets the object's data
62
+ * member to point to the new instance. A helper class Constructor
63
+ * is provided that does precisely this.
64
+ * \param args a list of Arg instance used to define default parameters (optional)
65
+ *
66
+ * For example:
67
+ * \code
68
+ * define_class<Foo>("Foo")
69
+ * .define_constructor(Constructor<Foo>());
70
+ * \endcode
71
+ */
72
+ template<typename Constructor_T, typename...Arg_Ts>
73
+ Data_Type<T> & define_constructor(Constructor_T constructor, Arg_Ts const& ...args);
74
+
75
+ //! Register a Director class for this class.
76
+ /*! For any class that uses Rice::Director to enable polymorphism
77
+ * across the languages, you need to register that director proxy
78
+ * class with this method. Not doing so will cause the resulting
79
+ * library to die at run time when it tries to convert the base
80
+ * type into the Director proxy type.
81
+ *
82
+ * This method takes no methodInfo, just needs the type of the
83
+ * Director proxy class.
84
+ *
85
+ * For example:
86
+ * \code
87
+ * class FooDirector : public Foo, public Rice::Director {
88
+ * ...
89
+ * };
90
+ *
91
+ * define_class<Foo>("Foo")
92
+ * .define_director<FooDirector>()
93
+ * .define_constructor(Constructor<FooDirector, Rice::Object>());
94
+ * \endcode
95
+ */
96
+ template<typename Director_T>
97
+ Data_Type<T>& define_director();
98
+
99
+ //! Determine if the type is bound.
100
+ /*! \return true if the object is bound, false otherwise.
101
+ */
102
+ static bool is_bound();
103
+ static void check_is_bound();
104
+
105
+ // This is only for testing - DO NOT USE!!!
106
+ static void unbind();
107
+
108
+ static bool is_descendant(VALUE value);
109
+
110
+ //! Define an iterator.
111
+ /*! Essentially this is a conversion from a C++-style begin/end
112
+ * iterator to a Ruby-style \#each iterator.
113
+ * \param begin a member function pointer to a function that returns
114
+ * an iterator to the beginning of the sequence.
115
+ * \param end a member function pointer to a function that returns an
116
+ * iterator to the end of the sequence.
117
+ * \param name the name of the iterator.
118
+ * \return *this
119
+ */
120
+
121
+ template<typename U = T, typename Iterator_Return_T>
122
+ Data_Type<T>& define_iterator(Iterator_Return_T(U::* begin)(), Iterator_Return_T(U::* end)(), Identifier name = "each");
123
+
124
+ template <typename Attr_T>
125
+ Data_Type<T>& define_attr(std::string name, Attr_T attr, AttrAccess access = AttrAccess::ReadWrite);
126
+
127
+ template <typename Attr_T>
128
+ Data_Type<T>& define_singleton_attr(std::string name, Attr_T attr, AttrAccess access = AttrAccess::ReadWrite);
129
+
130
+ #include "cpp_api/shared_methods.hpp"
131
+
132
+ protected:
133
+ //! Bind a Data_Type to a VALUE.
134
+ /*! Throws an exception if the Data_Type is already bound to a
135
+ * different class. Any existing instances of the Data_Type will be
136
+ * bound after this function returns.
137
+ * \param klass the ruby type to which to bind.
138
+ * \return *this
139
+ */
140
+ template <typename Base_T = void>
141
+ static Data_Type bind(Module const & klass);
142
+
143
+ template<typename T_, typename Base_T_>
144
+ friend Rice::Data_Type<T_> define_class_under(Object module, char const * name);
145
+
146
+ template<typename T_, typename Base_T_>
147
+ friend Rice::Data_Type<T_> define_class(char const * name);
148
+
149
+ private:
150
+ template<typename T_>
151
+ friend class Data_Type;
152
+
153
+ static inline VALUE klass_ = Qnil;
154
+
155
+ // Typed Data support
156
+ static inline rb_data_type_t* rb_type_ = nullptr;
157
+
158
+ typedef std::set<Data_Type<T> *> Instances;
159
+
160
+ static Instances & unbound_instances()
161
+ {
162
+ static Instances unbound_instances;
163
+ return unbound_instances;
164
+ }
165
+ };
166
+
167
+ //! Define a new data class in the namespace given by module.
168
+ /*! By default the class will inherit from Ruby's rb_cObject. This
169
+ * can be overriden via the Base_T template parameter. Note that
170
+ * Base_T must already have been registered.
171
+ * \param T the C++ type of the wrapped class.
172
+ * \param module the the Module in which to define the class.
173
+ * \return the new class.
159
174
  */
160
- template<typename Constructor_T>
161
- Data_Type<T> & define_constructor(
162
- Constructor_T constructor,
163
- Arguments * arguments = 0);
164
-
165
- template<typename Constructor_T>
166
- Data_Type<T> & define_constructor(
167
- Constructor_T constructor,
168
- Arg const& arg);
169
-
170
- //! Register a Director class for this class.
171
- /*! For any class that uses Rice::Director to enable polymorphism
172
- * across the languages, you need to register that director proxy
173
- * class with this method. Not doing so will cause the resulting
174
- * library to die at run time when it tries to convert the base
175
- * type into the Director proxy type, and cannot find an appropriate Caster.
176
- *
177
- * This method takes no arguments, just needs the type of the
178
- * Director proxy class.
179
- *
180
- * For example:
181
- * \code
182
- * class FooDirector : public Foo, public Rice::Director {
183
- * ...
184
- * };
185
- *
186
- * define_class<Foo>("Foo")
187
- * .define_director<FooDirector>()
188
- * .define_constructor(Constructor<FooDirector, Rice::Object>());
189
- * \endcode
190
- */
191
- template<typename Director_T>
192
- Data_Type<T>& define_director();
193
-
194
- //! Convert ruby object x to type T.
195
- /*! \param x the object to convert.
196
- * \return the C++ object wrapped inside object x.
197
- */
198
- static T * from_ruby(Object x);
199
-
200
- //! Determine if the type is bound.
201
- /*! \return true if the object is bound, false otherwise.
202
- */
203
- static bool is_bound();
204
-
205
- virtual detail::Abstract_Caster * caster() const;
206
-
207
- static std_unique_ptr<detail::Abstract_Caster> caster_;
208
-
209
- protected:
210
- //! Bind a Data_Type to a VALUE.
211
- /*! Throws an exception if the Data_Type is already bound to a
212
- * different class. Any existing instances of the Data_Type will be
213
- * bound after this function returns.
214
- * \param klass the ruby type to which to bind.
215
- * \return *this
175
+ template<typename T, typename Base_T = void>
176
+ Data_Type<T> define_class_under(Object module, char const* name);
177
+
178
+ //! Define a new data class in the default namespace.
179
+ /*! By default the class will inherit from Ruby's rb_cObject. This
180
+ * can be overriden via the Base_T template parameter. Note that
181
+ * Base_T must already have been registered.
182
+ * \param T the C++ type of the wrapped class.
183
+ * \param module the the Module in which to define the class.
184
+ * \return the new class.
216
185
  */
217
- template<typename Base_T>
218
- static Data_Type bind(Module const & klass);
219
-
220
- template<typename T_>
221
- friend Rice::Data_Type<T_> define_class_under(
222
- Object module,
223
- char const * name);
224
-
225
- template<typename T_, typename Base_T_>
226
- friend Rice::Data_Type<T_> define_class_under(
227
- Object module,
228
- char const * name);
229
-
230
- template<typename T_>
231
- friend Rice::Data_Type<T_> Rice::define_class(
232
- char const * name);
233
-
234
- template<typename T_, typename Base_T_>
235
- friend Rice::Data_Type<T_> define_class(
236
- char const * name);
237
-
238
- private:
239
- template<typename T_>
240
- friend class Data_Type;
241
-
242
- static void check_is_bound();
243
-
244
- static VALUE klass_;
245
-
246
- typedef std::set<Data_Type<T> *> Instances;
247
-
248
- static Instances & unbound_instances()
249
- {
250
- static Instances unbound_instances;
251
- return unbound_instances;
252
- }
253
- };
254
-
186
+ template<typename T, typename Base_T = void>
187
+ Data_Type<T> define_class(char const* name);
255
188
 
256
189
  } // namespace Rice
257
190
 
258
191
  #include "Data_Type.ipp"
259
192
 
260
- #endif // Rice__Data_Type_defn__hpp_
261
-
193
+ #endif // Rice__Data_Type_defn__hpp_
data/rice/Director.hpp CHANGED
@@ -1,29 +1,34 @@
1
1
  #ifndef Rice__Director__hpp_
2
2
  #define Rice__Director__hpp_
3
3
 
4
- #include "Object.hpp"
5
-
6
- namespace Rice {
4
+ #include "cpp_api/Object.hpp"
7
5
 
6
+ namespace Rice
7
+ {
8
8
  /**
9
9
  * A Director works exactly as a SWIG %director works (thus the name).
10
10
  * You use this class to help build proxy classes so that polymorphism
11
11
  * works from C++ into Ruby. See the main README for how this class works.
12
12
  */
13
- class Director
13
+ class Director
14
14
  {
15
15
  public:
16
- //! Construct new Director. Needs the Ruby object so that the
16
+ //! Construct new Director. Needs the Ruby object so that the
17
17
  // proxy class can call methods on that object.
18
- Director(Object self);
18
+ Director(Object self) : self_(self)
19
+ {
20
+ }
19
21
 
20
- virtual ~Director() { }
22
+ virtual ~Director() = default;
21
23
 
22
24
  //! Raise a ruby exception when a call comes through for a pure virtual method
23
25
  /*! If a Ruby script calls 'super' on a method that's otherwise a pure virtual
24
- * method, use this method to throw an exception in this case.
26
+ * method, use this method to throw an exception in this case.
25
27
  */
26
- void raisePureVirtual() const;
28
+ void raisePureVirtual() const
29
+ {
30
+ rb_raise(rb_eNotImpError, "Cannot call super() into a pure-virtual C++ method");
31
+ }
27
32
 
28
33
  //! Get the Ruby object linked to this C++ instance
29
34
  Object getSelf() const { return self_; }