rice2 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +23 -0
  3. data/Doxyfile +2268 -0
  4. data/Makefile.am +26 -0
  5. data/Makefile.in +929 -0
  6. data/README.md +1054 -0
  7. data/README.mingw +8 -0
  8. data/Rakefile +24 -0
  9. data/aclocal.m4 +1090 -0
  10. data/bootstrap +8 -0
  11. data/config.guess +1667 -0
  12. data/config.sub +1793 -0
  13. data/configure +8209 -0
  14. data/configure.ac +55 -0
  15. data/depcomp +791 -0
  16. data/doxygen.ac +314 -0
  17. data/doxygen.am +186 -0
  18. data/extconf.rb +66 -0
  19. data/install-sh +529 -0
  20. data/missing +215 -0
  21. data/post-autoconf.rb +22 -0
  22. data/post-automake.rb +28 -0
  23. data/rice/Address_Registration_Guard.cpp +22 -0
  24. data/rice/Address_Registration_Guard.hpp +7 -0
  25. data/rice/Address_Registration_Guard.ipp +37 -0
  26. data/rice/Address_Registration_Guard_defn.hpp +75 -0
  27. data/rice/Arg.hpp +8 -0
  28. data/rice/Arg_impl.hpp +129 -0
  29. data/rice/Arg_operators.cpp +21 -0
  30. data/rice/Arg_operators.hpp +19 -0
  31. data/rice/Array.hpp +214 -0
  32. data/rice/Array.ipp +256 -0
  33. data/rice/Builtin_Object.hpp +8 -0
  34. data/rice/Builtin_Object.ipp +50 -0
  35. data/rice/Builtin_Object_defn.hpp +50 -0
  36. data/rice/Class.cpp +57 -0
  37. data/rice/Class.hpp +8 -0
  38. data/rice/Class.ipp +6 -0
  39. data/rice/Class_defn.hpp +83 -0
  40. data/rice/Constructor.hpp +47 -0
  41. data/rice/Data_Object.hpp +8 -0
  42. data/rice/Data_Object.ipp +133 -0
  43. data/rice/Data_Object_defn.hpp +138 -0
  44. data/rice/Data_Type.cpp +54 -0
  45. data/rice/Data_Type.hpp +8 -0
  46. data/rice/Data_Type.ipp +365 -0
  47. data/rice/Data_Type_defn.hpp +261 -0
  48. data/rice/Data_Type_fwd.hpp +12 -0
  49. data/rice/Director.cpp +13 -0
  50. data/rice/Director.hpp +39 -0
  51. data/rice/Enum.hpp +117 -0
  52. data/rice/Enum.ipp +246 -0
  53. data/rice/Exception.cpp +59 -0
  54. data/rice/Exception.hpp +13 -0
  55. data/rice/Exception_Base.hpp +8 -0
  56. data/rice/Exception_Base.ipp +13 -0
  57. data/rice/Exception_Base_defn.hpp +27 -0
  58. data/rice/Exception_defn.hpp +69 -0
  59. data/rice/Hash.hpp +227 -0
  60. data/rice/Hash.ipp +329 -0
  61. data/rice/Identifier.cpp +8 -0
  62. data/rice/Identifier.hpp +50 -0
  63. data/rice/Identifier.ipp +33 -0
  64. data/rice/Jump_Tag.hpp +24 -0
  65. data/rice/Makefile.am +122 -0
  66. data/rice/Makefile.in +885 -0
  67. data/rice/Module.cpp +84 -0
  68. data/rice/Module.hpp +8 -0
  69. data/rice/Module.ipp +6 -0
  70. data/rice/Module_defn.hpp +88 -0
  71. data/rice/Module_impl.hpp +281 -0
  72. data/rice/Module_impl.ipp +345 -0
  73. data/rice/Object.cpp +169 -0
  74. data/rice/Object.hpp +8 -0
  75. data/rice/Object.ipp +33 -0
  76. data/rice/Object_defn.hpp +214 -0
  77. data/rice/Require_Guard.hpp +21 -0
  78. data/rice/String.cpp +94 -0
  79. data/rice/String.hpp +91 -0
  80. data/rice/Struct.cpp +117 -0
  81. data/rice/Struct.hpp +162 -0
  82. data/rice/Struct.ipp +26 -0
  83. data/rice/Symbol.cpp +25 -0
  84. data/rice/Symbol.hpp +66 -0
  85. data/rice/Symbol.ipp +44 -0
  86. data/rice/config.hpp +47 -0
  87. data/rice/config.hpp.in +46 -0
  88. data/rice/detail/Arguments.hpp +118 -0
  89. data/rice/detail/Auto_Function_Wrapper.hpp +898 -0
  90. data/rice/detail/Auto_Function_Wrapper.ipp +3694 -0
  91. data/rice/detail/Auto_Member_Function_Wrapper.hpp +897 -0
  92. data/rice/detail/Auto_Member_Function_Wrapper.ipp +2774 -0
  93. data/rice/detail/Caster.hpp +103 -0
  94. data/rice/detail/Exception_Handler.hpp +8 -0
  95. data/rice/detail/Exception_Handler.ipp +68 -0
  96. data/rice/detail/Exception_Handler_defn.hpp +96 -0
  97. data/rice/detail/Iterator.hpp +93 -0
  98. data/rice/detail/Not_Copyable.hpp +25 -0
  99. data/rice/detail/Wrapped_Function.hpp +33 -0
  100. data/rice/detail/cfp.hpp +24 -0
  101. data/rice/detail/cfp.ipp +51 -0
  102. data/rice/detail/check_ruby_type.cpp +27 -0
  103. data/rice/detail/check_ruby_type.hpp +23 -0
  104. data/rice/detail/creation_funcs.hpp +37 -0
  105. data/rice/detail/creation_funcs.ipp +36 -0
  106. data/rice/detail/default_allocation_func.hpp +23 -0
  107. data/rice/detail/default_allocation_func.ipp +11 -0
  108. data/rice/detail/define_method_and_auto_wrap.hpp +31 -0
  109. data/rice/detail/define_method_and_auto_wrap.ipp +30 -0
  110. data/rice/detail/demangle.cpp +56 -0
  111. data/rice/detail/demangle.hpp +19 -0
  112. data/rice/detail/env.hpp +11 -0
  113. data/rice/detail/from_ruby.hpp +43 -0
  114. data/rice/detail/from_ruby.ipp +60 -0
  115. data/rice/detail/method_data.cpp +92 -0
  116. data/rice/detail/method_data.hpp +21 -0
  117. data/rice/detail/node.hpp +13 -0
  118. data/rice/detail/protect.cpp +29 -0
  119. data/rice/detail/protect.hpp +34 -0
  120. data/rice/detail/ruby.hpp +74 -0
  121. data/rice/detail/ruby_version_code.hpp +6 -0
  122. data/rice/detail/ruby_version_code.hpp.in +6 -0
  123. data/rice/detail/st.hpp +22 -0
  124. data/rice/detail/to_ruby.hpp +22 -0
  125. data/rice/detail/to_ruby.ipp +36 -0
  126. data/rice/detail/traits.hpp +43 -0
  127. data/rice/detail/win32.hpp +16 -0
  128. data/rice/detail/wrap_function.hpp +66 -0
  129. data/rice/global_function.hpp +33 -0
  130. data/rice/global_function.ipp +22 -0
  131. data/rice/protect.hpp +38 -0
  132. data/rice/protect.ipp +1134 -0
  133. data/rice/ruby_mark.hpp +13 -0
  134. data/rice/ruby_try_catch.hpp +86 -0
  135. data/rice/rubypp.rb +97 -0
  136. data/rice/to_from_ruby.hpp +8 -0
  137. data/rice/to_from_ruby.ipp +418 -0
  138. data/rice/to_from_ruby_defn.hpp +70 -0
  139. data/ruby.ac +135 -0
  140. data/ruby/Makefile.am +1 -0
  141. data/ruby/Makefile.in +628 -0
  142. data/ruby/lib/Makefile.am +3 -0
  143. data/ruby/lib/Makefile.in +506 -0
  144. data/ruby/lib/mkmf-rice.rb.in +217 -0
  145. data/ruby/lib/version.rb +3 -0
  146. data/sample/Makefile.am +47 -0
  147. data/sample/Makefile.in +489 -0
  148. data/sample/enum/extconf.rb +3 -0
  149. data/sample/enum/sample_enum.cpp +54 -0
  150. data/sample/enum/test.rb +8 -0
  151. data/sample/inheritance/animals.cpp +98 -0
  152. data/sample/inheritance/extconf.rb +3 -0
  153. data/sample/inheritance/test.rb +7 -0
  154. data/sample/map/extconf.rb +3 -0
  155. data/sample/map/map.cpp +81 -0
  156. data/sample/map/test.rb +7 -0
  157. data/test/Makefile.am +72 -0
  158. data/test/Makefile.in +1213 -0
  159. data/test/ext/Makefile.am +41 -0
  160. data/test/ext/Makefile.in +483 -0
  161. data/test/ext/t1/Foo.hpp +10 -0
  162. data/test/ext/t1/extconf.rb +2 -0
  163. data/test/ext/t1/t1.cpp +15 -0
  164. data/test/ext/t2/extconf.rb +2 -0
  165. data/test/ext/t2/t2.cpp +11 -0
  166. data/test/test_Address_Registration_Guard.cpp +43 -0
  167. data/test/test_Array.cpp +248 -0
  168. data/test/test_Builtin_Object.cpp +71 -0
  169. data/test/test_Class.cpp +496 -0
  170. data/test/test_Constructor.cpp +128 -0
  171. data/test/test_Data_Object.cpp +275 -0
  172. data/test/test_Data_Type.cpp +348 -0
  173. data/test/test_Director.cpp +308 -0
  174. data/test/test_Enum.cpp +215 -0
  175. data/test/test_Exception.cpp +47 -0
  176. data/test/test_Hash.cpp +212 -0
  177. data/test/test_Identifier.cpp +70 -0
  178. data/test/test_Jump_Tag.cpp +17 -0
  179. data/test/test_Memory_Management.cpp +50 -0
  180. data/test/test_Module.cpp +497 -0
  181. data/test/test_Object.cpp +159 -0
  182. data/test/test_String.cpp +107 -0
  183. data/test/test_Struct.cpp +205 -0
  184. data/test/test_Symbol.cpp +63 -0
  185. data/test/test_To_From_Ruby.cpp +428 -0
  186. data/test/test_global_functions.cpp +114 -0
  187. data/test/test_rice.rb +41 -0
  188. data/test/unittest.cpp +136 -0
  189. data/test/unittest.hpp +294 -0
  190. metadata +297 -0
