rice 2.1.1 → 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.
Files changed (246) 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 +69 -0
  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 -274
  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 +117 -137
  128. data/Doxyfile +0 -2280
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README +0 -1055
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -142
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7481
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -124
  173. data/rice/Makefile.in +0 -839
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -625
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -503
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -486
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1150
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -480
  246. 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.0"
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_