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.
- 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/include/rice/stl.hpp +1113 -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 +70 -141
- 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/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/ruby.ac +0 -135
- 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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#ifndef Rice__TypeRegistry__hpp_
|
|
2
|
+
#define Rice__TypeRegistry__hpp_
|
|
3
|
+
|
|
4
|
+
#include <optional>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <typeindex>
|
|
7
|
+
#include <typeinfo>
|
|
8
|
+
#include <unordered_map>
|
|
9
|
+
|
|
10
|
+
#include "ruby.hpp"
|
|
11
|
+
|
|
12
|
+
/* The type registery keeps track of all C++ types wrapped by Rice. When a native function returns
|
|
13
|
+
an instance of a class/struct we look up its type to verity that it has been registered.
|
|
14
|
+
|
|
15
|
+
We have to do this to support C++ inheritance. If a C++ function returns a pointer/reference
|
|
16
|
+
to an Abstract class, the actual returned object will be a Child class. However, all we know
|
|
17
|
+
from the C++ method signature is that it is an Absract class - thus the need for a registry.*/
|
|
18
|
+
|
|
19
|
+
namespace Rice::detail
|
|
20
|
+
{
|
|
21
|
+
class TypeRegistry
|
|
22
|
+
{
|
|
23
|
+
public:
|
|
24
|
+
template <typename T>
|
|
25
|
+
static void add();
|
|
26
|
+
|
|
27
|
+
template <typename T>
|
|
28
|
+
static void add(VALUE klass, rb_data_type_t* rbType);
|
|
29
|
+
|
|
30
|
+
template <typename T>
|
|
31
|
+
static void remove();
|
|
32
|
+
|
|
33
|
+
template <typename T>
|
|
34
|
+
static bool isDefined();
|
|
35
|
+
|
|
36
|
+
template <typename T>
|
|
37
|
+
static void verifyDefined();
|
|
38
|
+
|
|
39
|
+
template <typename T>
|
|
40
|
+
static std::pair<VALUE, rb_data_type_t*> figureType(const T& object);
|
|
41
|
+
|
|
42
|
+
private:
|
|
43
|
+
static std::optional<std::pair<VALUE, rb_data_type_t*>> lookup(const std::type_info& typeInfo);
|
|
44
|
+
static inline std::unordered_map<std::type_index, std::pair<VALUE, rb_data_type_t*>> registry_{};
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#include "TypeRegistry.ipp"
|
|
49
|
+
|
|
50
|
+
#endif // Rice__TypeRegistry__hpp_
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#include <stdexcept>
|
|
2
|
+
|
|
3
|
+
#include "ruby.hpp"
|
|
4
|
+
#include "rice_traits.hpp"
|
|
5
|
+
#include "Type.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Rice::detail
|
|
8
|
+
{
|
|
9
|
+
template <typename T>
|
|
10
|
+
inline void TypeRegistry::add()
|
|
11
|
+
{
|
|
12
|
+
std::type_index key(typeid(T));
|
|
13
|
+
registry_[key] = std::pair(Qnil, nullptr);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
template <typename T>
|
|
17
|
+
inline void TypeRegistry::add(VALUE klass, rb_data_type_t* rbType)
|
|
18
|
+
{
|
|
19
|
+
std::type_index key(typeid(T));
|
|
20
|
+
registry_[key] = std::pair(klass, rbType);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
template <typename T>
|
|
24
|
+
inline void TypeRegistry::remove()
|
|
25
|
+
{
|
|
26
|
+
std::type_index key(typeid(T));
|
|
27
|
+
registry_.erase(key);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
template <typename T>
|
|
31
|
+
inline bool TypeRegistry::isDefined()
|
|
32
|
+
{
|
|
33
|
+
std::type_index key(typeid(T));
|
|
34
|
+
auto iter = registry_.find(key);
|
|
35
|
+
return iter != registry_.end();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
template <typename T>
|
|
39
|
+
inline void TypeRegistry::verifyDefined()
|
|
40
|
+
{
|
|
41
|
+
if (!isDefined<T>())
|
|
42
|
+
{
|
|
43
|
+
std::string message = "Type is not defined with Rice: " + detail::typeName(typeid(T));
|
|
44
|
+
throw std::invalid_argument(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
inline std::optional<std::pair<VALUE, rb_data_type_t*>> TypeRegistry::lookup(const std::type_info& typeInfo)
|
|
49
|
+
{
|
|
50
|
+
std::type_index key(typeInfo);
|
|
51
|
+
auto iter = registry_.find(key);
|
|
52
|
+
|
|
53
|
+
if (iter == registry_.end())
|
|
54
|
+
{
|
|
55
|
+
return std::nullopt;
|
|
56
|
+
}
|
|
57
|
+
else
|
|
58
|
+
{
|
|
59
|
+
return iter->second;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
template <typename T>
|
|
64
|
+
inline std::pair<VALUE, rb_data_type_t*> TypeRegistry::figureType(const T& object)
|
|
65
|
+
{
|
|
66
|
+
// First check and see if the actual type of the object is registered
|
|
67
|
+
std::optional<std::pair<VALUE, rb_data_type_t*>> result = lookup(typeid(object));
|
|
68
|
+
|
|
69
|
+
if (result)
|
|
70
|
+
{
|
|
71
|
+
return result.value();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// If not, then we are willing to accept an ancestor class specified by T. This is needed
|
|
75
|
+
// to support Directors. Classes inherited from Directors are never actually registered
|
|
76
|
+
// with Rice - and what we really want it to return the C++ class they inherit from.
|
|
77
|
+
result = lookup(typeid(T));
|
|
78
|
+
if (result)
|
|
79
|
+
{
|
|
80
|
+
return result.value();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Give up!
|
|
84
|
+
std::string message = "Type " + typeName(typeid(object)) + " is not registered";
|
|
85
|
+
throw std::runtime_error(message.c_str());
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// TODO - hacky to put this here but there is a circular dependency between Type and TypeRegistry
|
|
89
|
+
template<typename T>
|
|
90
|
+
bool Type<T>::verify()
|
|
91
|
+
{
|
|
92
|
+
// Use intrinsic_type so that we don't have to define specializations
|
|
93
|
+
// for pointers, references, const, etc.
|
|
94
|
+
using Intrinsic_T = intrinsic_type<T>;
|
|
95
|
+
|
|
96
|
+
if constexpr (std::is_fundamental_v<Intrinsic_T>)
|
|
97
|
+
{
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
else
|
|
101
|
+
{
|
|
102
|
+
TypeRegistry::verifyDefined<Intrinsic_T>();
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#ifndef Rice__detail__Wrapper__hpp_
|
|
2
|
+
#define Rice__detail__Wrapper__hpp_
|
|
3
|
+
|
|
4
|
+
#include "ruby.hpp"
|
|
5
|
+
|
|
6
|
+
namespace Rice
|
|
7
|
+
{
|
|
8
|
+
namespace detail
|
|
9
|
+
{
|
|
10
|
+
|
|
11
|
+
class Wrapper
|
|
12
|
+
{
|
|
13
|
+
public:
|
|
14
|
+
virtual ~Wrapper() = default;
|
|
15
|
+
virtual void* get() = 0;
|
|
16
|
+
|
|
17
|
+
void ruby_mark();
|
|
18
|
+
void addKeepAlive(VALUE value);
|
|
19
|
+
|
|
20
|
+
private:
|
|
21
|
+
// We use a vector for speed and memory locality versus a set which does
|
|
22
|
+
// not scale well when getting to tens of thousands of objects (not expecting
|
|
23
|
+
// that to happen...but just in case)
|
|
24
|
+
std::vector<VALUE> keepAlive_;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
template <typename T, typename Wrapper_T = void>
|
|
28
|
+
VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T& data, bool isOwner);
|
|
29
|
+
|
|
30
|
+
template <typename T, typename Wrapper_T = void>
|
|
31
|
+
VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T* data, bool isOwner);
|
|
32
|
+
|
|
33
|
+
template <typename T>
|
|
34
|
+
T* unwrap(VALUE value, rb_data_type_t* rb_type);
|
|
35
|
+
|
|
36
|
+
Wrapper* getWrapper(VALUE value, rb_data_type_t* rb_type);
|
|
37
|
+
|
|
38
|
+
void* unwrap(VALUE value);
|
|
39
|
+
|
|
40
|
+
template <typename T>
|
|
41
|
+
void replace(VALUE value, rb_data_type_t* rb_type, T* data, bool isOwner);
|
|
42
|
+
|
|
43
|
+
Wrapper* getWrapper(VALUE value);
|
|
44
|
+
|
|
45
|
+
} // namespace detail
|
|
46
|
+
} // namespace Rice
|
|
47
|
+
|
|
48
|
+
#include "Wrapper.ipp"
|
|
49
|
+
|
|
50
|
+
#endif // Rice__detail__Wrapper__hpp_
|
|
51
|
+
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#include <memory>
|
|
2
|
+
|
|
3
|
+
namespace Rice::detail
|
|
4
|
+
{
|
|
5
|
+
inline void Wrapper::ruby_mark()
|
|
6
|
+
{
|
|
7
|
+
for (VALUE value : this->keepAlive_)
|
|
8
|
+
{
|
|
9
|
+
rb_gc_mark(value);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
inline void Wrapper::addKeepAlive(VALUE value)
|
|
14
|
+
{
|
|
15
|
+
this->keepAlive_.push_back(value);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
template <typename T>
|
|
19
|
+
class WrapperValue : public Wrapper
|
|
20
|
+
{
|
|
21
|
+
public:
|
|
22
|
+
WrapperValue(T& data): data_(std::move(data))
|
|
23
|
+
{
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
void* get() override
|
|
27
|
+
{
|
|
28
|
+
return (void*)&this->data_;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private:
|
|
32
|
+
T data_;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
template <typename T>
|
|
36
|
+
class WrapperReference : public Wrapper
|
|
37
|
+
{
|
|
38
|
+
public:
|
|
39
|
+
WrapperReference(const T& data): data_(data)
|
|
40
|
+
{
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void* get() override
|
|
44
|
+
{
|
|
45
|
+
return (void*)&this->data_;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private:
|
|
49
|
+
const T& data_;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
template <typename T>
|
|
53
|
+
class WrapperPointer : public Wrapper
|
|
54
|
+
{
|
|
55
|
+
public:
|
|
56
|
+
WrapperPointer(T* data, bool isOwner) : data_(data), isOwner_(isOwner)
|
|
57
|
+
{
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
~WrapperPointer()
|
|
61
|
+
{
|
|
62
|
+
if (this->isOwner_)
|
|
63
|
+
{
|
|
64
|
+
delete this->data_;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void* get() override
|
|
69
|
+
{
|
|
70
|
+
return (void*)this->data_;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private:
|
|
74
|
+
T* data_ = nullptr;
|
|
75
|
+
bool isOwner_ = false;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// ---- Helper Functions -------
|
|
79
|
+
template <typename T, typename Wrapper_T>
|
|
80
|
+
inline VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T& data, bool isOwner)
|
|
81
|
+
{
|
|
82
|
+
if constexpr (!std::is_void_v<Wrapper_T>)
|
|
83
|
+
{
|
|
84
|
+
Wrapper_T* wrapper = new Wrapper_T(data);
|
|
85
|
+
return TypedData_Wrap_Struct(klass, rb_type, wrapper);
|
|
86
|
+
}
|
|
87
|
+
else if (isOwner)
|
|
88
|
+
{
|
|
89
|
+
WrapperValue<T>* wrapper = new WrapperValue<T>(data);
|
|
90
|
+
return TypedData_Wrap_Struct(klass, rb_type, wrapper);
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
{
|
|
94
|
+
WrapperReference<T>* wrapper = new WrapperReference<T>(data);
|
|
95
|
+
return TypedData_Wrap_Struct(klass, rb_type, wrapper);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
template <typename T, typename Wrapper_T>
|
|
100
|
+
inline VALUE wrap(VALUE klass, rb_data_type_t* rb_type, T* data, bool isOwner)
|
|
101
|
+
{
|
|
102
|
+
if constexpr (!std::is_void_v<Wrapper_T>)
|
|
103
|
+
{
|
|
104
|
+
Wrapper_T* wrapper = new Wrapper_T(data);
|
|
105
|
+
return TypedData_Wrap_Struct(klass, rb_type, wrapper);
|
|
106
|
+
}
|
|
107
|
+
else
|
|
108
|
+
{
|
|
109
|
+
WrapperPointer<T>* wrapper = new WrapperPointer<T>(data, isOwner);
|
|
110
|
+
return TypedData_Wrap_Struct(klass, rb_type, wrapper);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
template <typename T>
|
|
115
|
+
inline T* unwrap(VALUE value, rb_data_type_t* rb_type)
|
|
116
|
+
{
|
|
117
|
+
Wrapper* wrapper = getWrapper(value, rb_type);
|
|
118
|
+
TypedData_Get_Struct(value, Wrapper, rb_type, wrapper);
|
|
119
|
+
return static_cast<T*>(wrapper->get());
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
inline void* unwrap(VALUE value)
|
|
123
|
+
{
|
|
124
|
+
// Direct access to avoid any type checking
|
|
125
|
+
Wrapper* wrapper = (Wrapper*)RTYPEDDATA_DATA(value);
|
|
126
|
+
return wrapper->get();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
inline Wrapper* getWrapper(VALUE value, rb_data_type_t* rb_type)
|
|
130
|
+
{
|
|
131
|
+
Wrapper* wrapper = nullptr;
|
|
132
|
+
TypedData_Get_Struct(value, Wrapper, rb_type, wrapper);
|
|
133
|
+
return wrapper;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
template <typename T>
|
|
137
|
+
inline void replace(VALUE value, rb_data_type_t* rb_type, T* data, bool isOwner)
|
|
138
|
+
{
|
|
139
|
+
WrapperPointer<T>* wrapper = nullptr;
|
|
140
|
+
TypedData_Get_Struct(value, WrapperPointer<T>, rb_type, wrapper);
|
|
141
|
+
delete wrapper;
|
|
142
|
+
|
|
143
|
+
wrapper = new WrapperPointer<T>(data, true);
|
|
144
|
+
RTYPEDDATA_DATA(value) = wrapper;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
inline Wrapper* getWrapper(VALUE value)
|
|
148
|
+
{
|
|
149
|
+
return static_cast<Wrapper*>(RTYPEDDATA_DATA(value));
|
|
150
|
+
}
|
|
151
|
+
} // namespace
|
|
@@ -1,23 +1,12 @@
|
|
|
1
1
|
#ifndef Rice__detail__default_allocation_func__hpp_
|
|
2
2
|
#define Rice__detail__default_allocation_func__hpp_
|
|
3
3
|
|
|
4
|
-
namespace Rice
|
|
4
|
+
namespace Rice::detail
|
|
5
5
|
{
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
template<typename T>
|
|
14
|
-
VALUE default_allocation_func(VALUE klass);
|
|
15
|
-
|
|
16
|
-
} // detail
|
|
17
|
-
|
|
18
|
-
} // Rice
|
|
19
|
-
|
|
20
|
-
#include "default_allocation_func.ipp"
|
|
21
|
-
|
|
22
|
-
#endif // Rice__detail__default_allocation_func__hpp_
|
|
23
|
-
|
|
6
|
+
//! A default implementation of an allocate_func. This function does no
|
|
7
|
+
//! actual allocation; the initialize_func can later do the real
|
|
8
|
+
//! allocation with: DATA_PTR(self) = new Type(arg1, arg2, ...)
|
|
9
|
+
template<typename T>
|
|
10
|
+
VALUE default_allocation_func(VALUE klass);
|
|
11
|
+
}
|
|
12
|
+
#endif // Rice__detail__default_allocation_func__hpp_
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#include "../Data_Object.hpp"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
VALUE Rice::detail::
|
|
5
|
-
default_allocation_func(VALUE klass)
|
|
3
|
+
namespace Rice::detail
|
|
6
4
|
{
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
template<typename T>
|
|
6
|
+
VALUE default_allocation_func(VALUE klass)
|
|
7
|
+
{
|
|
8
|
+
// Create a new Ruby object but since we do not yet have a C++ object
|
|
9
|
+
// just pass a nullptr. It will be set via the Constructor call
|
|
10
|
+
return TypedData_Wrap_Struct(klass, Data_Type<T>::rb_type(), nullptr);
|
|
11
|
+
}
|
|
12
|
+
}
|
data/rice/detail/from_ruby.hpp
CHANGED
|
@@ -1,43 +1,8 @@
|
|
|
1
1
|
#ifndef Rice__detail__from_ruby__hpp_
|
|
2
2
|
#define Rice__detail__from_ruby__hpp_
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
namespace detail
|
|
7
|
-
{
|
|
8
|
-
template<typename T>
|
|
9
|
-
struct from_ruby_
|
|
10
|
-
{
|
|
11
|
-
typedef T Retval_T;
|
|
12
|
-
|
|
13
|
-
static T convert(Rice::Object x);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
template<typename T>
|
|
17
|
-
struct from_ruby_<T *>
|
|
18
|
-
{
|
|
19
|
-
typedef T * Retval_T;
|
|
20
|
-
|
|
21
|
-
static T * convert(Rice::Object x);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
template<typename T>
|
|
25
|
-
struct from_ruby_<T const *>
|
|
26
|
-
{
|
|
27
|
-
typedef T const * Retval_T;
|
|
28
|
-
|
|
29
|
-
static T const * convert(Rice::Object x);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
template<typename T>
|
|
33
|
-
struct from_ruby_<T &>
|
|
34
|
-
{
|
|
35
|
-
typedef T & Retval_T;
|
|
36
|
-
|
|
37
|
-
static T & convert(Rice::Object x);
|
|
38
|
-
};
|
|
39
|
-
} // detail
|
|
40
|
-
} // Rice
|
|
4
|
+
#include "from_ruby_defn.hpp"
|
|
5
|
+
#include "from_ruby.ipp"
|
|
41
6
|
|
|
42
7
|
#endif // Rice__detail__from_ruby__hpp_
|
|
43
8
|
|