data/missing ADDED
@@ -0,0 +1,215 @@
1
+ #! /bin/sh
2
+ # Common wrapper for a few potentially missing GNU programs.
3
+
4
+ scriptversion=2018-03-07.03; # UTC
5
+
6
+ # Copyright (C) 1996-2020 Free Software Foundation, Inc.
7
+ # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
8
+
9
+ # This program is free software; you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation; either version 2, or (at your option)
12
+ # any later version.
13
+
14
+ # This program is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
21
+
22
+ # As a special exception to the GNU General Public License, if you
23
+ # distribute this file as part of a program that contains a
24
+ # configuration script generated by Autoconf, you may include it under
25
+ # the same distribution terms that you use for the rest of that program.
26
+
27
+ if test $# -eq 0; then
28
+ echo 1>&2 "Try '$0 --help' for more information"
29
+ exit 1
30
+ fi
31
+
32
+ case $1 in
33
+
34
+ --is-lightweight)
35
+ # Used by our autoconf macros to check whether the available missing
36
+ # script is modern enough.
37
+ exit 0
38
+ ;;
39
+
40
+ --run)
41
+ # Back-compat with the calling convention used by older automake.
42
+ shift
43
+ ;;
44
+
45
+ -h|--h|--he|--hel|--help)
46
+ echo "\
47
+ $0 [OPTION]... PROGRAM [ARGUMENT]...
48
+
49
+ Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
50
+ to PROGRAM being missing or too old.
51
+
52
+ Options:
53
+ -h, --help display this help and exit
54
+ -v, --version output version information and exit
55
+
56
+ Supported PROGRAM values:
57
+ aclocal autoconf autoheader autom4te automake makeinfo
58
+ bison yacc flex lex help2man
59
+
60
+ Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
61
+ 'g' are ignored when checking the name.
62
+
63
+ Send bug reports to <bug-automake@gnu.org>."
64
+ exit $?
65
+ ;;
66
+
67
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
68
+ echo "missing $scriptversion (GNU Automake)"
69
+ exit $?
70
+ ;;
71
+
72
+ -*)
73
+ echo 1>&2 "$0: unknown '$1' option"
74
+ echo 1>&2 "Try '$0 --help' for more information"
75
+ exit 1
76
+ ;;
77
+
78
+ esac
79
+
80
+ # Run the given program, remember its exit status.
81
+ "$@"; st=$?
82
+
83
+ # If it succeeded, we are done.
84
+ test $st -eq 0 && exit 0
85
+
86
+ # Also exit now if we it failed (or wasn't found), and '--version' was
87
+ # passed; such an option is passed most likely to detect whether the
88
+ # program is present and works.
89
+ case $2 in --version|--help) exit $st;; esac
90
+
91
+ # Exit code 63 means version mismatch. This often happens when the user
92
+ # tries to use an ancient version of a tool on a file that requires a
93
+ # minimum version.
94
+ if test $st -eq 63; then
95
+ msg="probably too old"
96
+ elif test $st -eq 127; then
97
+ # Program was missing.
98
+ msg="missing on your system"
99
+ else
100
+ # Program was found and executed, but failed. Give up.
101
+ exit $st
102
+ fi
103
+
104
+ perl_URL=https://www.perl.org/
105
+ flex_URL=https://github.com/westes/flex
106
+ gnu_software_URL=https://www.gnu.org/software
107
+
108
+ program_details ()
109
+ {
110
+ case $1 in
111
+ aclocal|automake)
112
+ echo "The '$1' program is part of the GNU Automake package:"
113
+ echo "<$gnu_software_URL/automake>"
114
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
115
+ echo "<$gnu_software_URL/autoconf>"
116
+ echo "<$gnu_software_URL/m4/>"
117
+ echo "<$perl_URL>"
118
+ ;;
119
+ autoconf|autom4te|autoheader)
120
+ echo "The '$1' program is part of the GNU Autoconf package:"
121
+ echo "<$gnu_software_URL/autoconf/>"
122
+ echo "It also requires GNU m4 and Perl in order to run:"
123
+ echo "<$gnu_software_URL/m4/>"
124
+ echo "<$perl_URL>"
125
+ ;;
126
+ esac
127
+ }
128
+
129
+ give_advice ()
130
+ {
131
+ # Normalize program name to check for.
132
+ normalized_program=`echo "$1" | sed '
133
+ s/^gnu-//; t
134
+ s/^gnu//; t
135
+ s/^g//; t'`
136
+
137
+ printf '%s\n' "'$1' is $msg."
138
+
139
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
140
+ case $normalized_program in
141
+ autoconf*)
142
+ echo "You should only need it if you modified 'configure.ac',"
143
+ echo "or m4 files included by it."
144
+ program_details 'autoconf'
145
+ ;;
146
+ autoheader*)
147
+ echo "You should only need it if you modified 'acconfig.h' or"
148
+ echo "$configure_deps."
149
+ program_details 'autoheader'
150
+ ;;
151
+ automake*)
152
+ echo "You should only need it if you modified 'Makefile.am' or"
153
+ echo "$configure_deps."
154
+ program_details 'automake'
155
+ ;;
156
+ aclocal*)
157
+ echo "You should only need it if you modified 'acinclude.m4' or"
158
+ echo "$configure_deps."
159
+ program_details 'aclocal'
160
+ ;;
161
+ autom4te*)
162
+ echo "You might have modified some maintainer files that require"
163
+ echo "the 'autom4te' program to be rebuilt."
164
+ program_details 'autom4te'
165
+ ;;
166
+ bison*|yacc*)
167
+ echo "You should only need it if you modified a '.y' file."
168
+ echo "You may want to install the GNU Bison package:"
169
+ echo "<$gnu_software_URL/bison/>"
170
+ ;;
171
+ lex*|flex*)
172
+ echo "You should only need it if you modified a '.l' file."
173
+ echo "You may want to install the Fast Lexical Analyzer package:"
174
+ echo "<$flex_URL>"
175
+ ;;
176
+ help2man*)
177
+ echo "You should only need it if you modified a dependency" \
178
+ "of a man page."
179
+ echo "You may want to install the GNU Help2man package:"
180
+ echo "<$gnu_software_URL/help2man/>"
181
+ ;;
182
+ makeinfo*)
183
+ echo "You should only need it if you modified a '.texi' file, or"
184
+ echo "any other file indirectly affecting the aspect of the manual."
185
+ echo "You might want to install the Texinfo package:"
186
+ echo "<$gnu_software_URL/texinfo/>"
187
+ echo "The spurious makeinfo call might also be the consequence of"
188
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
189
+ echo "want to install GNU make:"
190
+ echo "<$gnu_software_URL/make/>"
191
+ ;;
192
+ *)
193
+ echo "You might have modified some files without having the proper"
194
+ echo "tools for further handling them. Check the 'README' file, it"
195
+ echo "often tells you about the needed prerequisites for installing"
196
+ echo "this package. You may also peek at any GNU archive site, in"
197
+ echo "case some other package contains this missing '$1' program."
198
+ ;;
199
+ esac
200
+ }
201
+
202
+ give_advice "$1" | sed -e '1s/^/WARNING: /' \
203
+ -e '2,$s/^/ /' >&2
204
+
205
+ # Propagate the correct exit status (expected to be 127 for a program
206
+ # not found, 63 for a program that failed due to version mismatch).
207
+ exit $st
208
+
209
+ # Local variables:
210
+ # eval: (add-hook 'before-save-hook 'time-stamp)
211
+ # time-stamp-start: "scriptversion="
212
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
213
+ # time-stamp-time-zone: "UTC0"
214
+ # time-stamp-end: "; # UTC"
215
+ # End:
@@ -0,0 +1,22 @@
1
+ require 'fileutils'
2
+ require 'find'
3
+
4
+ def process(file)
5
+ puts "Post-processing #{file}"
6
+ File.open(file) do |input|
7
+ File.open("#{file}.pp", "w") do |output|
8
+ input.each_line do |line|
9
+ yield output, line
10
+ end
11
+ end
12
+ end
13
+ FileUtils.mv("#{file}.pp", "#{file}")
14
+ end
15
+
16
+ process("configure") do |out, line|
17
+ # autoconf doesn't properly enclose $srcdir and $am_aux_dir in quotes
18
+ line.gsub!(/([^"'])(\$srcdir)/, '\1"\2"')
19
+ line.gsub!(/([^"'])(\$am_aux_dir)/, '\1\"\2\"')
20
+ out.puts line
21
+ end
22
+ FileUtils.chmod(0700, "configure")
@@ -0,0 +1,28 @@
1
+ require 'fileutils'
2
+ require 'find'
3
+
4
+ def process(file)
5
+ puts "Post-processing #{file}"
6
+ File.open(file) do |input|
7
+ File.open("#{file}.pp", "w") do |output|
8
+ input.each_line do |line|
9
+ yield output, line
10
+ end
11
+ end
12
+ end
13
+ FileUtils.mv("#{file}.pp", "#{file}")
14
+ end
15
+
16
+ Find.find(".") do |file|
17
+ if file =~ /Makefile.in$/ then
18
+ process(file) do |out, line|
19
+ # automake doesn't properly enclose $distdir in quotes
20
+ if line !~ /echo / then
21
+ line.gsub!(/([^"'])(\$\(distdir\))/, '\1"\2"')
22
+ end
23
+ line.gsub!(/(\$\(MKDIR_P\).*`)/, 'eval \1')
24
+ out.puts line
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,22 @@
1
+ #include "Address_Registration_Guard.hpp"
2
+
3
+ bool Rice::Address_Registration_Guard::enabled = true;
4
+ bool Rice::Address_Registration_Guard::exit_handler_registered = false;
5
+
6
+ static void disable_all_guards(VALUE)
7
+ {
8
+ Rice::Address_Registration_Guard::disable();
9
+ }
10
+
11
+ void Rice::Address_Registration_Guard::registerExitHandler()
12
+ {
13
+ if (exit_handler_registered) return;
14
+ rb_set_end_proc(&disable_all_guards, Qnil);
15
+ exit_handler_registered = true;
16
+ }
17
+
18
+ void Rice::Address_Registration_Guard::disable()
19
+ {
20
+ enabled = false;
21
+ }
22
+
@@ -0,0 +1,7 @@
1
+ #ifndef Rice__Address_Registration_Guard__hpp_
2
+ #define Rice__Address_Registration_Guard__hpp_
3
+
4
+ #include "Address_Registration_Guard_defn.hpp"
5
+ #include "Address_Registration_Guard.ipp"
6
+
7
+ #endif // Rice__Address_Registration_Guard__hpp_
@@ -0,0 +1,37 @@
1
+ #include "Object.hpp"
2
+ #include <algorithm>
3
+
4
+ inline Rice::Address_Registration_Guard::
5
+ Address_Registration_Guard(VALUE * address)
6
+ : address_(address)
7
+ {
8
+ registerExitHandler();
9
+ rb_gc_register_address(address);
10
+ }
11
+
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
+ }
19
+
20
+ inline Rice::Address_Registration_Guard::
21
+ ~Address_Registration_Guard()
22
+ {
23
+ if (enabled)
24
+ rb_gc_unregister_address(address_);
25
+ }
26
+
27
+ inline VALUE * Rice::Address_Registration_Guard::
28
+ address() const
29
+ {
30
+ return address_;
31
+ }
32
+
33
+ inline void Rice::Address_Registration_Guard::
34
+ swap(Rice::Address_Registration_Guard & other)
35
+ {
36
+ std::swap(address_, other.address_);
37
+ }
@@ -0,0 +1,75 @@
1
+ #ifndef Rice__Address_Registration_Guard_defn__hpp_
2
+ #define Rice__Address_Registration_Guard_defn__hpp_
3
+
4
+ #include "Object_defn.hpp"
5
+ #include "detail/ruby.hpp"
6
+ #include "detail/Not_Copyable.hpp"
7
+
8
+ namespace Rice
9
+ {
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).
36
+ */
37
+ Address_Registration_Guard(VALUE * address);
38
+
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);
45
+
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();
52
+
53
+ //! Get the address that is registered with the GC.
54
+ VALUE * address() const;
55
+
56
+ //! Swap with another Address_Registration_Guard.
57
+ void swap(Address_Registration_Guard & other);
58
+
59
+ /** Called during Ruby's exit process since we should not call
60
+ * rb_gc unregister_address there
61
+ */
62
+ static void disable();
63
+
64
+ private:
65
+ static bool enabled;
66
+ static bool exit_handler_registered;
67
+
68
+ static void registerExitHandler();
69
+
70
+ VALUE * address_;
71
+ };
72
+
73
+ } // namespace Rice
74
+
75
+ #endif // Rice__Address_Registration_Guard_defn__hpp_
@@ -0,0 +1,8 @@
1
+ #ifndef Rice__Arg__hpp_
2
+ #define Rice__Arg__hpp_
3
+
4
+ #include "Arg_impl.hpp"
5
+ #include "detail/Arguments.hpp"
6
+ #include "Arg_operators.hpp"
7
+
8
+ #endif // Rice__Arg__hpp_
@@ -0,0 +1,129 @@
1
+ #ifndef Rice__Arg_Impl_hpp_
2
+ #define Rice__Arg_Impl_hpp_
3
+
4
+ namespace Rice {
5
+
6
+ //! Helper for defining default arguments of a method
7
+ /*! This class exposes the ability to define the default values of a
8
+ * wrapped method. Inspired by how Boost.Python handles keyword and
9
+ * default arguments, the syntax is simple:
10
+ *
11
+ * \code
12
+ * define_method(
13
+ * "method",
14
+ * &method,
15
+ * (Arg("arg1"), Arg("arg2") = 3, Arg("arg3") = true)
16
+ * );
17
+ * \endcode
18
+ *
19
+ * which means "for method &method, it takes 3 arguments
20
+ * [arg1, arg2, arg3]. Of these arguments, arg2's default is 3
21
+ * and arg3's default is true.
22
+ *
23
+ * It may be required to explicitly cast the type of the default
24
+ * value to prevent compilation errors.
25
+ */
26
+ class Arg
27
+ {
28
+ public:
29
+ //! Initialize a new Arg with the name of the argument
30
+ /*! We require the name of the argument because 1) it makes code
31
+ * easier to read and 2) hopefully Ruby gets keyword arguments
32
+ * in the future and this means Rice will be ready for it.
33
+ */
34
+ Arg(const char* name)
35
+ : name_(name)
36
+ , defaultValue(0)
37
+ {}
38
+
39
+ //! Copy Constructor
40
+ Arg(const Arg& other)
41
+ : name_(other.name()),
42
+ defaultValue(other.defaultValue ? other.defaultValue->clone() : 0)
43
+ {}
44
+
45
+ virtual ~Arg()
46
+ {
47
+ if(defaultValue) {
48
+ delete defaultValue;
49
+ }
50
+ }
51
+
52
+ //! Set the default value for this Arg
53
+ /*! Set the default value for this argument.
54
+ * If this isn't called on this Arg, then this
55
+ * Arg is required in the method call.
56
+ *
57
+ * \param val the value to store as default
58
+ */
59
+ template<typename Arg_Type>
60
+ Arg& operator=(Arg_Type val)
61
+ {
62
+ defaultValue = new type<Arg_Type>(val);
63
+ return *this;
64
+ }
65
+
66
+ //! Check if this Arg has a default value associated with it
67
+ bool hasDefaultValue() const {
68
+ return defaultValue != 0;
69
+ }
70
+
71
+ //! Return the default value associated with this Arg
72
+ /*! \return the type saved to this Arg
73
+ */
74
+ template<typename Arg_Type>
75
+ Arg_Type getDefaultValue()
76
+ {
77
+ return static_cast< type<Arg_Type>* >(defaultValue)->held;
78
+ }
79
+
80
+ //! Get the name of this Arg
81
+ const char* name() const
82
+ {
83
+ return name_;
84
+ }
85
+
86
+ private:
87
+
88
+ //! Name of the argument
89
+ const char* name_;
90
+
91
+ /**
92
+ * The following is a stripped down version of
93
+ * Boost.Any.
94
+ */
95
+
96
+ class type_base
97
+ {
98
+ public:
99
+ virtual ~type_base() {}
100
+ virtual type_base* clone() const = 0;
101
+ };
102
+
103
+ template<typename Type>
104
+ class type : public type_base
105
+ {
106
+ public:
107
+ type(Type value)
108
+ :held(value)
109
+ {}
110
+
111
+ virtual ~type() { }
112
+
113
+ virtual type_base* clone() const
114
+ {
115
+ return new type(held);
116
+ }
117
+
118
+ Type held;
119
+ };
120
+
121
+ public:
122
+
123
+ //! Our saved default value
124
+ type_base* defaultValue;
125
+ };
126
+
127
+ }
128
+
129
+ #endif // Rice__Arg_Impl_hpp_