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
@@ -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,10 +1,10 @@
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
@@ -15,15 +15,20 @@ namespace Rice {
15
15
  public:
16
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
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_; }
data/rice/Enum.hpp CHANGED
@@ -1,117 +1,67 @@
1
1
  #ifndef Rice__Enum__hpp_
2
2
  #define Rice__Enum__hpp_
3
3
 
4
- #include "to_from_ruby_defn.hpp"
5
- #include "Address_Registration_Guard.hpp"
6
- #include "Array.hpp"
7
- #include "Hash.hpp"
8
- #include "String.hpp"
9
- #include "Module.hpp"
10
4
  #include "Data_Type.hpp"
5
+ #include <map>
11
6
 
12
7
  namespace Rice
13
8
  {
14
-
15
- //! Default traits for the Enum class template.
16
- template<typename Enum_T>
17
- struct Default_Enum_Traits
18
- {
19
- //! Converts the enum value to a long.
20
- static long as_long(Enum_T value);
21
- };
22
-
23
- /*!
24
- * \example enum/sample_enum.cpp
25
- */
26
-
27
- //! A wrapper for enumerated types.
28
- /*! Provides a simple type-safe wrapper for enumerated types. At the
29
- * ruby level, the class will have convenience methods for iterating
30
- * over all the defined enum values, converting the values to strings,
31
- * and more.
32
- *
33
- * \param Enum_T the enumerated type
34
- * \param Enum_Traits specifies the traits of the enumerated type.
35
- *
36
- * Example:
37
- * \code
38
- * enum Color { Red, Green, Blue };
39
- * Enum<Color> rb_cColor = define_enum<Color>("Color")
40
- * .define_value("Red", Red)
41
- * .define_value("Green", Green)
42
- * .define_value("Blue", Blue);
43
- * \endcode
44
- */
45
- template<typename Enum_T, typename Enum_Traits = Default_Enum_Traits<Enum_T> >
46
- class Enum
47
- : public Module_impl<Data_Type<Enum_T>, Enum<Enum_T, Enum_Traits> >
48
- {
49
- public:
50
- //! Default constructor.
51
- Enum();
52
-
53
- //! Construct and initialize.
54
- Enum(
55
- char const * name,
56
- Module module = rb_cObject);
57
-
58
- //! Copy constructor.
59
- Enum(Enum const & other);
60
-
61
- //! Assignment operator.
62
- Enum & operator=(Enum const & other);
63
-
64
- //! Destructor.
65
- virtual ~Enum();
66
-
67
- //! Define a new enum value.
68
- /*! \param name the name of the enum value.
69
- * \param value the value to associate with name.
70
- * \return *this
9
+ /*!
10
+ * \example enum/sample_enum.cpp
71
11
  */
72
- Enum<Enum_T, Enum_Traits> & define_value(
73
- char const * name,
74
- Enum_T value);
75
-
76
- void swap(Enum & other);
77
-
78
- private:
79
- //! Initialize the enum type.
80
- /*! Must be called only once.
81
- * \param name the name of the class to define
82
- * \param module the module in which to place the enum class.
83
- * \return *this
84
- */
85
- Enum<Enum_T, Enum_Traits> & initialize(
86
- char const * name,
87
- Module module = rb_cObject);
88
-
89
- private:
90
- static Object each(Object self);
91
- static Object to_s(Object self);
92
- static Object to_i(Object self);
93
- static Object inspect(Object self);
94
- static Object compare(Object lhs, Object rhs);
95
- static Object eql(Object lhs, Object rhs);
96
- static Object hash(Object self);
97
- static Object from_int(Class klass, Object i);
98
-
99
- private:
100
- Array enums_;
101
- Address_Registration_Guard enums_guard_;
102
-
103
- Hash names_;
104
- Address_Registration_Guard names_guard_;
105
- };
106
-
107
- template<typename T>
108
- Enum<T> define_enum(
109
- char const * name,
110
- Module module = rb_cObject);
111
12
 
13
+ //! A wrapper for enumerated types.
14
+ /*! Provides a simple type-safe wrapper for enumerated types. At the
15
+ * ruby level, the class will have convenience methods for iterating
16
+ * over all the defined enum values, converting the values to strings,
17
+ * and more.
18
+ *
19
+ * \param Enum_T the enumerated type
20
+ *
21
+ * Example:
22
+ * \code
23
+ * enum Color { Red, Green, Blue };
24
+ * Enum<Color> rb_cColor = define_enum<Color>("Color")
25
+ * .define_value("Red", Red)
26
+ * .define_value("Green", Green)
27
+ * .define_value("Blue", Blue);
28
+ * \endcode
29
+ */
30
+ template<typename Enum_T>
31
+ class Enum : public Data_Type<Enum_T>
32
+ {
33
+ using Underlying_T = std::underlying_type_t<Enum_T>;
34
+
35
+ public:
36
+
37
+ Enum() = default;
38
+
39
+ //! Construct and initialize.
40
+ Enum(char const* name, Module module = rb_cObject);
41
+
42
+ //! Define a new enum value.
43
+ /*! \param name the name of the enum value.
44
+ * \param value the value to associate with name.
45
+ * \return *this
46
+ */
47
+ Enum<Enum_T>& define_value(std::string name, Enum_T value);
48
+
49
+ //! Maps an enum value to the correct Ruby object
50
+ /*! \param klass The bound Ruby class
51
+ * \param enumValue The enum value
52
+ * \return Object - The Ruby wrapper */
53
+ static Object from_enum(Class klass, Enum_T enumValue);
54
+
55
+ private:
56
+ void define_methods(Data_Type<Enum_T> klass);
57
+
58
+ static inline std::map<Enum_T, std::string> valuesToNames_;
59
+ };
60
+
61
+ template<typename T>
62
+ Enum<T> define_enum(char const* name, Module module = rb_cObject);
112
63
  } // namespace Rice
113
64
 
114
65
  #include "Enum.ipp"
115
66
 
116
- #endif // Rice__Enum__hpp_
117
-
67
+ #endif // Rice__Enum__hpp_