rice 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +121 -0
- data/CONTRIBUTORS.md +19 -0
- data/Gemfile +3 -0
- data/README.md +44 -1025
- data/Rakefile +95 -12
- data/include/rice/rice.hpp +7766 -0
- data/lib/mkmf-rice.rb +127 -0
- data/lib/version.rb +3 -0
- data/rice/Address_Registration_Guard.ipp +75 -32
- data/rice/Address_Registration_Guard_defn.hpp +60 -56
- data/rice/Arg.hpp +80 -4
- data/rice/Arg.ipp +51 -0
- data/rice/Constructor.hpp +12 -14
- data/rice/Data_Object.ipp +234 -107
- data/rice/Data_Object_defn.hpp +77 -117
- data/rice/Data_Type.hpp +1 -2
- data/rice/Data_Type.ipp +251 -295
- data/rice/Data_Type_defn.hpp +175 -243
- data/rice/Director.hpp +11 -6
- data/rice/Enum.hpp +54 -104
- data/rice/Enum.ipp +104 -230
- data/rice/Exception.hpp +2 -8
- data/rice/Exception.ipp +65 -0
- data/rice/Exception_defn.hpp +46 -47
- data/rice/Identifier.hpp +28 -28
- data/rice/Identifier.ipp +23 -27
- data/rice/Return.hpp +39 -0
- data/rice/Return.ipp +33 -0
- data/rice/detail/Exception_Handler.ipp +22 -62
- data/rice/detail/Exception_Handler_defn.hpp +76 -91
- data/rice/detail/Iterator.hpp +18 -88
- data/rice/detail/Iterator.ipp +47 -0
- data/rice/detail/Jump_Tag.hpp +21 -0
- data/rice/detail/MethodInfo.hpp +44 -0
- data/rice/detail/MethodInfo.ipp +78 -0
- data/rice/detail/NativeAttribute.hpp +53 -0
- data/rice/detail/NativeAttribute.ipp +83 -0
- data/rice/detail/NativeFunction.hpp +69 -0
- data/rice/detail/NativeFunction.ipp +248 -0
- data/rice/detail/RubyFunction.hpp +39 -0
- data/rice/detail/RubyFunction.ipp +92 -0
- data/rice/detail/Type.hpp +29 -0
- data/rice/detail/Type.ipp +138 -0
- data/rice/detail/TypeRegistry.hpp +50 -0
- data/rice/detail/TypeRegistry.ipp +106 -0
- data/rice/detail/Wrapper.hpp +51 -0
- data/rice/detail/Wrapper.ipp +151 -0
- data/rice/detail/default_allocation_func.hpp +8 -19
- data/rice/detail/default_allocation_func.ipp +9 -8
- data/rice/detail/from_ruby.hpp +2 -37
- data/rice/detail/from_ruby.ipp +1020 -46
- data/rice/detail/from_ruby_defn.hpp +38 -0
- data/rice/detail/function_traits.hpp +124 -0
- data/rice/detail/method_data.hpp +23 -15
- data/rice/detail/method_data.ipp +53 -0
- data/rice/detail/rice_traits.hpp +116 -0
- data/rice/detail/ruby.hpp +9 -46
- data/rice/detail/to_ruby.hpp +3 -17
- data/rice/detail/to_ruby.ipp +409 -31
- data/rice/detail/to_ruby_defn.hpp +48 -0
- data/rice/forward_declares.ipp +82 -0
- data/rice/global_function.hpp +16 -20
- data/rice/global_function.ipp +8 -17
- data/rice/rice.hpp +59 -0
- data/rice/ruby_mark.hpp +5 -3
- data/rice/ruby_try_catch.hpp +4 -4
- data/rice/stl.hpp +11 -0
- data/sample/callbacks/extconf.rb +3 -0
- data/sample/callbacks/sample_callbacks.cpp +10 -13
- data/sample/enum/extconf.rb +3 -0
- data/sample/enum/sample_enum.cpp +3 -17
- data/sample/enum/test.rb +2 -2
- data/sample/inheritance/animals.cpp +8 -24
- data/sample/inheritance/extconf.rb +3 -0
- data/sample/inheritance/test.rb +1 -1
- data/sample/map/extconf.rb +3 -0
- data/sample/map/map.cpp +10 -18
- data/sample/map/test.rb +1 -1
- data/test/embed_ruby.cpp +18 -5
- data/test/ext/t1/extconf.rb +3 -0
- data/test/ext/t1/t1.cpp +1 -3
- data/test/ext/t2/extconf.rb +3 -0
- data/test/ext/t2/t2.cpp +1 -1
- data/test/extconf.rb +23 -0
- data/test/ruby/test_callbacks_sample.rb +28 -0
- data/test/ruby/test_multiple_extensions.rb +18 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
- data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
- data/test/test_Address_Registration_Guard.cpp +23 -10
- data/test/test_Array.cpp +129 -73
- data/test/test_Attribute.cpp +147 -0
- data/test/test_Builtin_Object.cpp +34 -14
- data/test/test_Class.cpp +149 -275
- data/test/test_Constructor.cpp +10 -9
- data/test/test_Data_Object.cpp +133 -192
- data/test/test_Data_Type.cpp +322 -252
- data/test/test_Director.cpp +54 -41
- data/test/test_Enum.cpp +228 -103
- data/test/test_Exception.cpp +5 -6
- data/test/test_Hash.cpp +31 -30
- data/test/test_Identifier.cpp +4 -5
- data/test/test_Inheritance.cpp +221 -0
- data/test/test_Iterator.cpp +161 -0
- data/test/test_Jump_Tag.cpp +1 -1
- data/test/test_Keep_Alive.cpp +161 -0
- data/test/test_Memory_Management.cpp +2 -4
- data/test/test_Module.cpp +167 -110
- data/test/test_Object.cpp +41 -21
- data/test/test_Ownership.cpp +275 -0
- data/test/test_Self.cpp +205 -0
- data/test/test_Stl_Optional.cpp +90 -0
- data/test/test_Stl_Pair.cpp +144 -0
- data/test/test_Stl_SmartPointer.cpp +200 -0
- data/test/test_Stl_String.cpp +74 -0
- data/test/test_Stl_Vector.cpp +652 -0
- data/test/test_String.cpp +1 -2
- data/test/test_Struct.cpp +29 -39
- data/test/test_Symbol.cpp +1 -2
- data/test/test_To_From_Ruby.cpp +249 -285
- data/test/test_global_functions.cpp +39 -19
- data/test/unittest.hpp +0 -4
- metadata +63 -139
- data/Doxyfile +0 -2268
- data/Makefile.am +0 -26
- data/Makefile.in +0 -931
- data/README.mingw +0 -8
- data/aclocal.m4 +0 -1085
- data/ax_cxx_compile_stdcxx.m4 +0 -951
- data/bootstrap +0 -8
- data/config.guess +0 -1421
- data/config.sub +0 -1807
- data/configure +0 -7792
- data/configure.ac +0 -55
- data/depcomp +0 -791
- data/doxygen.ac +0 -314
- data/doxygen.am +0 -186
- data/extconf.rb +0 -70
- data/install-sh +0 -501
- data/missing +0 -215
- data/post-autoconf.rb +0 -22
- data/post-automake.rb +0 -28
- data/rice/Address_Registration_Guard.cpp +0 -22
- data/rice/Arg_impl.hpp +0 -129
- data/rice/Arg_operators.cpp +0 -21
- data/rice/Arg_operators.hpp +0 -19
- data/rice/Array.hpp +0 -214
- data/rice/Array.ipp +0 -256
- data/rice/Builtin_Object.hpp +0 -8
- data/rice/Builtin_Object.ipp +0 -50
- data/rice/Builtin_Object_defn.hpp +0 -50
- data/rice/Class.cpp +0 -57
- data/rice/Class.hpp +0 -8
- data/rice/Class.ipp +0 -6
- data/rice/Class_defn.hpp +0 -84
- data/rice/Data_Type.cpp +0 -54
- data/rice/Data_Type_fwd.hpp +0 -12
- data/rice/Director.cpp +0 -13
- data/rice/Exception.cpp +0 -54
- data/rice/Exception_Base.hpp +0 -8
- data/rice/Exception_Base.ipp +0 -13
- data/rice/Exception_Base_defn.hpp +0 -27
- data/rice/Hash.hpp +0 -230
- data/rice/Hash.ipp +0 -329
- data/rice/Identifier.cpp +0 -8
- data/rice/Jump_Tag.hpp +0 -24
- data/rice/Makefile.am +0 -121
- data/rice/Makefile.in +0 -884
- data/rice/Module.cpp +0 -84
- data/rice/Module.hpp +0 -8
- data/rice/Module.ipp +0 -6
- data/rice/Module_defn.hpp +0 -88
- data/rice/Module_impl.hpp +0 -281
- data/rice/Module_impl.ipp +0 -345
- data/rice/Object.cpp +0 -169
- data/rice/Object.hpp +0 -8
- data/rice/Object.ipp +0 -33
- data/rice/Object_defn.hpp +0 -214
- data/rice/Require_Guard.hpp +0 -21
- data/rice/String.cpp +0 -89
- data/rice/String.hpp +0 -91
- data/rice/Struct.cpp +0 -117
- data/rice/Struct.hpp +0 -162
- data/rice/Struct.ipp +0 -26
- data/rice/Symbol.cpp +0 -25
- data/rice/Symbol.hpp +0 -66
- data/rice/Symbol.ipp +0 -44
- data/rice/config.hpp +0 -47
- data/rice/config.hpp.in +0 -46
- data/rice/detail/Arguments.hpp +0 -118
- data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
- data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
- data/rice/detail/Caster.hpp +0 -103
- data/rice/detail/Not_Copyable.hpp +0 -25
- data/rice/detail/Wrapped_Function.hpp +0 -33
- data/rice/detail/cfp.hpp +0 -24
- data/rice/detail/cfp.ipp +0 -51
- data/rice/detail/check_ruby_type.cpp +0 -27
- data/rice/detail/check_ruby_type.hpp +0 -23
- data/rice/detail/creation_funcs.hpp +0 -37
- data/rice/detail/creation_funcs.ipp +0 -36
- data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
- data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
- data/rice/detail/demangle.cpp +0 -56
- data/rice/detail/demangle.hpp +0 -19
- data/rice/detail/env.hpp +0 -11
- data/rice/detail/method_data.cpp +0 -92
- data/rice/detail/node.hpp +0 -13
- data/rice/detail/protect.cpp +0 -29
- data/rice/detail/protect.hpp +0 -34
- data/rice/detail/ruby_version_code.hpp +0 -6
- data/rice/detail/ruby_version_code.hpp.in +0 -6
- data/rice/detail/st.hpp +0 -22
- data/rice/detail/win32.hpp +0 -16
- data/rice/detail/wrap_function.hpp +0 -66
- data/rice/protect.hpp +0 -38
- data/rice/protect.ipp +0 -1134
- data/rice/rubypp.rb +0 -97
- data/rice/to_from_ruby.hpp +0 -8
- data/rice/to_from_ruby.ipp +0 -418
- data/rice/to_from_ruby_defn.hpp +0 -70
- data/ruby.ac +0 -135
- data/ruby/Makefile.am +0 -1
- data/ruby/Makefile.in +0 -628
- data/ruby/lib/Makefile.am +0 -3
- data/ruby/lib/Makefile.in +0 -506
- data/ruby/lib/mkmf-rice.rb.in +0 -217
- data/ruby/lib/version.rb +0 -3
- data/sample/Makefile.am +0 -53
- data/sample/Makefile.in +0 -495
- data/test/Makefile.am +0 -73
- data/test/Makefile.in +0 -1219
- data/test/ext/Makefile.am +0 -41
- data/test/ext/Makefile.in +0 -483
- data/test/test_rice.rb +0 -45
data/rice/Data_Type_defn.hpp
CHANGED
@@ -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
|
-
|
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
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
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
|
161
|
-
Data_Type<T>
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
template
|
166
|
-
|
167
|
-
|
168
|
-
|
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
|
-
|
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_; }
|