rice 2.1.3 → 4.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +121 -0
- data/CONTRIBUTORS.md +19 -0
- data/COPYING +2 -2
- data/Gemfile +3 -0
- data/README.md +45 -1028
- 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 +30 -376
- 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 +14 -9
- 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 -50
- 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 +6 -0
- data/sample/callbacks/sample_callbacks.cpp +35 -0
- data/sample/callbacks/test.rb +28 -0
- 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 +34 -0
- data/test/embed_ruby.hpp +4 -0
- 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 +25 -11
- data/test/test_Array.cpp +131 -74
- data/test/test_Attribute.cpp +147 -0
- data/test/test_Builtin_Object.cpp +36 -15
- data/test/test_Class.cpp +151 -276
- data/test/test_Constructor.cpp +10 -9
- data/test/test_Data_Object.cpp +135 -193
- data/test/test_Data_Type.cpp +323 -252
- data/test/test_Director.cpp +56 -42
- data/test/test_Enum.cpp +230 -104
- data/test/test_Exception.cpp +7 -7
- data/test/test_Hash.cpp +33 -31
- data/test/test_Identifier.cpp +6 -6
- 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 +4 -5
- data/test/test_Module.cpp +169 -111
- data/test/test_Object.cpp +51 -19
- 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 +3 -3
- data/test/test_Struct.cpp +31 -40
- data/test/test_Symbol.cpp +3 -3
- data/test/test_To_From_Ruby.cpp +283 -218
- data/test/test_global_functions.cpp +41 -20
- data/test/unittest.cpp +34 -8
- data/test/unittest.hpp +0 -4
- metadata +121 -136
- data/Doxyfile +0 -2268
- data/Makefile.am +0 -26
- data/Makefile.in +0 -923
- data/README.mingw +0 -8
- data/aclocal.m4 +0 -1088
- data/bootstrap +0 -8
- data/check_stdcxx_11.ac +0 -103
- data/config.guess +0 -1421
- data/config.sub +0 -1807
- data/configure +0 -7367
- data/configure.ac +0 -55
- data/depcomp +0 -791
- data/doxygen.ac +0 -314
- data/doxygen.am +0 -186
- data/extconf.rb +0 -69
- 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 -83
- 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 -59
- 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 -227
- data/rice/Hash.ipp +0 -329
- data/rice/Identifier.cpp +0 -8
- data/rice/Jump_Tag.hpp +0 -24
- data/rice/Makefile.am +0 -125
- data/rice/Makefile.in +0 -888
- 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 -19
- data/rice/Object_defn.hpp +0 -191
- data/rice/Require_Guard.hpp +0 -21
- data/rice/String.cpp +0 -94
- 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 -3694
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
- 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 -86
- data/rice/detail/node.hpp +0 -13
- data/rice/detail/object_call.hpp +0 -69
- data/rice/detail/object_call.ipp +0 -131
- 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/traits.hpp +0 -43
- data/rice/detail/win32.hpp +0 -16
- data/rice/detail/wrap_function.hpp +0 -341
- data/rice/detail/wrap_function.ipp +0 -514
- data/rice/protect.hpp +0 -92
- 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 -294
- 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 -47
- data/sample/Makefile.in +0 -489
- data/test/Makefile.am +0 -72
- data/test/Makefile.in +0 -1213
- data/test/ext/Makefile.am +0 -41
- data/test/ext/Makefile.in +0 -483
- data/test/test_rice.rb +0 -41
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_
|