rice 2.1.2 → 4.0.1

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.
Files changed (245) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +45 -1028
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +30 -376
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +14 -9
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -49
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -276
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +120 -136
  128. data/Doxyfile +0 -2268
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README.mingw +0 -8
  132. data/aclocal.m4 +0 -1088
  133. data/bootstrap +0 -8
  134. data/check_stdcxx_11.ac +0 -142
  135. data/config.guess +0 -1421
  136. data/config.sub +0 -1807
  137. data/configure +0 -7481
  138. data/configure.ac +0 -55
  139. data/depcomp +0 -791
  140. data/doxygen.ac +0 -314
  141. data/doxygen.am +0 -186
  142. data/extconf.rb +0 -69
  143. data/install-sh +0 -501
  144. data/missing +0 -215
  145. data/post-autoconf.rb +0 -22
  146. data/post-automake.rb +0 -28
  147. data/rice/Address_Registration_Guard.cpp +0 -22
  148. data/rice/Arg_impl.hpp +0 -129
  149. data/rice/Arg_operators.cpp +0 -21
  150. data/rice/Arg_operators.hpp +0 -19
  151. data/rice/Array.hpp +0 -214
  152. data/rice/Array.ipp +0 -256
  153. data/rice/Builtin_Object.hpp +0 -8
  154. data/rice/Builtin_Object.ipp +0 -50
  155. data/rice/Builtin_Object_defn.hpp +0 -50
  156. data/rice/Class.cpp +0 -57
  157. data/rice/Class.hpp +0 -8
  158. data/rice/Class.ipp +0 -6
  159. data/rice/Class_defn.hpp +0 -83
  160. data/rice/Data_Type.cpp +0 -54
  161. data/rice/Data_Type_fwd.hpp +0 -12
  162. data/rice/Director.cpp +0 -13
  163. data/rice/Exception.cpp +0 -59
  164. data/rice/Exception_Base.hpp +0 -8
  165. data/rice/Exception_Base.ipp +0 -13
  166. data/rice/Exception_Base_defn.hpp +0 -27
  167. data/rice/Hash.hpp +0 -227
  168. data/rice/Hash.ipp +0 -329
  169. data/rice/Identifier.cpp +0 -8
  170. data/rice/Jump_Tag.hpp +0 -24
  171. data/rice/Makefile.am +0 -124
  172. data/rice/Makefile.in +0 -839
  173. data/rice/Module.cpp +0 -84
  174. data/rice/Module.hpp +0 -8
  175. data/rice/Module.ipp +0 -6
  176. data/rice/Module_defn.hpp +0 -88
  177. data/rice/Module_impl.hpp +0 -281
  178. data/rice/Module_impl.ipp +0 -345
  179. data/rice/Object.cpp +0 -169
  180. data/rice/Object.hpp +0 -8
  181. data/rice/Object.ipp +0 -19
  182. data/rice/Object_defn.hpp +0 -191
  183. data/rice/Require_Guard.hpp +0 -21
  184. data/rice/String.cpp +0 -94
  185. data/rice/String.hpp +0 -91
  186. data/rice/Struct.cpp +0 -117
  187. data/rice/Struct.hpp +0 -162
  188. data/rice/Struct.ipp +0 -26
  189. data/rice/Symbol.cpp +0 -25
  190. data/rice/Symbol.hpp +0 -66
  191. data/rice/Symbol.ipp +0 -44
  192. data/rice/config.hpp +0 -47
  193. data/rice/config.hpp.in +0 -46
  194. data/rice/detail/Arguments.hpp +0 -118
  195. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  196. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  197. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  198. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  199. data/rice/detail/Caster.hpp +0 -103
  200. data/rice/detail/Not_Copyable.hpp +0 -25
  201. data/rice/detail/Wrapped_Function.hpp +0 -33
  202. data/rice/detail/cfp.hpp +0 -24
  203. data/rice/detail/cfp.ipp +0 -51
  204. data/rice/detail/check_ruby_type.cpp +0 -27
  205. data/rice/detail/check_ruby_type.hpp +0 -23
  206. data/rice/detail/creation_funcs.hpp +0 -37
  207. data/rice/detail/creation_funcs.ipp +0 -36
  208. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  209. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  210. data/rice/detail/demangle.cpp +0 -56
  211. data/rice/detail/demangle.hpp +0 -19
  212. data/rice/detail/env.hpp +0 -11
  213. data/rice/detail/method_data.cpp +0 -86
  214. data/rice/detail/node.hpp +0 -13
  215. data/rice/detail/object_call.hpp +0 -69
  216. data/rice/detail/object_call.ipp +0 -131
  217. data/rice/detail/protect.cpp +0 -29
  218. data/rice/detail/protect.hpp +0 -34
  219. data/rice/detail/ruby_version_code.hpp +0 -6
  220. data/rice/detail/ruby_version_code.hpp.in +0 -6
  221. data/rice/detail/st.hpp +0 -22
  222. data/rice/detail/traits.hpp +0 -43
  223. data/rice/detail/win32.hpp +0 -16
  224. data/rice/detail/wrap_function.hpp +0 -341
  225. data/rice/detail/wrap_function.ipp +0 -514
  226. data/rice/protect.hpp +0 -92
  227. data/rice/protect.ipp +0 -1134
  228. data/rice/rubypp.rb +0 -97
  229. data/rice/to_from_ruby.hpp +0 -8
  230. data/rice/to_from_ruby.ipp +0 -294
  231. data/rice/to_from_ruby_defn.hpp +0 -70
  232. data/ruby.ac +0 -135
  233. data/ruby/Makefile.am +0 -1
  234. data/ruby/Makefile.in +0 -625
  235. data/ruby/lib/Makefile.am +0 -3
  236. data/ruby/lib/Makefile.in +0 -503
  237. data/ruby/lib/mkmf-rice.rb.in +0 -217
  238. data/ruby/lib/version.rb +0 -3
  239. data/sample/Makefile.am +0 -47
  240. data/sample/Makefile.in +0 -486
  241. data/test/Makefile.am +0 -72
  242. data/test/Makefile.in +0 -1150
  243. data/test/ext/Makefile.am +0 -41
  244. data/test/ext/Makefile.in +0 -480
  245. 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
