rice 3.0.0 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
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_