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/lib/mkmf-rice.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
IS_MSWIN = !RbConfig::CONFIG['host_os'].match(/mswin/).nil?
|
4
|
+
IS_DARWIN = !RbConfig::CONFIG['host_os'].match(/darwin/).nil?
|
5
|
+
|
6
|
+
# If we are on versions of Ruby before 2.7 then we need to copy in the experimental C++ support
|
7
|
+
# added in Ruby 2.7
|
8
|
+
unless MakeMakefile.methods.include?(:[])
|
9
|
+
|
10
|
+
# Ruby 2.6 makes this declaration which is not valid with C++17
|
11
|
+
# void rb_mem_clear(register VALUE*, register long);
|
12
|
+
if !IS_MSWIN
|
13
|
+
$CXXFLAGS += " " << "-Wno-register"
|
14
|
+
end
|
15
|
+
|
16
|
+
MakeMakefile::CONFTEST_C = "#{CONFTEST}.cc"
|
17
|
+
|
18
|
+
MakeMakefile.module_eval do
|
19
|
+
CONFTEST_C = "#{CONFTEST}.cc"
|
20
|
+
def cc_config(opt="")
|
21
|
+
conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote,
|
22
|
+
'arch_hdrdir' => $arch_hdrdir.quote,
|
23
|
+
'top_srcdir' => $top_srcdir.quote)
|
24
|
+
conf
|
25
|
+
end
|
26
|
+
|
27
|
+
def link_config(ldflags, opt="", libpath=$DEFLIBPATH|$LIBPATH)
|
28
|
+
librubyarg = $extmk ? $LIBRUBYARG_STATIC : "$(LIBRUBYARG)"
|
29
|
+
conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote,
|
30
|
+
'src' => "#{conftest_source}",
|
31
|
+
'arch_hdrdir' => $arch_hdrdir.quote,
|
32
|
+
'top_srcdir' => $top_srcdir.quote,
|
33
|
+
'INCFLAGS' => "#$INCFLAGS",
|
34
|
+
'CPPFLAGS' => "#$CPPFLAGS",
|
35
|
+
'CFLAGS' => "#$CFLAGS",
|
36
|
+
'ARCH_FLAG' => "#$ARCH_FLAG",
|
37
|
+
'LDFLAGS' => "#$LDFLAGS #{ldflags}",
|
38
|
+
'LOCAL_LIBS' => "#$LOCAL_LIBS #$libs",
|
39
|
+
'LIBS' => "#{librubyarg} #{opt} #$LIBS")
|
40
|
+
conf['LIBPATH'] = libpathflag(libpath.map {|s| RbConfig::expand(s.dup, conf)})
|
41
|
+
conf
|
42
|
+
end
|
43
|
+
|
44
|
+
@lang = Hash.new(self)
|
45
|
+
|
46
|
+
def self.[](name)
|
47
|
+
@lang.fetch(name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.[]=(name, mod)
|
51
|
+
@lang[name] = mod
|
52
|
+
end
|
53
|
+
|
54
|
+
MakeMakefile["C++"] = Module.new do
|
55
|
+
include MakeMakefile
|
56
|
+
extend self
|
57
|
+
|
58
|
+
CONFTEST_CXX = "#{CONFTEST}.#{config_string('CXX_EXT') || CXX_EXT[0]}"
|
59
|
+
|
60
|
+
TRY_LINK_CXX = config_string('TRY_LINK_CXX') ||
|
61
|
+
((cmd = TRY_LINK.gsub(/\$\(C(?:C|(FLAGS))\)/, '$(CXX\1)')) != TRY_LINK && cmd) ||
|
62
|
+
"$(CXX) #{OUTFLAG}#{CONFTEST}#{$EXEEXT} $(INCFLAGS) $(CPPFLAGS) " \
|
63
|
+
"$(CXXFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(ARCH_FLAG) $(LOCAL_LIBS) $(LIBS)"
|
64
|
+
|
65
|
+
def have_devel?
|
66
|
+
unless defined? @have_devel
|
67
|
+
@have_devel = true
|
68
|
+
@have_devel = try_link(MAIN_DOES_NOTHING)
|
69
|
+
end
|
70
|
+
@have_devel
|
71
|
+
end
|
72
|
+
|
73
|
+
def conftest_source
|
74
|
+
CONFTEST_CXX
|
75
|
+
end
|
76
|
+
|
77
|
+
def cc_command(opt="")
|
78
|
+
conf = cc_config(opt)
|
79
|
+
RbConfig::expand("$(CXX) #$INCFLAGS #$CPPFLAGS #$CXXFLAGS #$ARCH_FLAG #{opt} -c #{CONFTEST_CXX}",
|
80
|
+
conf)
|
81
|
+
end
|
82
|
+
|
83
|
+
def link_command(ldflags, *opts)
|
84
|
+
conf = link_config(ldflags, *opts)
|
85
|
+
RbConfig::expand(TRY_LINK_CXX.dup, conf)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# The cpp_command is not overwritten in the experimental mkmf C++ support.
|
92
|
+
# See https://bugs.ruby-lang.org/issues/17578
|
93
|
+
MakeMakefile['C++'].module_eval do
|
94
|
+
def cpp_command(outfile, opt="")
|
95
|
+
conf = cc_config(opt)
|
96
|
+
if $universal and (arch_flag = conf['ARCH_FLAG']) and !arch_flag.empty?
|
97
|
+
conf['ARCH_FLAG'] = arch_flag.gsub(/(?:\G|\s)-arch\s+\S+/, '')
|
98
|
+
end
|
99
|
+
RbConfig::expand("$(CXX) -E #$INCFLAGS #$CPPFLAGS #$CFLAGS #{opt} #{CONFTEST_CXX} #{outfile}",
|
100
|
+
conf)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Now pull in the C++ support
|
105
|
+
include MakeMakefile['C++']
|
106
|
+
|
107
|
+
# Rice needs c++17.
|
108
|
+
if IS_MSWIN
|
109
|
+
$CXXFLAGS += " /std:c++17 /EHsc /permissive-"
|
110
|
+
$CPPFLAGS += " -D_ALLOW_KEYWORD_MACROS"
|
111
|
+
else
|
112
|
+
$CXXFLAGS += " -std=c++17"
|
113
|
+
end
|
114
|
+
|
115
|
+
# Rice needs to include its header. Let's setup the include path
|
116
|
+
# to make this easy
|
117
|
+
path = File.expand_path(File.join(__dir__, '../include'))
|
118
|
+
|
119
|
+
unless find_header('rice/rice.hpp', path)
|
120
|
+
raise("Could not find rice/rice.hpp header")
|
121
|
+
end
|
122
|
+
|
123
|
+
if IS_DARWIN
|
124
|
+
have_library('c++')
|
125
|
+
elsif !IS_MSWIN
|
126
|
+
have_library('stdc++')
|
127
|
+
end
|
data/lib/version.rb
ADDED
@@ -1,37 +1,80 @@
|
|
1
|
-
|
2
|
-
#include <algorithm>
|
3
|
-
|
4
|
-
inline Rice::Address_Registration_Guard::
|
5
|
-
Address_Registration_Guard(VALUE * address)
|
6
|
-
: address_(address)
|
1
|
+
namespace Rice
|
7
2
|
{
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
inline Address_Registration_Guard::Address_Registration_Guard(VALUE* address) : address_(address)
|
4
|
+
{
|
5
|
+
registerExitHandler();
|
6
|
+
registerAddress();
|
7
|
+
}
|
11
8
|
|
12
|
-
inline
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
}
|
9
|
+
inline Address_Registration_Guard::Address_Registration_Guard(Object* object)
|
10
|
+
: address_(const_cast<VALUE*>(&object->value()))
|
11
|
+
{
|
12
|
+
registerExitHandler();
|
13
|
+
registerAddress();
|
14
|
+
}
|
19
15
|
|
20
|
-
inline
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
rb_gc_unregister_address(address_);
|
25
|
-
}
|
16
|
+
inline Address_Registration_Guard::~Address_Registration_Guard()
|
17
|
+
{
|
18
|
+
unregisterAddress();
|
19
|
+
}
|
26
20
|
|
27
|
-
inline
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
inline Address_Registration_Guard::Address_Registration_Guard(Address_Registration_Guard&& other)
|
22
|
+
{
|
23
|
+
// We don't use the constructor because we don't want to double register this address
|
24
|
+
address_ = other.address_;
|
25
|
+
other.address_ = nullptr;
|
26
|
+
}
|
32
27
|
|
33
|
-
inline
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
inline Address_Registration_Guard& Address_Registration_Guard::operator=(Address_Registration_Guard&& other)
|
29
|
+
{
|
30
|
+
this->unregisterAddress();
|
31
|
+
|
32
|
+
this->address_ = other.address_;
|
33
|
+
other.address_ = nullptr;
|
34
|
+
return *this;
|
35
|
+
}
|
36
|
+
|
37
|
+
inline void Address_Registration_Guard::registerAddress() const
|
38
|
+
{
|
39
|
+
if (enabled)
|
40
|
+
{
|
41
|
+
detail::protect(rb_gc_register_address, address_);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
inline void Address_Registration_Guard::unregisterAddress()
|
46
|
+
{
|
47
|
+
if (enabled && address_)
|
48
|
+
{
|
49
|
+
detail::protect(rb_gc_unregister_address, address_);
|
50
|
+
}
|
51
|
+
|
52
|
+
address_ = nullptr;
|
53
|
+
}
|
54
|
+
|
55
|
+
inline VALUE* Address_Registration_Guard::address() const
|
56
|
+
{
|
57
|
+
return address_;
|
58
|
+
}
|
59
|
+
|
60
|
+
static void disable_all_guards(VALUE)
|
61
|
+
{
|
62
|
+
Address_Registration_Guard::disable();
|
63
|
+
}
|
64
|
+
|
65
|
+
inline void Address_Registration_Guard::registerExitHandler()
|
66
|
+
{
|
67
|
+
if (exit_handler_registered)
|
68
|
+
{
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
|
72
|
+
detail::protect(rb_set_end_proc, &disable_all_guards, Qnil);
|
73
|
+
exit_handler_registered = true;
|
74
|
+
}
|
75
|
+
|
76
|
+
inline void Address_Registration_Guard::disable()
|
77
|
+
{
|
78
|
+
enabled = false;
|
79
|
+
}
|
80
|
+
} // Rice
|
@@ -1,75 +1,79 @@
|
|
1
1
|
#ifndef Rice__Address_Registration_Guard_defn__hpp_
|
2
2
|
#define Rice__Address_Registration_Guard_defn__hpp_
|
3
3
|
|
4
|
-
#include "Object_defn.hpp"
|
4
|
+
#include "cpp_api/Object_defn.hpp"
|
5
5
|
#include "detail/ruby.hpp"
|
6
|
-
#include "detail/Not_Copyable.hpp"
|
7
6
|
|
8
7
|
namespace Rice
|
9
8
|
{
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
* \endcode
|
28
|
-
*/
|
29
|
-
class Address_Registration_Guard
|
30
|
-
: private detail::Not_Copyable
|
31
|
-
{
|
32
|
-
public:
|
33
|
-
//! Register an address with the GC.
|
34
|
-
/* \param address The address to register with the GC. The address
|
35
|
-
* must point to a valid ruby object (RObject).
|
9
|
+
//! A guard to register a given address with the GC.
|
10
|
+
/*! Calls rb_gc_register_address upon construction and
|
11
|
+
* rb_gc_unregister_address upon destruction.
|
12
|
+
* For example:
|
13
|
+
* \code
|
14
|
+
* Class Foo
|
15
|
+
* {
|
16
|
+
* public:
|
17
|
+
* Foo()
|
18
|
+
* : string_(rb_str_new2())
|
19
|
+
* , guard_(&string_);
|
20
|
+
*
|
21
|
+
* private:
|
22
|
+
* VALUE string_;
|
23
|
+
* Address_Registration_Guard guard_;
|
24
|
+
* };
|
25
|
+
* \endcode
|
36
26
|
*/
|
37
|
-
Address_Registration_Guard
|
27
|
+
class Address_Registration_Guard
|
28
|
+
{
|
29
|
+
public:
|
30
|
+
//! Register an address with the GC.
|
31
|
+
/* \param address The address to register with the GC. The address
|
32
|
+
* must point to a valid ruby object (RObject).
|
33
|
+
*/
|
34
|
+
Address_Registration_Guard(VALUE* address);
|
38
35
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
//! Register an Object with the GC.
|
37
|
+
/*! \param object The Object to register with the GC. The object must
|
38
|
+
* not be destroyed before the Address_Registration_Guard is
|
39
|
+
* destroyed.
|
40
|
+
*/
|
41
|
+
Address_Registration_Guard(Object* object);
|
45
42
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
43
|
+
//! Unregister an address/Object with the GC.
|
44
|
+
/*! Destruct an Address_Registration_Guard. The address registered
|
45
|
+
* with the Address_Registration_Guard when it was constructed will
|
46
|
+
* be unregistered from the GC.
|
47
|
+
*/
|
48
|
+
~Address_Registration_Guard();
|
52
49
|
|
53
|
-
|
54
|
-
|
50
|
+
// Disable copying
|
51
|
+
Address_Registration_Guard(Address_Registration_Guard const& other) = delete;
|
52
|
+
Address_Registration_Guard& operator=(Address_Registration_Guard const& other) = delete;
|
55
53
|
|
56
|
-
|
57
|
-
|
54
|
+
// Enable moving
|
55
|
+
Address_Registration_Guard(Address_Registration_Guard&& other);
|
56
|
+
Address_Registration_Guard& operator=(Address_Registration_Guard&& other);
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
*/
|
62
|
-
static void disable();
|
58
|
+
//! Get the address that is registered with the GC.
|
59
|
+
VALUE* address() const;
|
63
60
|
|
64
|
-
|
65
|
-
|
66
|
-
|
61
|
+
/** Called during Ruby's exit process since we should not call
|
62
|
+
* rb_gc unregister_address there
|
63
|
+
*/
|
64
|
+
static void disable();
|
67
65
|
|
68
|
-
|
66
|
+
private:
|
67
|
+
inline static bool enabled = true;
|
68
|
+
inline static bool exit_handler_registered = false;
|
69
|
+
static void registerExitHandler();
|
69
70
|
|
70
|
-
|
71
|
-
|
71
|
+
private:
|
72
|
+
void registerAddress() const;
|
73
|
+
void unregisterAddress();
|
72
74
|
|
75
|
+
VALUE* address_ = nullptr;
|
76
|
+
};
|
73
77
|
} // namespace Rice
|
74
78
|
|
75
|
-
#endif // Rice__Address_Registration_Guard_defn__hpp_
|
79
|
+
#endif // Rice__Address_Registration_Guard_defn__hpp_
|
data/rice/Arg.hpp
CHANGED
@@ -1,8 +1,84 @@
|
|
1
1
|
#ifndef Rice__Arg__hpp_
|
2
2
|
#define Rice__Arg__hpp_
|
3
3
|
|
4
|
-
#include
|
5
|
-
#include "detail/Arguments.hpp"
|
6
|
-
#include "Arg_operators.hpp"
|
4
|
+
#include <any>
|
7
5
|
|
8
|
-
|
6
|
+
namespace Rice
|
7
|
+
{
|
8
|
+
//! Helper for defining default arguments of a method
|
9
|
+
/*! This class exposes the ability to define the default values of a
|
10
|
+
* wrapped method. Inspired by how Boost.Python handles keyword and
|
11
|
+
* default arguments, the syntax is simple:
|
12
|
+
*
|
13
|
+
* \code
|
14
|
+
* define_method(
|
15
|
+
* "method",
|
16
|
+
* &method,
|
17
|
+
* Arg("arg1"), Arg("arg2") = 3, Arg("arg3") = true
|
18
|
+
* );
|
19
|
+
* \endcode
|
20
|
+
*
|
21
|
+
* which means "for method &method, it takes 3 arguments
|
22
|
+
* [arg1, arg2, arg3]. Of these arguments, arg2's default is 3
|
23
|
+
* and arg3's default is true.
|
24
|
+
*
|
25
|
+
* It may be required to explicitly cast the type of the default
|
26
|
+
* value to prevent compilation errors.
|
27
|
+
*/
|
28
|
+
class Arg
|
29
|
+
{
|
30
|
+
public:
|
31
|
+
//! Initialize a new Arg with the name of the argument
|
32
|
+
/*! We require the name of the argument because 1) it makes code
|
33
|
+
* easier to read and 2) hopefully Ruby gets keyword arguments
|
34
|
+
* in the future and this means Rice will be ready for it.
|
35
|
+
*/
|
36
|
+
Arg(std::string name);
|
37
|
+
|
38
|
+
//! Set the default value for this Arg
|
39
|
+
/*! Set the default value for this argument.
|
40
|
+
* If this isn't called on this Arg, then this
|
41
|
+
* Arg is required in the method call.
|
42
|
+
*
|
43
|
+
* \param val the value to store as default
|
44
|
+
*/
|
45
|
+
template<typename Arg_Type>
|
46
|
+
Arg& operator=(Arg_Type val);
|
47
|
+
|
48
|
+
//! Check if this Arg has a default value associated with it
|
49
|
+
bool hasDefaultValue() const;
|
50
|
+
|
51
|
+
//! Return a reference to the default value associated with this Arg
|
52
|
+
/*! \return the type saved to this Arg
|
53
|
+
*/
|
54
|
+
template<typename Arg_Type>
|
55
|
+
Arg_Type& defaultValue();
|
56
|
+
|
57
|
+
//! Tell the receiving object to keep this argument alive
|
58
|
+
//! until the receiving object is freed.
|
59
|
+
Arg& keepAlive();
|
60
|
+
|
61
|
+
//! Specifies if the argument should be treated as a value
|
62
|
+
Arg& isValue();
|
63
|
+
|
64
|
+
//! Returns if the argument should be treated as a value
|
65
|
+
bool getIsValue();
|
66
|
+
|
67
|
+
// No longer supported - implemented to raise error
|
68
|
+
Arg operator,(const Arg& other);
|
69
|
+
|
70
|
+
public:
|
71
|
+
bool isKeepAlive = false;
|
72
|
+
const std::string name;
|
73
|
+
int32_t position = -1;
|
74
|
+
|
75
|
+
private:
|
76
|
+
//! Our saved default value
|
77
|
+
std::any defaultValue_;
|
78
|
+
bool isValue_ = false;
|
79
|
+
};
|
80
|
+
} // Rice
|
81
|
+
|
82
|
+
#include "Arg.ipp"
|
83
|
+
|
84
|
+
#endif // Rice__Arg__hpp_
|