rice 4.3.2 → 4.5.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 +66 -25
- data/README.md +7 -2
- data/Rakefile +7 -1
- data/include/rice/rice.hpp +7321 -4470
- data/include/rice/stl.hpp +769 -222
- data/lib/mkmf-rice.rb +37 -95
- data/rice/Address_Registration_Guard.hpp +72 -3
- data/rice/Arg.hpp +19 -5
- data/rice/Arg.ipp +24 -0
- data/rice/Callback.hpp +21 -0
- data/rice/Callback.ipp +13 -0
- data/rice/Constructor.hpp +4 -27
- data/rice/Constructor.ipp +79 -0
- data/rice/Data_Object.hpp +74 -3
- data/rice/Data_Object.ipp +324 -32
- data/rice/Data_Type.hpp +215 -3
- data/rice/Data_Type.ipp +125 -64
- data/rice/Director.hpp +0 -2
- data/rice/Enum.hpp +4 -6
- data/rice/Enum.ipp +101 -57
- data/rice/Exception.hpp +62 -2
- data/rice/Exception.ipp +7 -12
- data/rice/JumpException.hpp +44 -0
- data/rice/JumpException.ipp +48 -0
- data/rice/MemoryView.hpp +11 -0
- data/rice/MemoryView.ipp +43 -0
- data/rice/Return.hpp +6 -26
- data/rice/Return.ipp +10 -16
- data/rice/detail/DefaultHandler.hpp +12 -0
- data/rice/detail/DefaultHandler.ipp +8 -0
- data/rice/detail/HandlerRegistry.hpp +5 -35
- data/rice/detail/HandlerRegistry.ipp +7 -11
- data/rice/detail/InstanceRegistry.hpp +1 -4
- data/rice/detail/MethodInfo.hpp +15 -5
- data/rice/detail/MethodInfo.ipp +78 -6
- data/rice/detail/Native.hpp +32 -0
- data/rice/detail/Native.ipp +129 -0
- data/rice/detail/NativeAttributeGet.hpp +51 -0
- data/rice/detail/NativeAttributeGet.ipp +51 -0
- data/rice/detail/NativeAttributeSet.hpp +43 -0
- data/rice/detail/NativeAttributeSet.ipp +82 -0
- data/rice/detail/NativeCallbackFFI.hpp +55 -0
- data/rice/detail/NativeCallbackFFI.ipp +151 -0
- data/rice/detail/NativeCallbackSimple.hpp +30 -0
- data/rice/detail/NativeCallbackSimple.ipp +29 -0
- data/rice/detail/NativeFunction.hpp +20 -21
- data/rice/detail/NativeFunction.ipp +199 -64
- data/rice/detail/NativeIterator.hpp +8 -11
- data/rice/detail/NativeIterator.ipp +27 -31
- data/rice/detail/NativeRegistry.hpp +24 -17
- data/rice/detail/NativeRegistry.ipp +23 -56
- data/rice/detail/Proc.hpp +4 -0
- data/rice/detail/Proc.ipp +85 -0
- data/rice/detail/Registries.hpp +0 -7
- data/rice/detail/Registries.ipp +0 -18
- data/rice/detail/RubyFunction.hpp +0 -3
- data/rice/detail/RubyFunction.ipp +4 -8
- data/rice/detail/RubyType.hpp +19 -0
- data/rice/detail/RubyType.ipp +187 -0
- data/rice/detail/TupleIterator.hpp +14 -0
- data/rice/detail/Type.hpp +5 -6
- data/rice/detail/Type.ipp +150 -33
- data/rice/detail/TypeRegistry.hpp +15 -7
- data/rice/detail/TypeRegistry.ipp +105 -12
- data/rice/detail/Wrapper.hpp +6 -5
- data/rice/detail/Wrapper.ipp +45 -23
- data/rice/detail/cpp_protect.hpp +5 -6
- data/rice/detail/default_allocation_func.ipp +0 -2
- data/rice/detail/from_ruby.hpp +37 -3
- data/rice/detail/from_ruby.ipp +911 -454
- data/rice/detail/ruby.hpp +18 -0
- data/rice/detail/to_ruby.hpp +41 -3
- data/rice/detail/to_ruby.ipp +437 -113
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +1 -2
- data/rice/rice.hpp +105 -22
- data/rice/ruby_mark.hpp +4 -3
- data/rice/stl.hpp +4 -0
- data/test/embed_ruby.cpp +4 -1
- data/test/extconf.rb +2 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
- data/test/test_Address_Registration_Guard.cpp +5 -0
- data/test/test_Array.cpp +12 -1
- data/test/test_Attribute.cpp +103 -21
- data/test/test_Builtin_Object.cpp +5 -0
- data/test/test_Callback.cpp +231 -0
- data/test/test_Class.cpp +5 -31
- data/test/test_Constructor.cpp +69 -6
- data/test/test_Data_Object.cpp +9 -4
- data/test/test_Data_Type.cpp +428 -64
- data/test/test_Director.cpp +10 -5
- data/test/test_Enum.cpp +152 -40
- data/test/test_Exception.cpp +235 -0
- data/test/test_File.cpp +70 -0
- data/test/test_From_Ruby.cpp +542 -0
- data/test/test_Hash.cpp +5 -0
- data/test/test_Identifier.cpp +5 -0
- data/test/test_Inheritance.cpp +6 -1
- data/test/test_Iterator.cpp +5 -0
- data/test/test_JumpException.cpp +22 -0
- data/test/test_Keep_Alive.cpp +6 -1
- data/test/test_Keep_Alive_No_Wrapper.cpp +5 -0
- data/test/test_Memory_Management.cpp +5 -0
- data/test/test_Module.cpp +118 -64
- data/test/test_Native_Registry.cpp +2 -33
- data/test/test_Object.cpp +5 -0
- data/test/test_Overloads.cpp +631 -0
- data/test/test_Ownership.cpp +67 -4
- data/test/test_Proc.cpp +45 -0
- data/test/test_Self.cpp +5 -0
- data/test/test_Stl_Exception.cpp +109 -0
- data/test/test_Stl_Map.cpp +22 -8
- data/test/test_Stl_Optional.cpp +5 -0
- data/test/test_Stl_Pair.cpp +7 -2
- data/test/test_Stl_Reference_Wrapper.cpp +5 -0
- data/test/test_Stl_SmartPointer.cpp +210 -5
- data/test/test_Stl_String.cpp +5 -0
- data/test/test_Stl_String_View.cpp +5 -0
- data/test/test_Stl_Type.cpp +147 -0
- data/test/test_Stl_Unordered_Map.cpp +18 -7
- data/test/test_Stl_Variant.cpp +5 -0
- data/test/test_Stl_Vector.cpp +130 -8
- data/test/test_String.cpp +5 -0
- data/test/test_Struct.cpp +5 -0
- data/test/test_Symbol.cpp +5 -0
- data/test/test_Template.cpp +192 -0
- data/test/test_To_Ruby.cpp +152 -0
- data/test/test_Tracking.cpp +1 -0
- data/test/test_Type.cpp +100 -0
- data/test/test_global_functions.cpp +53 -6
- data/test/unittest.cpp +8 -0
- metadata +37 -20
- data/lib/version.rb +0 -3
- data/rice/Address_Registration_Guard_defn.hpp +0 -79
- data/rice/Data_Object_defn.hpp +0 -84
- data/rice/Data_Type_defn.hpp +0 -190
- data/rice/Exception_defn.hpp +0 -68
- data/rice/HandlerRegistration.hpp +0 -15
- data/rice/Identifier.hpp +0 -50
- data/rice/Identifier.ipp +0 -29
- data/rice/detail/ExceptionHandler.hpp +0 -8
- data/rice/detail/ExceptionHandler.ipp +0 -28
- data/rice/detail/ExceptionHandler_defn.hpp +0 -77
- data/rice/detail/Jump_Tag.hpp +0 -21
- data/rice/detail/NativeAttribute.hpp +0 -64
- data/rice/detail/NativeAttribute.ipp +0 -112
- data/rice/detail/from_ruby_defn.hpp +0 -38
- data/rice/detail/to_ruby_defn.hpp +0 -48
- data/test/test_Jump_Tag.cpp +0 -17
- data/test/test_To_From_Ruby.cpp +0 -399
data/rice/Exception_defn.hpp
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
#ifndef Rice__Exception_defn__hpp_
|
2
|
-
#define Rice__Exception_defn__hpp_
|
3
|
-
|
4
|
-
#include <stdexcept>
|
5
|
-
#include "detail/ruby.hpp"
|
6
|
-
|
7
|
-
namespace Rice
|
8
|
-
{
|
9
|
-
//! A placeholder for Ruby exceptions.
|
10
|
-
/*! You can use this to safely throw a Ruby exception using C++ syntax:
|
11
|
-
* \code
|
12
|
-
* VALUE foo(VALUE self) {
|
13
|
-
* RUBY_TRY {
|
14
|
-
* throw Rice::Exception(rb_eMyException, "uh oh!");
|
15
|
-
* RUBY_CATCH
|
16
|
-
* }
|
17
|
-
* \endcode
|
18
|
-
*/
|
19
|
-
class Exception
|
20
|
-
: public std::exception
|
21
|
-
{
|
22
|
-
public:
|
23
|
-
//! Construct a Exception with a Ruby exception instance
|
24
|
-
explicit Exception(VALUE exception);
|
25
|
-
|
26
|
-
//! Construct a Exception with printf-style formatting.
|
27
|
-
/*! \param exc either an exception object or a class that inherits
|
28
|
-
* from Exception.
|
29
|
-
* \param fmt a printf-style format string
|
30
|
-
* \param ... the arguments to the format string.
|
31
|
-
*/
|
32
|
-
template <typename... Arg_Ts>
|
33
|
-
Exception(const Exception& other, char const* fmt, Arg_Ts&&...args);
|
34
|
-
|
35
|
-
//! Construct a Exception with printf-style formatting.
|
36
|
-
/*! \param exc either an exception object or a class that inherits
|
37
|
-
* from Exception.
|
38
|
-
* \param fmt a printf-style format string
|
39
|
-
* \param ... the arguments to the format string.
|
40
|
-
*/
|
41
|
-
template <typename... Arg_Ts>
|
42
|
-
Exception(const VALUE exceptionType, char const* fmt, Arg_Ts&&...args);
|
43
|
-
|
44
|
-
//! Destructor
|
45
|
-
virtual ~Exception() noexcept = default;
|
46
|
-
|
47
|
-
//! Get message as a char const *.
|
48
|
-
/*! If message is a non-string object, then this function will attempt
|
49
|
-
* to throw an exception (which it can't do because of the no-throw
|
50
|
-
* specification).
|
51
|
-
* \return the underlying C pointer of the underlying message object.
|
52
|
-
*/
|
53
|
-
virtual char const* what() const noexcept override;
|
54
|
-
|
55
|
-
//! Returns the Ruby exception class
|
56
|
-
VALUE class_of() const;
|
57
|
-
|
58
|
-
//! Returns an instance of a Ruby exception
|
59
|
-
VALUE value() const;
|
60
|
-
|
61
|
-
private:
|
62
|
-
// TODO: Do we need to tell the Ruby gc about an exception instance?
|
63
|
-
mutable VALUE exception_ = Qnil;
|
64
|
-
mutable std::string message_;
|
65
|
-
};
|
66
|
-
} // namespace Rice
|
67
|
-
|
68
|
-
#endif // Rice__Exception_defn__hpp_
|
@@ -1,15 +0,0 @@
|
|
1
|
-
#ifndef Rice__HandlerRegistration__hpp_
|
2
|
-
#define Rice__HandlerRegistration__hpp_
|
3
|
-
|
4
|
-
#include "detail/HandlerRegistry.hpp"
|
5
|
-
|
6
|
-
namespace Rice
|
7
|
-
{
|
8
|
-
// Register exception handler
|
9
|
-
template<typename Exception_T, typename Functor_T>
|
10
|
-
detail::HandlerRegistry register_handler(Functor_T functor)
|
11
|
-
{
|
12
|
-
return detail::Registries::instance.handlers.add<Exception_T, Functor_T>(std::forward<Functor_T>(functor));
|
13
|
-
}
|
14
|
-
}
|
15
|
-
#endif // Rice__HandlerRegistration__hpp_
|
data/rice/Identifier.hpp
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
#ifndef Rice__Identifier__hpp_
|
2
|
-
#define Rice__Identifier__hpp_
|
3
|
-
|
4
|
-
#include <string>
|
5
|
-
|
6
|
-
namespace Rice
|
7
|
-
{
|
8
|
-
class Symbol;
|
9
|
-
|
10
|
-
//! A wrapper for the ID type
|
11
|
-
/*! An ID is ruby's internal representation of a Symbol object.
|
12
|
-
*/
|
13
|
-
class Identifier
|
14
|
-
{
|
15
|
-
public:
|
16
|
-
//! Construct a new Identifier from an ID.
|
17
|
-
Identifier(ID id);
|
18
|
-
|
19
|
-
//! Construct a new Identifier from a Symbol.
|
20
|
-
Identifier(Symbol const& symbol);
|
21
|
-
|
22
|
-
//! Construct a new Identifier from a c string.
|
23
|
-
Identifier(char const* s);
|
24
|
-
|
25
|
-
//! Construct a new Identifier from a string.
|
26
|
-
Identifier(std::string const& string);
|
27
|
-
|
28
|
-
//! Return a string representation of the Identifier.
|
29
|
-
char const* c_str() const;
|
30
|
-
|
31
|
-
//! Return a string representation of the Identifier.
|
32
|
-
std::string str() const;
|
33
|
-
|
34
|
-
//! Return the underlying ID
|
35
|
-
ID id() const { return id_; }
|
36
|
-
|
37
|
-
//! Return the underlying ID
|
38
|
-
operator ID() const { return id_; }
|
39
|
-
|
40
|
-
//! Return the ID as a Symbol
|
41
|
-
VALUE to_sym() const;
|
42
|
-
|
43
|
-
private:
|
44
|
-
ID id_;
|
45
|
-
};
|
46
|
-
} // namespace Rice
|
47
|
-
|
48
|
-
#include "Identifier.ipp"
|
49
|
-
|
50
|
-
#endif // Rice__Identifier__hpp_
|
data/rice/Identifier.ipp
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
namespace Rice
|
2
|
-
{
|
3
|
-
inline Identifier::Identifier(ID id) : id_(id)
|
4
|
-
{
|
5
|
-
}
|
6
|
-
|
7
|
-
inline Identifier::Identifier(char const* s) : id_(rb_intern(s))
|
8
|
-
{
|
9
|
-
}
|
10
|
-
|
11
|
-
inline Identifier::Identifier(std::string const& s) : id_(rb_intern2(s.c_str(), s.size()))
|
12
|
-
{
|
13
|
-
}
|
14
|
-
|
15
|
-
inline char const* Identifier::c_str() const
|
16
|
-
{
|
17
|
-
return detail::protect(rb_id2name, id_);
|
18
|
-
}
|
19
|
-
|
20
|
-
inline std::string Identifier::str() const
|
21
|
-
{
|
22
|
-
return c_str();
|
23
|
-
}
|
24
|
-
|
25
|
-
inline VALUE Identifier::to_sym() const
|
26
|
-
{
|
27
|
-
return ID2SYM(id_);
|
28
|
-
}
|
29
|
-
}
|
@@ -1,28 +0,0 @@
|
|
1
|
-
namespace Rice::detail
|
2
|
-
{
|
3
|
-
inline VALUE Rice::detail::DefaultExceptionHandler::handle() const
|
4
|
-
{
|
5
|
-
throw;
|
6
|
-
}
|
7
|
-
|
8
|
-
template <typename Exception_T, typename Functor_T>
|
9
|
-
inline Rice::detail::CustomExceptionHandler<Exception_T, Functor_T>::
|
10
|
-
CustomExceptionHandler(Functor_T handler, std::shared_ptr<ExceptionHandler> nextHandler)
|
11
|
-
: handler_(handler), nextHandler_(nextHandler)
|
12
|
-
{
|
13
|
-
}
|
14
|
-
|
15
|
-
template <typename Exception_T, typename Functor_T>
|
16
|
-
inline VALUE Rice::detail::CustomExceptionHandler<Exception_T, Functor_T>::handle() const
|
17
|
-
{
|
18
|
-
try
|
19
|
-
{
|
20
|
-
return this->nextHandler_->handle();
|
21
|
-
}
|
22
|
-
catch (Exception_T const& ex)
|
23
|
-
{
|
24
|
-
handler_(ex);
|
25
|
-
throw;
|
26
|
-
}
|
27
|
-
}
|
28
|
-
}
|
@@ -1,77 +0,0 @@
|
|
1
|
-
#ifndef Rice__detail__ExceptionHandler_defn__hpp_
|
2
|
-
#define Rice__detail__ExceptionHandler_defn__hpp_
|
3
|
-
|
4
|
-
#include <memory>
|
5
|
-
#include "ruby.hpp"
|
6
|
-
|
7
|
-
namespace Rice::detail
|
8
|
-
{
|
9
|
-
/* An abstract class for converting C++ exceptions to ruby exceptions. It's used
|
10
|
-
like this:
|
11
|
-
|
12
|
-
try
|
13
|
-
{
|
14
|
-
}
|
15
|
-
catch(...)
|
16
|
-
{
|
17
|
-
handler->handle();
|
18
|
-
}
|
19
|
-
|
20
|
-
If an exception is thrown the handler will pass the exception up the
|
21
|
-
chain, then the last handler in the chain will throw the exception
|
22
|
-
down the chain until a lower handler can handle it, e.g.:
|
23
|
-
|
24
|
-
try
|
25
|
-
{
|
26
|
-
return call_next_ExceptionHandler();
|
27
|
-
}
|
28
|
-
catch(MyException const & ex)
|
29
|
-
{
|
30
|
-
throw Rice::Exception(rb_cMyException, "%s", ex.what());
|
31
|
-
}
|
32
|
-
|
33
|
-
Memory management. Handlers are created by the ModuleBase constructor. When the
|
34
|
-
module defines a new Ruby method, metadata is stored on the Ruby klass including
|
35
|
-
the exception handler. Since the metadata outlives the module, handlers are stored
|
36
|
-
using std::shared_ptr. Thus the Module (or its inherited children) can be destroyed
|
37
|
-
without corrupting the metadata references to the shared exception handler. */
|
38
|
-
|
39
|
-
class ExceptionHandler
|
40
|
-
{
|
41
|
-
public:
|
42
|
-
ExceptionHandler() = default;
|
43
|
-
virtual ~ExceptionHandler() = default;
|
44
|
-
|
45
|
-
// Don't allow copying or assignment
|
46
|
-
ExceptionHandler(const ExceptionHandler& other) = delete;
|
47
|
-
ExceptionHandler& operator=(const ExceptionHandler& other) = delete;
|
48
|
-
|
49
|
-
virtual VALUE handle() const = 0;
|
50
|
-
};
|
51
|
-
|
52
|
-
// The default exception handler just rethrows the exception. If there
|
53
|
-
// are other handlers in the chain, they will try to handle the rethrown
|
54
|
-
// exception.
|
55
|
-
class DefaultExceptionHandler : public ExceptionHandler
|
56
|
-
{
|
57
|
-
public:
|
58
|
-
virtual VALUE handle() const override;
|
59
|
-
};
|
60
|
-
|
61
|
-
// An exception handler that takes a functor as an argument. The
|
62
|
-
// functor should throw a Rice::Exception to handle the exception. If
|
63
|
-
// the functor does not handle the exception, the exception will be
|
64
|
-
// re-thrown.
|
65
|
-
template <typename Exception_T, typename Functor_T>
|
66
|
-
class CustomExceptionHandler : public ExceptionHandler
|
67
|
-
{
|
68
|
-
public:
|
69
|
-
CustomExceptionHandler(Functor_T handler, std::shared_ptr<ExceptionHandler> nextHandler);
|
70
|
-
virtual VALUE handle() const override;
|
71
|
-
|
72
|
-
private:
|
73
|
-
Functor_T handler_;
|
74
|
-
std::shared_ptr<ExceptionHandler> nextHandler_;
|
75
|
-
};
|
76
|
-
}
|
77
|
-
#endif // Rice__detail__ExceptionHandler_defn__hpp_
|
data/rice/detail/Jump_Tag.hpp
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#ifndef Rice__detail__Jump_Tag__hpp_
|
2
|
-
#define Rice__detail__Jump_Tag__hpp_
|
3
|
-
|
4
|
-
namespace Rice
|
5
|
-
{
|
6
|
-
//! A placeholder for Ruby longjmp data.
|
7
|
-
/*! When a Ruby exception is caught, the tag used for the longjmp is stored in
|
8
|
-
* a Jump_Tag, then later passed to rb_jump_tag() when there is no more
|
9
|
-
* C++ code to pass over.
|
10
|
-
*/
|
11
|
-
struct Jump_Tag
|
12
|
-
{
|
13
|
-
//! Construct a Jump_Tag with tag t.
|
14
|
-
Jump_Tag(int t) : tag(t) {}
|
15
|
-
|
16
|
-
//! The tag being held.
|
17
|
-
int tag;
|
18
|
-
};
|
19
|
-
} // namespace Rice
|
20
|
-
|
21
|
-
#endif // Rice__detail__Jump_Tag__hpp_
|
@@ -1,64 +0,0 @@
|
|
1
|
-
#ifndef Rice__detail__Native_Attribute__hpp_
|
2
|
-
#define Rice__detail__Native_Attribute__hpp_
|
3
|
-
|
4
|
-
#include "ruby.hpp"
|
5
|
-
#include "../traits/attribute_traits.hpp"
|
6
|
-
|
7
|
-
namespace Rice
|
8
|
-
{
|
9
|
-
enum class AttrAccess
|
10
|
-
{
|
11
|
-
ReadWrite,
|
12
|
-
Read,
|
13
|
-
Write
|
14
|
-
};
|
15
|
-
|
16
|
-
namespace detail
|
17
|
-
{
|
18
|
-
template<typename Attribute_T>
|
19
|
-
class NativeAttribute
|
20
|
-
{
|
21
|
-
public:
|
22
|
-
using NativeAttribute_T = NativeAttribute<Attribute_T>;
|
23
|
-
|
24
|
-
using T = typename attribute_traits<Attribute_T>::attr_type;
|
25
|
-
using T_Unqualified = remove_cv_recursive_t<T>;
|
26
|
-
using Receiver_T = typename attribute_traits<Attribute_T>::class_type;
|
27
|
-
|
28
|
-
public:
|
29
|
-
// Register attribute getter/setter with Ruby
|
30
|
-
static void define(VALUE klass, std::string name, Attribute_T attribute, AttrAccess access = AttrAccess::ReadWrite);
|
31
|
-
|
32
|
-
// Static member functions that Ruby calls to read an attribute value
|
33
|
-
static VALUE get(VALUE self);
|
34
|
-
|
35
|
-
// Static member functions that Ruby calls to write an attribute value
|
36
|
-
static VALUE set(VALUE self, VALUE value);
|
37
|
-
|
38
|
-
public:
|
39
|
-
// Disallow creating/copying/moving
|
40
|
-
NativeAttribute() = delete;
|
41
|
-
NativeAttribute(const NativeAttribute_T&) = delete;
|
42
|
-
NativeAttribute(NativeAttribute_T&&) = delete;
|
43
|
-
void operator=(const NativeAttribute_T&) = delete;
|
44
|
-
void operator=(NativeAttribute_T&&) = delete;
|
45
|
-
|
46
|
-
protected:
|
47
|
-
NativeAttribute(VALUE klass, std::string name, Attribute_T attr, AttrAccess access = AttrAccess::ReadWrite);
|
48
|
-
|
49
|
-
// Invokes the wrapped function
|
50
|
-
VALUE read(VALUE self);
|
51
|
-
VALUE write(VALUE self, VALUE value);
|
52
|
-
|
53
|
-
private:
|
54
|
-
VALUE klass_;
|
55
|
-
std::string name_;
|
56
|
-
Attribute_T attribute_;
|
57
|
-
AttrAccess access_;
|
58
|
-
};
|
59
|
-
} // detail
|
60
|
-
} // Rice
|
61
|
-
|
62
|
-
#include "NativeAttribute.ipp"
|
63
|
-
|
64
|
-
#endif // Rice__detail__Native_Attribute__hpp_
|
@@ -1,112 +0,0 @@
|
|
1
|
-
#include <array>
|
2
|
-
#include <algorithm>
|
3
|
-
|
4
|
-
#include "../traits/rice_traits.hpp"
|
5
|
-
#include "NativeRegistry.hpp"
|
6
|
-
#include "to_ruby_defn.hpp"
|
7
|
-
#include "cpp_protect.hpp"
|
8
|
-
|
9
|
-
namespace Rice::detail
|
10
|
-
{
|
11
|
-
template<typename Attribute_T>
|
12
|
-
void NativeAttribute<Attribute_T>::define(VALUE klass, std::string name, Attribute_T attribute, AttrAccess access)
|
13
|
-
{
|
14
|
-
// Create a NativeAttribute that Ruby will call to read/write C++ variables
|
15
|
-
NativeAttribute_T* native = new NativeAttribute_T(klass, name, std::forward<Attribute_T>(attribute), access);
|
16
|
-
|
17
|
-
if (access == AttrAccess::ReadWrite || access == AttrAccess::Read)
|
18
|
-
{
|
19
|
-
// Tell Ruby to invoke the static method read to get the attribute value
|
20
|
-
detail::protect(rb_define_method, klass, name.c_str(), (RUBY_METHOD_FUNC)&NativeAttribute_T::get, 0);
|
21
|
-
|
22
|
-
// Add to native registry
|
23
|
-
detail::Registries::instance.natives.add(klass, Identifier(name).id(), native);
|
24
|
-
}
|
25
|
-
|
26
|
-
if (access == AttrAccess::ReadWrite || access == AttrAccess::Write)
|
27
|
-
{
|
28
|
-
if (std::is_const_v<std::remove_pointer_t<T>>)
|
29
|
-
{
|
30
|
-
throw std::runtime_error(name + " is readonly");
|
31
|
-
}
|
32
|
-
|
33
|
-
// Define the write method name
|
34
|
-
std::string setter = name + "=";
|
35
|
-
|
36
|
-
// Tell Ruby to invoke the static method write to get the attribute value
|
37
|
-
detail::protect(rb_define_method, klass, setter.c_str(), (RUBY_METHOD_FUNC)&NativeAttribute_T::set, 1);
|
38
|
-
|
39
|
-
// Add to native registry
|
40
|
-
detail::Registries::instance.natives.add(klass, Identifier(setter).id(), native);
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
template<typename Attribute_T>
|
45
|
-
inline VALUE NativeAttribute<Attribute_T>::get(VALUE self)
|
46
|
-
{
|
47
|
-
return cpp_protect([&]
|
48
|
-
{
|
49
|
-
using Native_Attr_T = NativeAttribute<Attribute_T>;
|
50
|
-
Native_Attr_T* attr = detail::Registries::instance.natives.lookup<Native_Attr_T*>();
|
51
|
-
return attr->read(self);
|
52
|
-
});
|
53
|
-
}
|
54
|
-
|
55
|
-
template<typename Attribute_T>
|
56
|
-
inline VALUE NativeAttribute<Attribute_T>::set(VALUE self, VALUE value)
|
57
|
-
{
|
58
|
-
return cpp_protect([&]
|
59
|
-
{
|
60
|
-
using Native_Attr_T = NativeAttribute<Attribute_T>;
|
61
|
-
Native_Attr_T* attr = detail::Registries::instance.natives.lookup<Native_Attr_T*>();
|
62
|
-
return attr->write(self, value);
|
63
|
-
});
|
64
|
-
}
|
65
|
-
|
66
|
-
template<typename Attribute_T>
|
67
|
-
NativeAttribute<Attribute_T>::NativeAttribute(VALUE klass, std::string name,
|
68
|
-
Attribute_T attribute, AttrAccess access)
|
69
|
-
: klass_(klass), name_(name), attribute_(attribute), access_(access)
|
70
|
-
{
|
71
|
-
}
|
72
|
-
|
73
|
-
template<typename Attribute_T>
|
74
|
-
inline VALUE NativeAttribute<Attribute_T>::read(VALUE self)
|
75
|
-
{
|
76
|
-
using T_Unqualified = remove_cv_recursive_t<T>;
|
77
|
-
if constexpr (std::is_member_object_pointer_v<Attribute_T>)
|
78
|
-
{
|
79
|
-
Receiver_T* nativeSelf = From_Ruby<Receiver_T*>().convert(self);
|
80
|
-
return To_Ruby<T_Unqualified>().convert(nativeSelf->*attribute_);
|
81
|
-
}
|
82
|
-
else
|
83
|
-
{
|
84
|
-
return To_Ruby<T_Unqualified>().convert(*attribute_);
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
template<typename Attribute_T>
|
89
|
-
inline VALUE NativeAttribute<Attribute_T>::write(VALUE self, VALUE value)
|
90
|
-
{
|
91
|
-
if constexpr (std::is_fundamental_v<intrinsic_type<T>> && std::is_pointer_v<T>)
|
92
|
-
{
|
93
|
-
static_assert(true, "An fundamental value, such as an integer, cannot be assigned to an attribute that is a pointer");
|
94
|
-
}
|
95
|
-
else if constexpr (std::is_same_v<intrinsic_type<T>, std::string> && std::is_pointer_v<T>)
|
96
|
-
{
|
97
|
-
static_assert(true, "An string cannot be assigned to an attribute that is a pointer");
|
98
|
-
}
|
99
|
-
|
100
|
-
if constexpr (!std::is_null_pointer_v<Receiver_T>)
|
101
|
-
{
|
102
|
-
Receiver_T* nativeSelf = From_Ruby<Receiver_T*>().convert(self);
|
103
|
-
nativeSelf->*attribute_ = From_Ruby<T_Unqualified>().convert(value);
|
104
|
-
}
|
105
|
-
else if constexpr (!std::is_const_v<std::remove_pointer_t<T>>)
|
106
|
-
{
|
107
|
-
*attribute_ = From_Ruby<T_Unqualified>().convert(value);
|
108
|
-
}
|
109
|
-
|
110
|
-
return value;
|
111
|
-
}
|
112
|
-
} // Rice
|
@@ -1,38 +0,0 @@
|
|
1
|
-
#ifndef Rice__detail__from_ruby_defn__hpp_
|
2
|
-
#define Rice__detail__from_ruby_defn__hpp_
|
3
|
-
|
4
|
-
#include <type_traits>
|
5
|
-
|
6
|
-
#include "ruby.hpp"
|
7
|
-
|
8
|
-
namespace Rice::detail
|
9
|
-
{
|
10
|
-
//! Convert a Ruby object to C++.
|
11
|
-
/*! If the Ruby object can be converted to an immediate value, returns a
|
12
|
-
* copy of the Ruby object. If the Ruby object is holding a C++
|
13
|
-
* object and the type specified is a pointer to that type, returns a
|
14
|
-
* pointer to that object.
|
15
|
-
*
|
16
|
-
* Conversions from ruby to a pointer type are automatically generated
|
17
|
-
* when a type is bound using Data_Type. If no conversion exists an
|
18
|
-
* exception is thrown.
|
19
|
-
*
|
20
|
-
* \param T the C++ type to which to convert.
|
21
|
-
* \param x the Ruby object to convert.
|
22
|
-
* \return a C++ representation of the Ruby object.
|
23
|
-
*
|
24
|
-
* Example:
|
25
|
-
* \code
|
26
|
-
* Object x = INT2NUM(42);
|
27
|
-
* std::cout << From_Ruby<int>::convert(x);
|
28
|
-
*
|
29
|
-
* Data_Object<Foo> foo(new Foo);
|
30
|
-
* std::cout << *From_Ruby<Foo *>(foo) << std::endl;
|
31
|
-
* \endcode
|
32
|
-
*/
|
33
|
-
|
34
|
-
template <typename T>
|
35
|
-
class From_Ruby;
|
36
|
-
}
|
37
|
-
|
38
|
-
#endif // Rice__detail__From_Ruby2_defn__hpp_
|
@@ -1,48 +0,0 @@
|
|
1
|
-
#ifndef Rice__detail__to_ruby_defn__hpp_
|
2
|
-
#define Rice__detail__to_ruby_defn__hpp_
|
3
|
-
|
4
|
-
#include "../traits/rice_traits.hpp"
|
5
|
-
|
6
|
-
namespace Rice
|
7
|
-
{
|
8
|
-
namespace detail
|
9
|
-
{
|
10
|
-
//! Convert a C++ object to Ruby.
|
11
|
-
/*! If x is a pointer, wraps the pointee as a Ruby object. If x is an
|
12
|
-
* Object, returns x.
|
13
|
-
*
|
14
|
-
* If no conversion exists a compile-time error is generated.
|
15
|
-
*
|
16
|
-
* \param x the object to convert.
|
17
|
-
* \return a Ruby representation of the C++ object.
|
18
|
-
*
|
19
|
-
* Example:
|
20
|
-
* \code
|
21
|
-
* rb_p(to_ruby(42));
|
22
|
-
*
|
23
|
-
* Foo * p_foo = new Foo();
|
24
|
-
* rb_p(to_ruby(p_foo));
|
25
|
-
* \endcode
|
26
|
-
*/
|
27
|
-
template <typename T>
|
28
|
-
class To_Ruby;
|
29
|
-
|
30
|
-
// Helper template function that let's users avoid having to specify the template type - its deduced
|
31
|
-
template <typename T>
|
32
|
-
VALUE to_ruby(T&& x)
|
33
|
-
{
|
34
|
-
using Unqualified_T = remove_cv_recursive_t<T>;
|
35
|
-
return To_Ruby<Unqualified_T>().convert(std::forward<T>(x));
|
36
|
-
}
|
37
|
-
|
38
|
-
// Helper template function that let's users avoid having to specify the template type - its deduced
|
39
|
-
template <typename T>
|
40
|
-
VALUE to_ruby(T* x)
|
41
|
-
{
|
42
|
-
using Unqualified_T = remove_cv_recursive_t<T>;
|
43
|
-
return To_Ruby<Unqualified_T*>().convert(x);
|
44
|
-
}
|
45
|
-
} // detail
|
46
|
-
} // Rice
|
47
|
-
|
48
|
-
#endif // Rice__detail__to_ruby_defn__hpp_
|
data/test/test_Jump_Tag.cpp
DELETED