@@ -0,0 +1,3 @@
1
+ module Rice
2
+ VERSION = "4.0.1"
3
+ end
@@ -1,37 +1,80 @@
1
- #include "Object.hpp"
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
- registerExitHandler();
9
- rb_gc_register_address(address);
10
- }
3
+ inline Address_Registration_Guard::Address_Registration_Guard(VALUE* address) : address_(address)
4
+ {
5
+ registerExitHandler();
6
+ registerAddress();
7
+ }
11
8
 
12
- inline Rice::Address_Registration_Guard::
13
- Address_Registration_Guard(Object * object)
14
- : address_(const_cast<VALUE *>(&object->value()))
15
- {
16
- registerExitHandler();
17
- rb_gc_register_address(address_);
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 Rice::Address_Registration_Guard::
21
- ~Address_Registration_Guard()
22
- {
23
- if (enabled)
24
- rb_gc_unregister_address(address_);
25
- }
16
+ inline Address_Registration_Guard::~Address_Registration_Guard()
17
+ {
18
+ unregisterAddress();
19
+ }
26
20
 
27
- inline VALUE * Rice::Address_Registration_Guard::
28
- address() const
29
- {
30
- return address_;
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 void Rice::Address_Registration_Guard::
34
- swap(Rice::Address_Registration_Guard & other)
35
- {
36
- std::swap(address_, other.address_);
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
- //! A guard to register a given address with the GC.
12
- /*! Calls rb_gc_register_address upon construction and
13
- * rb_gc_unregister_address upon destruction.
14
- * For example:
15
- * \code
16
- * Class Foo
17
- * {
18
- * public:
19
- * Foo()
20
- * : string_(rb_str_new2())
21
- * , guard_(&string_);
22
- *
23
- * private:
24
- * VALUE string_;
25
- * Address_Registration_Guard guard_;
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(VALUE * address);
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
- //! Register an Object with the GC.
40
- /*! \param object The Object to register with the GC. The object must
41
- * not be destroyed before the Address_Registration_Guard is
42
- * destroyed.
43
- */
44
- Address_Registration_Guard(Object * object);
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
- //! Unregister an address/Object with the GC.
47
- /*! Destruct an Address_Registration_Guard. The address registered
48
- * with the Address_Registration_Guard when it was constructed will
49
- * be unregistered from the GC.
50
- */
51
- ~Address_Registration_Guard();
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
- //! Get the address that is registered with the GC.
54
- VALUE * address() const;
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
- //! Swap with another Address_Registration_Guard.
57
- void swap(Address_Registration_Guard & other);
54
+ // Enable moving
55
+ Address_Registration_Guard(Address_Registration_Guard&& other);
56
+ Address_Registration_Guard& operator=(Address_Registration_Guard&& other);
58
57
 
59
- /** Called during Ruby's exit process since we should not call
60
- * rb_gc unregister_address there
61
- */
62
- static void disable();
58
+ //! Get the address that is registered with the GC.
59
+ VALUE* address() const;
63
60
 
64
- private:
65
- static bool enabled;
66
- static bool exit_handler_registered;
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
- static void registerExitHandler();
66
+ private:
67
+ inline static bool enabled = true;
68
+ inline static bool exit_handler_registered = false;
69
+ static void registerExitHandler();
69
70
 
70
- VALUE * address_;
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 "Arg_impl.hpp"
5
- #include "detail/Arguments.hpp"
6
- #include "Arg_operators.hpp"
4
+ #include <any>
7
5
 
8
- #endif // Rice__Arg__hpp_
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_