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.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/lib/mkmf-rice.rb +127 -0
  9. data/lib/version.rb +3 -0
  10. data/rice/Address_Registration_Guard.ipp +75 -32
  11. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  12. data/rice/Arg.hpp +80 -4
  13. data/rice/Arg.ipp +51 -0
  14. data/rice/Constructor.hpp +12 -14
  15. data/rice/Data_Object.ipp +234 -107
  16. data/rice/Data_Object_defn.hpp +77 -117
  17. data/rice/Data_Type.hpp +1 -2
  18. data/rice/Data_Type.ipp +251 -295
  19. data/rice/Data_Type_defn.hpp +175 -243
  20. data/rice/Director.hpp +11 -6
  21. data/rice/Enum.hpp +54 -104
  22. data/rice/Enum.ipp +104 -230
  23. data/rice/Exception.hpp +2 -8
  24. data/rice/Exception.ipp +65 -0
  25. data/rice/Exception_defn.hpp +46 -47
  26. data/rice/Identifier.hpp +28 -28
  27. data/rice/Identifier.ipp +23 -27
  28. data/rice/Return.hpp +39 -0
  29. data/rice/Return.ipp +33 -0
  30. data/rice/detail/Exception_Handler.ipp +22 -62
  31. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  32. data/rice/detail/Iterator.hpp +18 -88
  33. data/rice/detail/Iterator.ipp +47 -0
  34. data/rice/detail/Jump_Tag.hpp +21 -0
  35. data/rice/detail/MethodInfo.hpp +44 -0
  36. data/rice/detail/MethodInfo.ipp +78 -0
  37. data/rice/detail/NativeAttribute.hpp +53 -0
  38. data/rice/detail/NativeAttribute.ipp +83 -0
  39. data/rice/detail/NativeFunction.hpp +69 -0
  40. data/rice/detail/NativeFunction.ipp +248 -0
  41. data/rice/detail/RubyFunction.hpp +39 -0
  42. data/rice/detail/RubyFunction.ipp +92 -0
  43. data/rice/detail/Type.hpp +29 -0
  44. data/rice/detail/Type.ipp +138 -0
  45. data/rice/detail/TypeRegistry.hpp +50 -0
  46. data/rice/detail/TypeRegistry.ipp +106 -0
  47. data/rice/detail/Wrapper.hpp +51 -0
  48. data/rice/detail/Wrapper.ipp +151 -0
  49. data/rice/detail/default_allocation_func.hpp +8 -19
  50. data/rice/detail/default_allocation_func.ipp +9 -8
  51. data/rice/detail/from_ruby.hpp +2 -37
  52. data/rice/detail/from_ruby.ipp +1020 -46
  53. data/rice/detail/from_ruby_defn.hpp +38 -0
  54. data/rice/detail/function_traits.hpp +124 -0
  55. data/rice/detail/method_data.hpp +23 -15
  56. data/rice/detail/method_data.ipp +53 -0
  57. data/rice/detail/rice_traits.hpp +116 -0
  58. data/rice/detail/ruby.hpp +9 -46
  59. data/rice/detail/to_ruby.hpp +3 -17
  60. data/rice/detail/to_ruby.ipp +409 -31
  61. data/rice/detail/to_ruby_defn.hpp +48 -0
  62. data/rice/forward_declares.ipp +82 -0
  63. data/rice/global_function.hpp +16 -20
  64. data/rice/global_function.ipp +8 -17
  65. data/rice/rice.hpp +59 -0
  66. data/rice/ruby_mark.hpp +5 -3
  67. data/rice/ruby_try_catch.hpp +4 -4
  68. data/rice/stl.hpp +11 -0
  69. data/sample/callbacks/extconf.rb +3 -0
  70. data/sample/callbacks/sample_callbacks.cpp +10 -13
  71. data/sample/enum/extconf.rb +3 -0
  72. data/sample/enum/sample_enum.cpp +3 -17
  73. data/sample/enum/test.rb +2 -2
  74. data/sample/inheritance/animals.cpp +8 -24
  75. data/sample/inheritance/extconf.rb +3 -0
  76. data/sample/inheritance/test.rb +1 -1
  77. data/sample/map/extconf.rb +3 -0
  78. data/sample/map/map.cpp +10 -18
  79. data/sample/map/test.rb +1 -1
  80. data/test/embed_ruby.cpp +18 -5
  81. data/test/ext/t1/extconf.rb +3 -0
  82. data/test/ext/t1/t1.cpp +1 -3
  83. data/test/ext/t2/extconf.rb +3 -0
  84. data/test/ext/t2/t2.cpp +1 -1
  85. data/test/extconf.rb +23 -0
  86. data/test/ruby/test_callbacks_sample.rb +28 -0
  87. data/test/ruby/test_multiple_extensions.rb +18 -0
  88. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  89. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  90. data/test/test_Address_Registration_Guard.cpp +23 -10
  91. data/test/test_Array.cpp +129 -73
  92. data/test/test_Attribute.cpp +147 -0
  93. data/test/test_Builtin_Object.cpp +34 -14
  94. data/test/test_Class.cpp +149 -275
  95. data/test/test_Constructor.cpp +10 -9
  96. data/test/test_Data_Object.cpp +133 -192
  97. data/test/test_Data_Type.cpp +322 -252
  98. data/test/test_Director.cpp +54 -41
  99. data/test/test_Enum.cpp +228 -103
  100. data/test/test_Exception.cpp +5 -6
  101. data/test/test_Hash.cpp +31 -30
  102. data/test/test_Identifier.cpp +4 -5
  103. data/test/test_Inheritance.cpp +221 -0
  104. data/test/test_Iterator.cpp +161 -0
  105. data/test/test_Jump_Tag.cpp +1 -1
  106. data/test/test_Keep_Alive.cpp +161 -0
  107. data/test/test_Memory_Management.cpp +2 -4
  108. data/test/test_Module.cpp +167 -110
  109. data/test/test_Object.cpp +41 -21
  110. data/test/test_Ownership.cpp +275 -0
  111. data/test/test_Self.cpp +205 -0
  112. data/test/test_Stl_Optional.cpp +90 -0
  113. data/test/test_Stl_Pair.cpp +144 -0
  114. data/test/test_Stl_SmartPointer.cpp +200 -0
  115. data/test/test_Stl_String.cpp +74 -0
  116. data/test/test_Stl_Vector.cpp +652 -0
  117. data/test/test_String.cpp +1 -2
  118. data/test/test_Struct.cpp +29 -39
  119. data/test/test_Symbol.cpp +1 -2
  120. data/test/test_To_From_Ruby.cpp +249 -285
  121. data/test/test_global_functions.cpp +39 -19
  122. data/test/unittest.hpp +0 -4
  123. metadata +63 -139
  124. data/Doxyfile +0 -2268
  125. data/Makefile.am +0 -26
  126. data/Makefile.in +0 -931
  127. data/README.mingw +0 -8
  128. data/aclocal.m4 +0 -1085
  129. data/ax_cxx_compile_stdcxx.m4 +0 -951
  130. data/bootstrap +0 -8
  131. data/config.guess +0 -1421
  132. data/config.sub +0 -1807
  133. data/configure +0 -7792
  134. data/configure.ac +0 -55
  135. data/depcomp +0 -791
  136. data/doxygen.ac +0 -314
  137. data/doxygen.am +0 -186
  138. data/extconf.rb +0 -70
  139. data/install-sh +0 -501
  140. data/missing +0 -215
  141. data/post-autoconf.rb +0 -22
  142. data/post-automake.rb +0 -28
  143. data/rice/Address_Registration_Guard.cpp +0 -22
  144. data/rice/Arg_impl.hpp +0 -129
  145. data/rice/Arg_operators.cpp +0 -21
  146. data/rice/Arg_operators.hpp +0 -19
  147. data/rice/Array.hpp +0 -214
  148. data/rice/Array.ipp +0 -256
  149. data/rice/Builtin_Object.hpp +0 -8
  150. data/rice/Builtin_Object.ipp +0 -50
  151. data/rice/Builtin_Object_defn.hpp +0 -50
  152. data/rice/Class.cpp +0 -57
  153. data/rice/Class.hpp +0 -8
  154. data/rice/Class.ipp +0 -6
  155. data/rice/Class_defn.hpp +0 -84
  156. data/rice/Data_Type.cpp +0 -54
  157. data/rice/Data_Type_fwd.hpp +0 -12
  158. data/rice/Director.cpp +0 -13
  159. data/rice/Exception.cpp +0 -54
  160. data/rice/Exception_Base.hpp +0 -8
  161. data/rice/Exception_Base.ipp +0 -13
  162. data/rice/Exception_Base_defn.hpp +0 -27
  163. data/rice/Hash.hpp +0 -230
  164. data/rice/Hash.ipp +0 -329
  165. data/rice/Identifier.cpp +0 -8
  166. data/rice/Jump_Tag.hpp +0 -24
  167. data/rice/Makefile.am +0 -121
  168. data/rice/Makefile.in +0 -884
  169. data/rice/Module.cpp +0 -84
  170. data/rice/Module.hpp +0 -8
  171. data/rice/Module.ipp +0 -6
  172. data/rice/Module_defn.hpp +0 -88
  173. data/rice/Module_impl.hpp +0 -281
  174. data/rice/Module_impl.ipp +0 -345
  175. data/rice/Object.cpp +0 -169
  176. data/rice/Object.hpp +0 -8
  177. data/rice/Object.ipp +0 -33
  178. data/rice/Object_defn.hpp +0 -214
  179. data/rice/Require_Guard.hpp +0 -21
  180. data/rice/String.cpp +0 -89
  181. data/rice/String.hpp +0 -91
  182. data/rice/Struct.cpp +0 -117
  183. data/rice/Struct.hpp +0 -162
  184. data/rice/Struct.ipp +0 -26
  185. data/rice/Symbol.cpp +0 -25
  186. data/rice/Symbol.hpp +0 -66
  187. data/rice/Symbol.ipp +0 -44
  188. data/rice/config.hpp +0 -47
  189. data/rice/config.hpp.in +0 -46
  190. data/rice/detail/Arguments.hpp +0 -118
  191. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  192. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  193. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  194. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  195. data/rice/detail/Caster.hpp +0 -103
  196. data/rice/detail/Not_Copyable.hpp +0 -25
  197. data/rice/detail/Wrapped_Function.hpp +0 -33
  198. data/rice/detail/cfp.hpp +0 -24
  199. data/rice/detail/cfp.ipp +0 -51
  200. data/rice/detail/check_ruby_type.cpp +0 -27
  201. data/rice/detail/check_ruby_type.hpp +0 -23
  202. data/rice/detail/creation_funcs.hpp +0 -37
  203. data/rice/detail/creation_funcs.ipp +0 -36
  204. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  205. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  206. data/rice/detail/demangle.cpp +0 -56
  207. data/rice/detail/demangle.hpp +0 -19
  208. data/rice/detail/env.hpp +0 -11
  209. data/rice/detail/method_data.cpp +0 -92
  210. data/rice/detail/node.hpp +0 -13
  211. data/rice/detail/protect.cpp +0 -29
  212. data/rice/detail/protect.hpp +0 -34
  213. data/rice/detail/ruby_version_code.hpp +0 -6
  214. data/rice/detail/ruby_version_code.hpp.in +0 -6
  215. data/rice/detail/st.hpp +0 -22
  216. data/rice/detail/win32.hpp +0 -16
  217. data/rice/detail/wrap_function.hpp +0 -66
  218. data/rice/protect.hpp +0 -38
  219. data/rice/protect.ipp +0 -1134
  220. data/rice/rubypp.rb +0 -97
  221. data/rice/to_from_ruby.hpp +0 -8
  222. data/rice/to_from_ruby.ipp +0 -418
  223. data/rice/to_from_ruby_defn.hpp +0 -70
  224. data/ruby.ac +0 -135
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/sample/Makefile.am +0 -53
  232. data/sample/Makefile.in +0 -495
  233. data/test/Makefile.am +0 -73
  234. data/test/Makefile.in +0 -1219
  235. data/test/ext/Makefile.am +0 -41
  236. data/test/ext/Makefile.in +0 -483
  237. 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
@@ -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_