rice 2.1.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bd0d5de4b2af1de7c8f7e812f7e3266b83a18054
4
- data.tar.gz: 2a719d9807aac1bfe4207d39312adc9447aa1f8a
3
+ metadata.gz: 1e936aa5acd436894b69f08585e6a10d9c71bdb5
4
+ data.tar.gz: 29a7085b7d0c354ff552fbba9acb47fcd8cedbe0
5
5
  SHA512:
6
- metadata.gz: bca41abf092893dabf1ba768515e9287da6e1d3b617bbc866a9f8ace30ac509229cf5f033c183985db7821779e688dd7854b80a2c27fcd85d7877a9ca0c32c21
7
- data.tar.gz: 7d47b281817209c3838a1c55b7be6c2984e851cf605ba91626fb73e84053e05b9c056c1fd714f28e66c12d69c962d2ac8c82acbfc7bf3707c2efb9bfc6f4ce59
6
+ metadata.gz: 17de95b0229f2719c2f349c42ca72f8974345d6b0dd7935957a8e777fab57880408bbf7cf03ca4599525d5238f484e77b7e6894ace3d6dda63d254235b4e30cd
7
+ data.tar.gz: 3338b3a528e72a8cb5a429c289c72f567716383b6462a9476b01463097207d69b37c7e699b0c77966ada9e79c5af1f66b3f6ca64bdec9f0cecfb234cb53351ac
data/Doxyfile CHANGED
@@ -733,7 +733,7 @@ WARN_LOGFILE =
733
733
  # spaces.
734
734
  # Note: If this tag is empty the current directory is searched.
735
735
 
736
- INPUT = rice
736
+ INPUT = rice README.md
737
737
 
738
738
  # This tag can be used to specify the character encoding of the source files
739
739
  # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -753,7 +753,7 @@ INPUT_ENCODING = UTF-8
753
753
  # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
754
754
  # *.qsf, *.as and *.js.
755
755
 
756
- FILE_PATTERNS = *.hpp README.doxygen
756
+ FILE_PATTERNS = *.hpp
757
757
 
758
758
  # The RECURSIVE tag can be used to specify whether or not subdirectories should
759
759
  # be searched for input files as well.
@@ -869,7 +869,7 @@ FILTER_SOURCE_PATTERNS =
869
869
  # (index.html). This can be useful if you have a project on for instance GitHub
870
870
  # and want to reuse the introduction page also for the doxygen output.
871
871
 
872
- USE_MDFILE_AS_MAINPAGE =
872
+ USE_MDFILE_AS_MAINPAGE = README.md
873
873
 
874
874
  #---------------------------------------------------------------------------
875
875
  # Configuration options related to source browsing
@@ -1779,18 +1779,6 @@ GENERATE_XML = NO
1779
1779
 
1780
1780
  XML_OUTPUT = xml
1781
1781
 
1782
- # The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
1783
- # validating XML parser to check the syntax of the XML files.
1784
- # This tag requires that the tag GENERATE_XML is set to YES.
1785
-
1786
- XML_SCHEMA =
1787
-
1788
- # The XML_DTD tag can be used to specify a XML DTD, which can be used by a
1789
- # validating XML parser to check the syntax of the XML files.
1790
- # This tag requires that the tag GENERATE_XML is set to YES.
1791
-
1792
- XML_DTD =
1793
-
1794
1782
  # If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
1795
1783
  # listings (including syntax highlighting and cross-referencing information) to
1796
1784
  # the XML output. Note that enabling this will significantly increase the size
@@ -20,7 +20,7 @@ EXTRA_DIST = \
20
20
  doxygen.am \
21
21
  doc
22
22
 
23
- rice/README.doxygen: README
23
+ rice/README.doxygen: README.md
24
24
  @echo Generating documentation
25
- @$(RUBY) -e 'File.open("README") { |i| File.open("rice/README.doxygen", "w") { |o| o.puts "/*! #{i.gets}"; i.each_line { |l| o.puts " #{l}" if l !~ /^\\comment/ and l !~ /^vim:/ }; o.puts " */" } }'
25
+ @$(RUBY) -e 'File.open("README.md") { |i| File.open("rice/README.doxygen", "w") { |o| o.puts "/*! #{i.gets}"; i.each_line { |l| o.puts " #{l}" if l !~ /^\\comment/ and l !~ /^vim:/ }; o.puts " */" } }'.md
26
26
 
@@ -1,7 +1,7 @@
1
- # Makefile.in generated by automake 1.15 from Makefile.am.
1
+ # Makefile.in generated by automake 1.15.1 from Makefile.am.
2
2
  # @configure_input@
3
3
 
4
- # Copyright (C) 1994-2014 Free Software Foundation, Inc.
4
+ # Copyright (C) 1994-2017 Free Software Foundation, Inc.
5
5
 
6
6
  # This Makefile.in is free software; the Free Software Foundation
7
7
  # gives unlimited permission to copy and/or distribute it,
@@ -190,7 +190,7 @@ CSCOPE = cscope
190
190
  DIST_SUBDIRS = $(SUBDIRS)
191
191
  am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/doxygen.am \
192
192
  $(top_srcdir)/rice/detail/ruby_version_code.hpp.in COPYING \
193
- README TODO config.guess config.sub depcomp install-sh missing
193
+ TODO config.guess config.sub depcomp install-sh missing
194
194
  DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
195
195
  distdir = $(PACKAGE)-$(VERSION)
196
196
  top_distdir = "$(distdir)"
@@ -616,7 +616,7 @@ distdir: $(DISTFILES)
616
616
  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
617
617
  || chmod -R a+r "$(distdir)"
618
618
  dist-gzip: distdir
619
- tardir="$(distdir)" && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >"$(distdir)".tar.gz
619
+ tardir="$(distdir)" && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >"$(distdir)".tar.gz
620
620
  $(am__post_remove_distdir)
621
621
 
622
622
  dist-bzip2: distdir
@@ -642,7 +642,7 @@ dist-shar: distdir
642
642
  @echo WARNING: "Support for shar distribution archives is" \
643
643
  "deprecated." >&2
644
644
  @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
645
- shar "$(distdir)" | GZIP=$(GZIP_ENV) gzip -c >"$(distdir)".shar.gz
645
+ shar "$(distdir)" | eval GZIP= gzip $(GZIP_ENV) -c >"$(distdir)".shar.gz
646
646
  $(am__post_remove_distdir)
647
647
 
648
648
  dist-zip: distdir
@@ -660,7 +660,7 @@ dist dist-all:
660
660
  distcheck: dist
661
661
  case '$(DIST_ARCHIVES)' in \
662
662
  *.tar.gz*) \
663
- GZIP=$(GZIP_ENV) gzip -dc "$(distdir)".tar.gz | $(am__untar) ;;\
663
+ eval GZIP= gzip $(GZIP_ENV) -dc "$(distdir)".tar.gz | $(am__untar) ;;\
664
664
  *.tar.bz2*) \
665
665
  bzip2 -dc "$(distdir)".tar.bz2 | $(am__untar) ;;\
666
666
  *.tar.lz*) \
@@ -670,7 +670,7 @@ distcheck: dist
670
670
  *.tar.Z*) \
671
671
  uncompress -c "$(distdir)".tar.Z | $(am__untar) ;;\
672
672
  *.shar.gz*) \
673
- GZIP=$(GZIP_ENV) gzip -dc "$(distdir)".shar.gz | unshar ;;\
673
+ eval GZIP= gzip $(GZIP_ENV) -dc "$(distdir)".shar.gz | unshar ;;\
674
674
  *.zip*) \
675
675
  unzip "$(distdir)".zip ;;\
676
676
  esac
@@ -911,9 +911,9 @@ uninstall-am:
911
911
 
912
912
  doc: doxygen-doc
913
913
 
914
- rice/README.doxygen: README
914
+ rice/README.doxygen: README.md
915
915
  @echo Generating documentation
916
- @$(RUBY) -e 'File.open("README") { |i| File.open("rice/README.doxygen", "w") { |o| o.puts "/*! #{i.gets}"; i.each_line { |l| o.puts " #{l}" if l !~ /^\\comment/ and l !~ /^vim:/ }; o.puts " */" } }'
916
+ @$(RUBY) -e 'File.open("README.md") { |i| File.open("rice/README.doxygen", "w") { |o| o.puts "/*! #{i.gets}"; i.each_line { |l| o.puts " #{l}" if l !~ /^\\comment/ and l !~ /^vim:/ }; o.puts " */" } }'.md
917
917
 
918
918
  # Tell versions [3.59,3.63) of GNU make to not export all variables.
919
919
  # Otherwise a system limit (for SysV at least) may be exceeded.
@@ -1,7 +1,6 @@
1
- \mainpage Rice - Ruby Interface for C++ Extensions
1
+ # Rice - Ruby Interface for C++ Extensions {#mainpage}
2
2
 
3
-
4
- \section intro Introduction
3
+ # Introduction {#intro}
5
4
 
6
5
  Rice is a C++ interface to Ruby's C API. It provides a type-safe and
7
6
  exception-safe interface in order to make embedding Ruby and writing
@@ -10,63 +9,65 @@ ways, but also attempts to provide an object-oriented interface to all
10
9
  of the Ruby C API.
11
10
 
12
11
  What Rice gives you:
13
- \li A simple C++-based syntax for wrapping and defining classes
14
- \li Automatic conversion of exceptions between C++ and Ruby
15
- \li Smart pointers for handling garbage collection
16
- \li Wrappers for most builtin types to simplify calling code
12
+ - A simple C++-based syntax for wrapping and defining classes
13
+ - Automatic conversion of exceptions between C++ and Ruby
14
+ - Smart pointers for handling garbage collection
15
+ - Wrappers for most builtin types to simplify calling code
17
16
 
18
- \section project Project Details
17
+ # Project Details {#project}
19
18
 
20
19
  The source is hosted on github: http://github.com/jasonroelofs/rice
21
20
 
22
21
  Bug tracking: http://github.com/jasonroelofs/rice/issues
23
22
 
24
- \section installation Installation
23
+ API documentation: http://jasonroelofs.github.io/rice
24
+
25
+ # Installation {#installation}
25
26
 
26
- \code
27
+ ~~~
27
28
  gem install rice
28
- \endcode
29
+ ~~~
29
30
 
30
31
  Building it locally from a clone of the repository is as follows:
31
32
 
32
- \code
33
+ ~~~
33
34
  ./bootstrap
34
35
  ruby extconf.rb
35
36
  make
36
- \endcode
37
+ ~~~
37
38
 
38
39
  Rice is known to work on *nix and OSX. Windows is not currently
39
40
  supported.
40
41
 
41
- \section tutorial Tutorial
42
+ # Tutorial {#tutorial}
42
43
 
43
- \subsection geting_started Getting started
44
+ ## Getting started {#getting_started}
44
45
 
45
46
  Writing an extension with Rice is very similar to writing an extension
46
47
  with the C API.
47
48
 
48
49
  The first step is to create an extconf.rb file:
49
50
 
50
- \code
51
+ ~~~{.cpp}
51
52
  require 'mkmf-rice'
52
53
  create_makefile('test')
53
- \endcode
54
+ ~~~
54
55
 
55
- Note that we use mkmf-rice instead of mkmf. This will ensure that the
56
+ Note that we use `mkmf-rice` instead of `mkmf`. This will ensure that the
56
57
  extension will be linked with standard C++ library along with the Rice
57
58
  library, and allow access to the Rice header files.
58
59
 
59
60
  Next we create our extension and save it to test.cpp:
60
61
 
61
- \code
62
+ ~~~{.cpp}
62
63
  extern "C"
63
64
  void Init_test()
64
65
  {
65
66
  }
66
- \endcode
67
+ ~~~
67
68
 
68
69
  Note the extern "C" line above. This tells the compiler that the
69
- function Init_test should have C linkage and calling convention. This
70
+ function `Init_test` should have C linkage and calling convention. This
70
71
  turns off name mangling so that the Ruby interpreter will be able to
71
72
  find the function (remember that Ruby is written in C, not C++).
72
73
 
@@ -75,11 +76,11 @@ particularly useful. The next step is to define a class so we can add
75
76
  methods to it.
76
77
 
77
78
 
78
- \subsection classes Defining clases
79
+ ## Defining clases {#classes}
79
80
 
80
81
  Defining a class in Rice is easy:
81
82
 
82
- \code
83
+ ~~~{.cpp}
83
84
  #include "rice/Class.hpp"
84
85
 
85
86
  using namespace Rice;
@@ -89,12 +90,12 @@ Defining a class in Rice is easy:
89
90
  {
90
91
  Class rb_cTest = define_class("Test");
91
92
  }
92
- \endcode
93
+ ~~~
93
94
 
94
- This will create a class called Test that inherits from Object. If we
95
+ This will create a class called `Test` that inherits from `Object`. If we
95
96
  wanted to inherit from a different class, we could easily do so:
96
97
 
97
- \code
98
+ ~~~{.cpp}
98
99
  #include "rice/Class.hpp"
99
100
 
100
101
  using namespace Rice;
@@ -104,34 +105,34 @@ wanted to inherit from a different class, we could easily do so:
104
105
  {
105
106
  Class rb_cMySocket = define_class("MySocket", rb_cIO);
106
107
  }
107
- \endcode
108
+ ~~~
108
109
 
109
- Note the prefix rb_c on the name of the class. This is a convention
110
- that the Ruby interpreter and many extensions tend to use. It signifies
111
- that this is a class and not some other type of object. Some other
110
+ Note the prefix rb_c on the name of the class. This is a convention
111
+ that the Ruby interpreter and many extensions tend to use. It signifies
112
+ that this is a class and not some other type of object. Some other
112
113
  naming conventions that are commonly used:
113
114
 
114
- \li rb_c variable name prefix for a Class
115
- \li rb_m variable name prefix for a Module
116
- \li rb_e variable name prefix for an Exception type
117
- \li rb_ function prefix for a function in the Ruby C API
118
- \li rb_f_ function prefix to differentiate between an API function that
115
+ - rb_c variable name prefix for a Class
116
+ - rb_m variable name prefix for a Module
117
+ - rb_e variable name prefix for an Exception type
118
+ - rb_ function prefix for a function in the Ruby C API
119
+ - rb_f_ function prefix to differentiate between an API function that
119
120
  takes Ruby objects as arguments and one that takes C argument types
120
- \li rb_*_s_ indicates the function is a singleton function
121
- \li *_m suffix to indicate the function takes variable number of
121
+ - rb_*_s_ indicates the function is a singleton function
122
+ - *_m suffix to indicate the function takes variable number of
122
123
  arguments
123
124
 
124
125
 
125
- Also note that we don't include "ruby.h" directly. Rice has a wrapper
126
+ Also note that we don't include "ruby.h" directly. Rice has a wrapper
126
127
  for ruby.h that handles some compatibility issues across platforms and
127
- Ruby versions. Always include Rice headers before including anything
128
+ Ruby versions. Always include Rice headers before including anything
128
129
  that might include "ruby.h".
129
130
 
130
- \subsection methods Defining methods
131
+ ## Defining methods {#methods}
131
132
 
132
133
  Now let's add a method to our class:
133
134
 
134
- \code
135
+ ~~~{.cpp}
135
136
  #include "rice/Class.hpp"
136
137
  #include "rice/String.hpp"
137
138
 
@@ -150,15 +151,15 @@ Now let's add a method to our class:
150
151
  define_class("Test")
151
152
  .define_method("hello", &test_hello);
152
153
  }
153
- \endcode
154
+ ~~~
154
155
 
155
- Here we add a method Test#hello that simply returns the string
156
+ Here we add a method `%Test#hello` that simply returns the string
156
157
  "Hello, World". The method takes self as an implicit parameter, but
157
158
  isn't used, so we comment it out to prevent a compiler warning.
158
159
 
159
- We could also add an #initialize method to our class:
160
+ We could also add an `#initialize` method to our class:
160
161
 
161
- \code
162
+ ~~~{.cpp}
162
163
  #include "rice/Class.hpp"
163
164
  #include "rice/String.hpp"
164
165
 
@@ -180,21 +181,21 @@ We could also add an #initialize method to our class:
180
181
  {
181
182
  Class rb_cTest =
182
183
  define_class("Test")
183
- .define_method("initialize", &test_initialize);
184
+ .define_method("initialize", &test_initialize)
184
185
  .define_method("hello", &test_hello);
185
186
  }
186
- \endcode
187
+ ~~~
187
188
 
188
- The initialize method sets an instance variable @foo to the value 42.
189
- The number is automatically converted to a Fixnum before doing the
189
+ The `initialize` method sets an instance variable `@foo` to the value 42.
190
+ The number is automatically converted to a `Fixnum` before doing the
190
191
  assignment.
191
192
 
192
- Note that we're chaining calls on the Class object. Most member
193
- functions in Module and Class return a reference to self, so we can
193
+ Note that we're chaining calls on the `Class` object. Most member
194
+ functions in `Module` and `Class` return a reference to self, so we can
194
195
  chain as many calls as we want to define as many methods as we want.
195
196
 
196
197
 
197
- \subsection data_types Wrapping C++ Types
198
+ ## Wrapping C++ Types {#data_types}
198
199
 
199
200
  It's useful to be able to define Ruby classes in a C++ style rather than
200
201
  using the Ruby API directly, but the real power Rice is in wrapping
@@ -202,19 +203,19 @@ already-defined C++ types.
202
203
 
203
204
  Let's assume we have the following C++ class that we want to wrap:
204
205
 
205
- \code
206
+ ~~~{.cpp}
206
207
  class Test
207
208
  {
208
209
  public:
209
210
  Test();
210
211
  std::string hello();
211
212
  };
212
- \endcode
213
+ ~~~
213
214
 
214
215
  This is a C++ version of the Ruby class we just created in the previous
215
- section. To wrap it:
216
+ section. To wrap it:
216
217
 
217
- \code
218
+ ~~~{.cpp}
218
219
  #include "rice/Data_Type.hpp"
219
220
  #include "rice/Constructor.hpp"
220
221
 
@@ -228,57 +229,57 @@ section. To wrap it:
228
229
  .define_constructor(Constructor<Test>())
229
230
  .define_method("hello", &Test::hello);
230
231
  }
231
- \endcode
232
+ ~~~
232
233
 
233
- This example is similar to the one before, but we use Data_Type<>
234
- instead of Class and the template version of define_class() instead of
235
- the non-template version. This creates a binding in the Rice library
236
- between the Ruby class Test and the C++ class Test such that Rice passes
237
- member function pointers to define_method().
234
+ This example is similar to the one before, but we use `Data_Type<>`
235
+ instead of `Class` and the template version of define_class() instead of
236
+ the non-template version. This creates a binding in the Rice library
237
+ between the Ruby class `Test` and the C++ class Test such that Rice passes
238
+ member function pointers to `define_method()`.
238
239
 
239
240
  It is possible to write the conversion functions ourself (as we'll see
240
241
  below), but Rice does all the dirty work for us.
241
242
 
242
243
 
243
- \subsection conversions Type conversions
244
+ ## Type conversions {#conversions}
244
245
 
245
246
  Let's look again at our example class:
246
247
 
247
- \code
248
+ ~~~{.cpp}
248
249
  class Test
249
250
  {
250
251
  public:
251
252
  Test();
252
253
  std::string hello();
253
254
  };
254
- \endcode
255
+ ~~~
255
256
 
256
257
  When we wrote our class, we never wrote a single line of code to convert
257
- the std::string returned by hello() into a Ruby type. Neverthless, the
258
+ the `std::string` returned by `hello()` into a Ruby type. Neverthless, the
258
259
  conversion works, and when we write:
259
260
 
260
- \code
261
+ ~~~{.cpp}
261
262
  test = Test.new
262
263
  puts test.hello
263
- \endcode
264
+ ~~~
264
265
 
265
266
  We get the expected result.
266
267
 
267
268
  Rice has two template conversion functions to convert between C++ and
268
269
  Ruby types:
269
270
 
270
- \code
271
+ ~~~{.cpp}
271
272
  template<typename T>
272
273
  T from_ruby(Object x);
273
274
 
274
275
  template<typename T>
275
276
  Object to_ruby(T const & x);
276
- \endcode
277
+ ~~~
277
278
 
278
279
  Rice has included by default specializations for many of the builtin
279
- types. To define your own conversion, you can write a specialization:
280
+ types. To define your own conversion, you can write a specialization:
280
281
 
281
- \code
282
+ ~~~{.cpp}
282
283
  template<>
283
284
  Foo from_ruby<Foo>(Object x)
284
285
  {
@@ -290,17 +291,17 @@ types. To define your own conversion, you can write a specialization:
290
291
  {
291
292
  // ...
292
293
  }
293
- \endcode
294
+ ~~~
294
295
 
295
296
  The implementation of these functions would, of course, depend on the
296
- implementation of Foo.
297
+ implementation of `Foo`.
297
298
 
298
299
 
299
- \subsection data_conversions Conversions for wrapped C++ types
300
+ ## Conversions for wrapped C++ types {#data_conversions}
300
301
 
301
- Take another look at the wrapper we wrote for the Test class:
302
+ Take another look at the wrapper we wrote for the `Test` class:
302
303
 
303
- \code
304
+ ~~~{.cpp}
304
305
  extern "C"
305
306
  void Init_test()
306
307
  {
@@ -309,62 +310,62 @@ Take another look at the wrapper we wrote for the Test class:
309
310
  .define_constructor(Constructor<Test>())
310
311
  .define_method("hello", &Test::hello);
311
312
  }
312
- \endcode
313
+ ~~~
313
314
 
314
- When we called define_class<Test>, it created a Class for us and
315
+ When we called `define_class<Test>`, it created a Class for us and
315
316
  automatically registered the new Class with the type system, so that the
316
317
  calls:
317
318
 
318
- \code
319
+ ~~~{.cpp}
319
320
  Data_Object<Foo> obj(new Foo);
320
321
  Foo * f = from_ruby<Foo *>(obj);
321
322
  Foo const * f = from_ruby<Foo const *>(obj);
322
- \endcode
323
+ ~~~
323
324
 
324
- work as expected.
325
+ works as expected.
325
326
 
326
- The Data_Object class is a wrapper for the Data_Wrap_Struct and the
327
- Data_Get_Struct macros in C extensions. It can be used to wrap or
328
- unwrap any class that has been assigned to a Data_Type. It inherits
329
- from Object, so any member functions we can call on an Object we can
330
- also call on a Data_Object:
327
+ The `Data_Object` class is a wrapper for the `Data_Wrap_Struct` and the
328
+ `Data_Get_Struct` macros in C extensions. It can be used to wrap or
329
+ unwrap any class that has been assigned to a `Data_Type`. It inherits
330
+ from `Object`, so any member functions we can call on an `Object` we can
331
+ also call on a `Data_Object`:
331
332
 
332
- \code
333
+ ~~~{.cpp}
333
334
  Object object_id = obj.call("object_id");
334
335
  std::cout << object_id << std::endl;
335
- \endcode
336
+ ~~~
336
337
 
337
- The Data_Object class can be used to wrap a newly-created object:
338
+ The `Data_Object` class can be used to wrap a newly-created object:
338
339
 
339
- \code
340
+ ~~~{.cpp}
340
341
  Data_Object<Foo> foo(new Foo);
341
- \endcode
342
+ ~~~
342
343
 
343
344
  or to unwrap an already-created object:
344
345
 
345
- \code
346
+ ~~~{.cpp}
346
347
  VALUE obj = ...;
347
348
  Data_Object<Foo> foo(obj);
348
- \endcode
349
+ ~~~
349
350
 
350
- A Data_Object functions like a smart pointer:
351
+ A `Data_Object` functions like a smart pointer:
351
352
 
352
- \code
353
+ ~~~{.cpp}
353
354
  Data_Object<Foo> foo(obj);
354
355
  foo->foo();
355
356
  std::cout << *foo << std::endl;
356
- \endcode
357
+ ~~~
357
358
 
358
- Like a VALUE or an Object, data stored in a Data_Object will be marked
359
- by the garbage collector as long as the Data_Object is on the stack.
359
+ Like a `VALUE` or an `Object`, data stored in a `Data_Object` will be marked
360
+ by the garbage collector as long as the `Data_Object` is on the stack.
360
361
 
361
362
 
362
- \subsection exception Exceptions
363
+ ## Exceptions {#exception}
363
364
 
364
365
  Suppose we added a member function to our example class that throws an
365
366
  exception:
366
367
 
367
- \code
368
+ ~~~{.cpp}
368
369
  class MyException
369
370
  : public std::exception
370
371
  {
@@ -377,11 +378,11 @@ exception:
377
378
  std::string hello();
378
379
  void error();
379
380
  };
380
- \endcode
381
+ ~~~
381
382
 
382
383
  If we were to wrap this function:
383
384
 
384
- \code
385
+ ~~~{.cpp}
385
386
  extern "C"
386
387
  void Init_test()
387
388
  {
@@ -391,14 +392,14 @@ If we were to wrap this function:
391
392
  .define_method("hello", &Test::hello)
392
393
  .define_method("error", &Test::error);
393
394
  }
394
- \endcode
395
+ ~~~
395
396
 
396
397
  and call it from inside Ruby:
397
398
 
398
- \code
399
+ ~~~{.cpp}
399
400
  test = Test.new
400
401
  test.error()
401
- \endcode
402
+ ~~~
402
403
 
403
404
  we would get an exception. Rice will automatically convert any
404
405
  C++ exception it catches into a Ruby exception. But what if we wanted
@@ -406,7 +407,7 @@ to use a custom error message when we convert the exception, or what if
406
407
  we wanted to convert to a different type of exception? We can write
407
408
  this:
408
409
 
409
- \code
410
+ ~~~{.cpp}
410
411
  extern "C"
411
412
  void Init_test()
412
413
  {
@@ -417,70 +418,70 @@ this:
417
418
  .define_method("hello", &Test::hello)
418
419
  .define_method("error", &Test::error);
419
420
  }
420
- \endcode
421
+ ~~~
421
422
 
422
- The handle_my_exception function need only rethrow the exception as a
423
- Rice::Exception:
423
+ The `handle_my_exception` function need only rethrow the exception as a
424
+ `Rice::Exception`:
424
425
 
425
- \code
426
+ ~~~{.cpp}
426
427
  void handle_my_exception(MyException const & ex)
427
428
  {
428
429
  throw Exception(rb_eRuntimeError, "Goodnight, moon");
429
430
  }
430
- \endcode
431
+ ~~~
431
432
 
432
433
  And what if we want to call Ruby code from C++? These exceptions are
433
434
  also converted:
434
435
 
435
- \code
436
+ ~~~{.cpp}
436
437
  Object o;
437
438
  o.call("some_function_that_raises", 42);
438
439
 
439
440
  protect(rb_raise, rb_eRuntimeError, "some exception msg");
440
- \endcode
441
+ ~~~
441
442
 
442
443
  Internally whenever Rice catches a C++ or a Ruby exception, it converts
443
- it to an Exception object. This object will later be re-raised as a
444
+ it to an `Exception` object. This object will later be re-raised as a
444
445
  Ruby exception when control is returned to the Ruby VM.
445
446
 
446
- Rice uses a similar class called Jump_Tag to handle symbols thrown by
447
- Ruby's throw/catch or other non-local jumps from inside the Ruby VM.
447
+ Rice uses a similar class called `Jump_Tag` to handle symbols thrown by
448
+ Ruby's `throw`/`catch` or other non-local jumps from inside the Ruby VM.
448
449
 
449
450
 
450
- \subsection builtin Builtin Types
451
+ ## Builtin Types {#builtin}
451
452
 
452
453
  You've seen this example:
453
454
 
454
- \code
455
+ ~~~{.cpp}
455
456
  Object object_id = obj.call("object_id");
456
457
  std::cout << object_id << std::endl;
457
- \endcode
458
+ ~~~
458
459
 
459
460
  Rice mimics the Ruby class hierarchy as closely as it can.
460
461
  In fact, the above code also works for Classes:
461
462
 
462
- \code
463
+ ~~~{.cpp}
463
464
  Class rb_cTest = define_class<Test>("Test");
464
465
  Object object_id = rb_cTest.call("object_id");
465
466
  std::cout << object_id << std::endl;
466
- \endcode
467
+ ~~~
467
468
 
468
469
  Rice provides builtin wrappers for many builtin Ruby types, including:
469
470
 
470
- \li Object
471
- \li Module
472
- \li Class
473
- \li String
474
- \li Array
475
- \li Hash
476
- \li Struct
477
- \li Symbol
478
- \li Exception
479
-
480
- The Array and Hash types can even be iterated over the same way one
471
+ - Object
472
+ - Module
473
+ - Class
474
+ - String
475
+ - Array
476
+ - Hash
477
+ - Struct
478
+ - Symbol
479
+ - Exception
480
+
481
+ The `Array` and `Hash` types can even be iterated over the same way one
481
482
  would iterate over an STL container:
482
483
 
483
- \code
484
+ ~~~{.cpp}
484
485
  Array a;
485
486
  a.push(to_ruby(42));
486
487
  a.push(to_ruby(43));
@@ -491,21 +492,21 @@ would iterate over an STL container:
491
492
  {
492
493
  std::cout << *it << std::endl;
493
494
  }
494
- \endcode
495
+ ~~~
495
496
 
496
- STL algorithms should also work as expected on Array and Hash containers.
497
+ STL algorithms should also work as expected on `Array` and `Hash` containers.
497
498
 
498
499
 
499
- \subsection inheritance Inheritance
500
+ ## Inheritance {#inheritance}
500
501
 
501
- Inheritance is a tricky problem to solve in extensions. This is because
502
+ Inheritance is a tricky problem to solve in extensions. This is because
502
503
  wrapper functions for base classes typically don't know how to accept
503
- pointers to derived classes. It is possible to write this logic, but
504
+ pointers to derived classes. It is possible to write this logic, but
504
505
  the code is nontrivial.
505
506
 
506
507
  Forunately Rice handles this gracefully:
507
508
 
508
- \code
509
+ ~~~{.cpp}
509
510
  class Base
510
511
  {
511
512
  public:
@@ -526,15 +527,15 @@ Forunately Rice handles this gracefully:
526
527
  Data_Type<Derived> rb_cDerived =
527
528
  define_class<Derived, Base>("Derived");
528
529
  }
529
- \endcode
530
+ ~~~
530
531
 
531
- The second template parameter to define_class indicates that Derived
532
- inherits from Base.
532
+ The second template parameter to define_class indicates that `Derived`
533
+ inherits from `Base`.
533
534
 
534
535
  Rice does not support multiple inheritance.
535
536
 
536
537
 
537
- \subsection overloading Overloaded functions
538
+ ## Overloaded functions {#overloading}
538
539
 
539
540
  If you try to create a member function pointer to an overloaded
540
541
  function, you will get an error. So how do we wrap classes that have
@@ -542,17 +543,17 @@ overloaded functions?
542
543
 
543
544
  Consider a class that uses this idiom for accessors:
544
545
 
545
- \code
546
+ ~~~{.cpp}
546
547
  class Container
547
548
  {
548
549
  size_t capacity(); // Get the capacity
549
550
  void capacity(size_t cap); // Set the capacity
550
551
  };
551
- \endcode
552
+ ~~~
552
553
 
553
- We can wrap this class by using typedefs:
554
+ We can wrap this class by using `typedef`s:
554
555
 
555
- \code
556
+ ~~~{.cpp}
556
557
  extern "C"
557
558
  void Init_Container()
558
559
  {
@@ -564,45 +565,43 @@ We can wrap this class by using typedefs:
564
565
  .define_method("capacity", get_capacity(&Container::capacity))
565
566
  .define_method("capacity=", set_capacity(&Container::capacity))
566
567
  }
567
- \endcode
568
+ ~~~
568
569
 
569
570
 
570
- \subsection user_defined_conversions User-defined type conversions
571
+ ## User-defined type conversions {#user_defined_conversions}
571
572
 
572
- Rice provides default conversions for many built-in types. Sometimes,
573
- however, the default conversion is not what is expected. For
573
+ Rice provides default conversions for many built-in types. Sometimes,
574
+ however, the default conversion is not what is expected. For
574
575
  example, consider a function:
575
576
 
576
- \code
577
+ ~~~{.cpp}
577
578
  void foo(char * x);
578
- \endcode
579
+ ~~~
579
580
 
580
- Is x a pointer to a single character or a pointer to the first character
581
+ Is `x` a pointer to a single character or a pointer to the first character
581
582
  of a null-terminated string or a pointer to the first character of an
582
583
  array of char?
583
584
 
584
585
  Because the second case is the most common use case (a pointer to the
585
586
  first character of a C string), Rice provides a default conversion that
586
- treats a char * as a C string. But suppose the above function takes a
587
+ treats a `char *` as a C string. But suppose the above function takes a
587
588
  pointer to a char instead?
588
589
 
589
590
  If we write this:
590
591
 
591
- \comment : -- this comment is to satisfy vim syntax highlighting --
592
-
593
- \code
592
+ ~~~{.cpp}
594
593
  extern "C"
595
594
  void Init_test()
596
595
  {
597
596
  define_global_function("foo", &foo);
598
597
  }
599
- \endcode
598
+ ~~~
600
599
 
601
600
  It will likely have the wrong behavior.
602
601
 
603
602
  To avoid this problem, it is necessary to write a wrapper function:
604
603
 
605
- \code
604
+ ~~~{.cpp}
606
605
  Object wrap_foo(Object o)
607
606
  {
608
607
  char c = from_ruby<char>(o);
@@ -615,30 +614,30 @@ To avoid this problem, it is necessary to write a wrapper function:
615
614
  {
616
615
  define_global_function("foo", &wrap_foo);
617
616
  }
618
- \endcode
617
+ ~~~
619
618
 
620
- Note that the out parameter is returned from wrap_foo, as Ruby does not
619
+ Note that the out parameter is returned from `wrap_foo`, as Ruby does not
621
620
  have pass-by-variable-reference (it uses pass-by-object-reference).
622
621
 
623
622
 
624
- \subsection default_arguments Default Arguments
623
+ ## Default Arguments {#default_arguments}
625
624
 
626
- Going back to our initial C++ class example, lets say that hello() now
625
+ Going back to our initial C++ class example, lets say that `hello()` now
627
626
  takes more arguments, one of which has a default value:
628
627
 
629
- \code
628
+ ~~~{.cpp}
630
629
  class Test
631
630
  {
632
631
  public:
633
632
  Test();
634
633
  std::string hello(std::string first, std::string second = "world");
635
634
  };
636
- \endcode
635
+ ~~~
637
636
 
638
637
  As default parameter information is not available through templates,
639
- it is necessary to define this in Rice explicitly using Rice::Arg:
638
+ it is necessary to define this in Rice explicitly using `Rice::Arg`:
640
639
 
641
- \code
640
+ ~~~{.cpp}
642
641
  #include "rice/Data_Type.hpp"
643
642
  #include "rice/Constructor.hpp"
644
643
 
@@ -655,70 +654,70 @@ it is necessary to define this in Rice explicitly using Rice::Arg:
655
654
  (Arg("hello"), Arg("second") = "world")
656
655
  );
657
656
  }
658
- \endcode
657
+ ~~~
659
658
 
660
- The syntax here is simply Arg(nameOfParameter)[ = defaultValue]. The name of the
661
- parameter is not important here (a readability tool), but the value set via operator=
659
+ The syntax here is simply `Arg(nameOfParameter)[ = defaultValue]`. The name of the
660
+ parameter is not important here (a readability tool), but the value set via `operator=`
662
661
  must match the type of the parameter. As such it may be necessary to
663
662
  explicitly cast the default value.
664
663
 
665
- \code
664
+ ~~~{.cpp}
666
665
  .define_method("hello",
667
666
  &Test::hello,
668
667
  (Arg("hello"), Arg("second") = (std::string)"world")
669
668
  );
670
- \endcode
669
+ ~~~
671
670
 
672
- These Rice::Arg objects must be in the correct order and must be
671
+ These `Rice::Arg` objects must be in the correct order and must be
673
672
  surrounded with parentheses if more than one exists.
674
673
 
675
674
  Now, Ruby will now know about the default arguments, and this wrapper
676
675
  can be used as expected:
677
676
 
678
- \code
677
+ ~~~{.cpp}
679
678
  t = Test.new
680
679
  t.hello("hello")
681
680
  t.hello("goodnight", "moon")
682
- \endcode
681
+ ~~~
683
682
 
684
683
  This also works with Constructors:
685
684
 
686
- \code
685
+ ~~~{.cpp}
687
686
  .define_constructor(Constructor<SomeClass, int, int>(),
688
687
  ( Arg("arg1") = 1, Arg("otherArg") = 12 );
689
- \endcode
688
+ ~~~
690
689
 
691
- \subsection director Director
690
+ ## Director {#director}
692
691
 
693
692
  As polymorphism is the most important tennant of Object Oriented Programming,
694
693
  it is important that Rice supports polymorphic calls travelling between C++
695
694
  and Ruby seemlessly. Super calls from Ruby subclasses back into C++ already work,
696
695
  but enabling the other direction requires some extra effort. Rice
697
- suppplies the the Rice::Director class and
698
- Rice::Data_Type::define_director to expose this functionality.
696
+ supplies the the `Rice::Director` class and
697
+ `Rice::Data_Type::define_director` to expose this functionality.
699
698
 
700
- Like SWIG_Director, Rice::Director is a class that is used to build a proxy class
701
- to properly send execution up or down the object heiarchy for that class. Take
699
+ Like `SWIG_Director`, `Rice::Director` is a class that is used to build a proxy class
700
+ to properly send execution up or down the object hierarchy for that class. Take
702
701
  the following class:
703
702
 
704
- \code
703
+ ~~~{.cpp}
705
704
  class VirtualBase {
706
705
  public:
707
706
  VirtualBase();
708
707
  virtual int doWork();
709
708
  virtual int processWorker() = 0;
710
709
  };
711
- \endcode
710
+ ~~~
712
711
 
713
712
  Due to the abstract nature of this class, it will not work at all with Rice
714
713
  in its current form. Any attempt to do so will cause a compilation error due to
715
714
  this class not being constructable. Even without the pure virtual function, any
716
- call to VirtualBase::doWork will stop at the C++ level and will not pass down into
715
+ call to `VirtualBase::doWork` will stop at the C++ level and will not pass down into
717
716
  any Ruby subclasses.
718
717
 
719
- To properly wrap both of these methods, use a Rice::Director subclass as a proxy:
718
+ To properly wrap both of these methods, use a `Rice::Director` subclass as a proxy:
720
719
 
721
- \code
720
+ ~~~{.cpp}
722
721
  #include "rice/Director.hpp"
723
722
 
724
723
  class VirtualBaseProxy : public VirtualBase, public Rice::Director {
@@ -741,27 +740,27 @@ To properly wrap both of these methods, use a Rice::Director subclass as a proxy
741
740
  raisePureVirtual();
742
741
  }
743
742
  };
744
- \endcode
743
+ ~~~
745
744
 
746
745
  There is a lot going on here, so we'll go through each part.
747
746
 
748
- \code
747
+ ~~~{.cpp}
749
748
  class VirtualBaseProxy : public Virtualbase, public Rice::Director {
750
- \endcode
749
+ ~~~
751
750
 
752
- First, the class needs to subclass both the virtual class in question and Rice::Director.
751
+ First, the class needs to subclass both the virtual class in question and `Rice::Director`.
753
752
 
754
- \code
753
+ ~~~{.cpp}
755
754
  public:
756
755
  VirtualBaseProxy(Object self) : Rice::Director(self) { }
757
- \endcode
756
+ ~~~
758
757
 
759
- For Rice::Director to work its magic, every instance of this class needs to
758
+ For `Rice::Director` to work its magic, every instance of this class needs to
760
759
  have a handle to the Ruby instance. The constructor
761
- must take a Rice::Object as the first argument and pass it up into
762
- Rice::Director. The code here is the minimum required for a Rice::Director proxy.
760
+ must take a `Rice::Object` as the first argument and pass it up into
761
+ `Rice::Director`. The code here is the minimum required for a `Rice::Director` proxy.
763
762
 
764
- \code
763
+ ~~~{.cpp}
765
764
  virtual int doWork() {
766
765
  return from_ruby<int>( getSelf().call("do_work") );
767
766
  }
@@ -769,33 +768,33 @@ Rice::Director. The code here is the minimum required for a Rice::Director proxy
769
768
  int default_doWork() {
770
769
  return VirtualBase::doWork();
771
770
  }
772
- \endcode
771
+ ~~~
773
772
 
774
773
  Here the directory proxy overrides the methods for Ruby exposure and
775
- implements the required actions to pass flow around the heirarchy
774
+ implements the required actions to pass flow around the hierarchy
776
775
  appropriately. The pattern shown here is that the actual override will
777
776
  call down into Ruby, handling any type conversions, while a
778
- default_methodName method handles calling up into C++ and will be the
777
+ `default_methodName` method handles calling up into C++ and will be the
779
778
  method wrapped into Rice.
780
779
 
781
- The default_doWork method will be used as Rice's hookup of calling back up the
782
- heirarchy (wrapping is below). This method needs to do one of two things: call
783
- up the class heirarchy, as seen here, or call raisePureVirtual() as seen in the
780
+ The `default_doWork` method will be used as Rice's hookup of calling back up the
781
+ hierarchy (wrapping is below). This method needs to do one of two things: call
782
+ up the class hierarchy, as seen here, or call `raisePureVirtual()` as seen in the
784
783
  processWorker example:
785
784
 
786
- \code
785
+ ~~~{.cpp}
787
786
  int default_processWorker() {
788
787
  raisePureVirtual();
789
788
  }
790
- \endcode
789
+ ~~~
791
790
 
792
- The method raisePureVirtual() exists to allow wrapping a pure virtual method into Ruby
793
- (and ensuring compliation is possible) but making sure any users of this extension are
791
+ The method `raisePureVirtual()` exists to allow wrapping a pure virtual method into Ruby
792
+ (and ensuring compliation is possible) but making sure any users of this extension are
794
793
  informed quickly that there's nothing callable in the C++ side of the library.
795
794
 
796
795
  Once the proxy class is built, it's time to wrap it into Ruby:
797
796
 
798
- \code
797
+ ~~~{.cpp}
799
798
  extern "C"
800
799
  void Init_virtual() {
801
800
  define_class<VirtualBase>("VirtualBase")
@@ -804,28 +803,28 @@ void Init_virtual() {
804
803
  .define_method("do_work", &VirtualBaseProxy::default_doWork)
805
804
  .define_method("process_worker", &VirtualBaseProxy::default_processWorker);
806
805
  }
807
- \endcode
806
+ ~~~
808
807
 
809
808
  The wrapping is the same as is described earlier in this document. Expose the class
810
- VirtualBase, and register VirtualBaseProxy as a director proxy of VirtualBase with
811
- Rice::Data_Type::define_director, then define methods pointing to the proxy object as necessary.
809
+ `VirtualBase`, and register `VirtualBaseProxy` as a director proxy of `VirtualBase` with
810
+ `Rice::Data_Type::define_director`, then `define methods` pointing to the proxy object as necessary.
812
811
 
813
- You must use the Rice::Director proxy class in the Constructor line, this allows proper
812
+ You must use the `Rice::Director` proxy class in the Constructor line, this allows proper
814
813
  object construction / destruction of the types in question.
815
814
 
816
- \subsection implicit_cast Implicit Casting
815
+ ## Implicit Casting {#implicit_cast}
817
816
 
818
817
  There are times when a library exposes classes that, while unrelated, are
819
818
  built to be interchangeable across the library. One example of this is found in
820
819
  the Open Source 3d rendering engine <a
821
820
  href="http://www.ogre3d.org/">OGRE</a>: Ogre::Degree and Ogre::Radian.
822
- When a given method takes a Radian, you're free to pass in a Degree, and vice versa.
821
+ When a given method takes a Radian, you're free to pass in a Degree, and vice versa.
823
822
 
824
823
  Rice cannot automatically figure out if this kind of functionality is
825
824
  possible in a given library but it does provide an API for defining
826
- these relationships: Rice::define_implicit_cast<From, To>().
825
+ these relationships: `Rice::define_implicit_cast<From, To>()`.
827
826
 
828
- \code
827
+ ~~~{.cpp}
829
828
  class Degree { ... };
830
829
  class Radian { ... };
831
830
 
@@ -839,45 +838,45 @@ void Init_implicit() {
839
838
  define_implicit_cast<Degree, Radian>();
840
839
  define_implicit_cast<Radian, Degree>();
841
840
  }
842
- \endcode
841
+ ~~~
843
842
 
844
- Using Rice::define_implicit_cast has the following requirements:
843
+ Using `Rice::define_implicit_cast` has the following requirements:
845
844
 
846
- \li The two types must be bound in Rice before defining the cast.
847
- \li The classes must have constructors that take the other type.
848
- \li This feature cannot be used with fundamental types.
845
+ - The two types must be bound in Rice before defining the cast.
846
+ - The classes must have constructors that take the other type.
847
+ - This feature cannot be used with fundamental types.
849
848
 
850
849
  To see a full example of this feature, please check out
851
850
  test/test_Data_Type.cpp.
852
851
 
853
- \section motivation Motivation
852
+ # Motivation {#motivation}
854
853
 
855
854
  There are a number of common problems when writing C or C++ extensions
856
855
  for Ruby:
857
856
 
858
- \li Type safety. It is easy to mix-up integral types such as ID and
857
+ - Type safety. It is easy to mix-up integral types such as ID and
859
858
  VALUE. Some of the functions in the Ruby API are not consistent with
860
859
  which types they take (e.g. rb_const_defined takes an ID and
861
860
  rb_mod_remove_const takes a Symbol).
862
861
 
863
- \li DRY principle. Specifying the number of arguments that each wrapped
862
+ - DRY principle. Specifying the number of arguments that each wrapped
864
863
  function takes is easy to get wrong. Adding a new argument to the
865
864
  function means that the number of arguments passed to rb_define_method
866
865
  must also be updated.
867
866
 
868
- \li Type conversion. There are many different functions to convert data
867
+ - Type conversion. There are many different functions to convert data
869
868
  to and from ruby types. Many of them have different semantics or
870
869
  different forms. For example, to convert a string, one might use the
871
870
  StringValue macro, but to convert a fixnum, one might use FIX2INT.
872
871
  Unwrapping previously wrapped C data uses yet another form.
873
872
 
874
- \li Exception safety. It is imperative that C++ exceptions never make
873
+ - Exception safety. It is imperative that C++ exceptions never make
875
874
  their way into C code, and it is also imperative that a Ruby exception
876
875
  never escape while there are objects on the stack with nontrivial
877
876
  destructors. Rules for when it is okay to use which exceptions are
878
877
  difficult to get right, especially as code is maintained through time.
879
878
 
880
- \li Thread safety. Because the Ruby interpreter is not threads-safe,
879
+ - Thread safety. Because the Ruby interpreter is not threads-safe,
881
880
  the Ruby interpreter must not be run from more than one thread.
882
881
  Because of tricks the GC and scheduler play with the C stack, it's not
883
882
  enough to ensure that only one thread runs the interpreter at any
@@ -887,17 +886,17 @@ because Ruby copies the stack when it switches threads, C++ code must
887
886
  be careful not to access objects in one Ruby thread that were created
888
887
  on the stack in another Ruby thread.
889
888
 
890
- \li C-based API. The Ruby API is not always convenient for accessing
889
+ - C-based API. The Ruby API is not always convenient for accessing
891
890
  Ruby data structurs such as Hash and Array, especially when writing C++
892
891
  code, as the interface for these containers is not consistent with
893
892
  standard containers.
894
893
 
895
- \li Calling convention. Function pointers passed into the Ruby API must
894
+ - Calling convention. Function pointers passed into the Ruby API must
896
895
  follow the C calling convention. This means that it is not possible to
897
896
  pass a pointer to a template function or static member function (that
898
897
  is, it will work on some platforms, but isn't portable).
899
898
 
900
- \li Inheritance. When wrapping C++ objects, it is easy to store a
899
+ - Inheritance. When wrapping C++ objects, it is easy to store a
901
900
  pointer to a derived class, but then methods in the base class must have
902
901
  knowledge of the derived class in order to unwrap the object. It is
903
902
  possible to always store a pointer to the base class and then
@@ -906,12 +905,12 @@ can be slow and cumbersome, and it isn't likely to work with multiple
906
905
  inheritance. A system that properly handles inheritance for all corner
907
906
  cases is nontrivial.
908
907
 
909
- \li Multiple inheritance. C++ supports true multiple inheritance, but
908
+ - Multiple inheritance. C++ supports true multiple inheritance, but
910
909
  the Ruby object model uses single inheritance with mixins. When
911
910
  wrapping a library whose public interface uses multiple inheritance,
912
911
  care must be taken in constructing the mapping.
913
912
 
914
- \li GC safety. All live Ruby objects must be marked during the garbage
913
+ - GC safety. All live Ruby objects must be marked during the garbage
915
914
  collector's mark phase, otherwise they will be prematurely destroyed.
916
915
  The general rule is that object references stored on the heap should be
917
916
  either registered with rb_gc_register_address or marked by a data
@@ -919,66 +918,66 @@ object's mark function; object references stored on the stack will be
919
918
  automatically marked, provided the Ruby interpreter was properly
920
919
  initialized at startup.
921
920
 
922
- \li Callbacks. C implements callbacks via function pointers, while ruby
921
+ - Callbacks. C implements callbacks via function pointers, while ruby
923
922
  typically implements callbacks via procs. Writing an adapter function
924
923
  to call the proc is not difficult, but there is much opportunity for
925
924
  error (particularly with exception-safety).
926
925
 
927
- \li Data serialization. By default data objects defined at the C layer
926
+ - Data serialization. By default data objects defined at the C layer
928
927
  are not marshalable. The user must explicitly define functions to
929
928
  marshal the data member-by-member.
930
929
 
931
930
  Rice addresses these issues in many ways:
932
931
 
933
- \li Type safety. Rice provides encapsulation for all builtin types,
932
+ - Type safety. Rice provides encapsulation for all builtin types,
934
933
  such as Object, Identifier, Class, Module, and String. It
935
934
  automatically checks the dynamic type of an object before constructing
936
935
  an instance of a wrapper.
937
936
 
938
- \li DRY principle. Rice uses introspection through the use of templates
937
+ - DRY principle. Rice uses introspection through the use of templates
939
938
  and function overloading to automatically determine the number and types
940
939
  of arguments to functions. Default arguments must still be handled
941
940
  explicitly, however.
942
941
 
943
- \li Type conversions. Rice provides cast-style to_ruby<> and
942
+ - Type conversions. Rice provides cast-style to_ruby<> and
944
943
  from_ruby<> template functions to simplify explicit type conversions.
945
944
  Automatic type conversions for parameters and return values are
946
945
  generated for all wrapped functions.
947
946
 
948
- \li Exception safety. Rice automatically converts common exceptions and
947
+ - Exception safety. Rice automatically converts common exceptions and
949
948
  provides a mechanism for converting user-defined exception types. Rice
950
949
  also provides convenience functions for converting exceptions when
951
950
  calling back into ruby code.
952
951
 
953
- \li Thread safety. Rice provides no mechanisms for dealing with thread
952
+ - Thread safety. Rice provides no mechanisms for dealing with thread
954
953
  safety. Many common thread safety issues should be alleviated by YARV,
955
954
  which supports POSIX threads.
956
955
 
957
- \li C++-based API. Rice provides an object-oriented C++-style API to
956
+ - C++-based API. Rice provides an object-oriented C++-style API to
958
957
  most common functions in the Ruby C API.
959
958
 
960
- \li Calling convention. Rice automatically uses C calling convention
959
+ - Calling convention. Rice automatically uses C calling convention
961
960
  for all function pointers passed into the Ruby API.
962
961
 
963
- \li Inheritance. Rice provides automatic conversion to the base class
962
+ - Inheritance. Rice provides automatic conversion to the base class
964
963
  type when a wrapped member function is called on the base class.
965
964
 
966
- \li Multiple inheritance. Rice provides no mechanism for multiple
965
+ - Multiple inheritance. Rice provides no mechanism for multiple
967
966
  inheritance. Multiple inheritance can be simulated via mixins, though
968
967
  this is not yet as easy as it could be.
969
968
 
970
- \li GC safety. Rice provides a handful of convenience classes for
969
+ - GC safety. Rice provides a handful of convenience classes for
971
970
  interacting with the garbage collector. There are still basic rules
972
971
  which must be followed to ensure that objects get properly destroyed.
973
972
 
974
- \li Callbacks. Rice provides a handful of convenience classes for
973
+ - Callbacks. Rice provides a handful of convenience classes for
975
974
  dealing with callbacks.
976
975
 
977
- \li Data serialization. Rice provides no mechanism for data
976
+ - Data serialization. Rice provides no mechanism for data
978
977
  serialization, but it is likely this may be added in a future release.
979
978
 
980
979
 
981
- \section what_not What Rice is Not
980
+ # What Rice is Not {#what_not}
982
981
 
983
982
  There are a number projects which server similar functions to Rice. Two
984
983
  such popular projects are SWIG and Boost.Python. Rice has some
@@ -1008,7 +1007,7 @@ the C++ level. Thirdly, Rice uses Ruby as a code generator; I find this
1008
1007
  to be much more readable than using the Boost preprocessor library.
1009
1008
 
1010
1009
 
1011
- \section history History
1010
+ # History {#history}
1012
1011
 
1013
1012
  Rice originated as Excruby, a project to interface with C++-based trading
1014
1013
  software at Automated Trading Desk in Mount Pleasant, South Carolina.
@@ -1031,19 +1030,19 @@ the lower-level wrappers, but as an implementation detail; the public
1031
1030
  interface is truly a high-level abstraction around the Ruby C API.
1032
1031
 
1033
1032
 
1034
- \section gc The GC
1033
+ # The GC {#gc}
1035
1034
 
1036
- \li Objects are not automatically registered with the garbage collector.
1035
+ - Objects are not automatically registered with the garbage collector.
1037
1036
 
1038
- \li If an Object is on the stack, it does not need to be registered with
1037
+ - If an Object is on the stack, it does not need to be registered with
1039
1038
  the garbage collector.
1040
1039
 
1041
- \li If an Object is allocated on the heap or if it is a member of an
1040
+ - If an Object is allocated on the heap or if it is a member of an
1042
1041
  object that might be allocated on the heap, use an
1043
1042
  Rice::Address_Registration_Guard to register the object with the garbage
1044
1043
  collector.
1045
1044
 
1046
- \li If a reference counted object is being wrapped, or if another type
1045
+ - If a reference counted object is being wrapped, or if another type
1047
1046
  of smart pointer is wrapped, ensure that only one mechanism is used to
1048
1047
  destroy the object. In general, the smart pointer manages the
1049
1048
  allocation of the object, and Ruby should hold only a reference to the
@@ -1051,5 +1050,3 @@ smart pointer. When the garbage collector determines that it is time to
1051
1050
  clean up the object, the smart pointer will be destroyed, decrementing
1052
1051
  the reference count; when the reference count drops to 0, underlying
1053
1052
  object will be destroyed.
1054
-
1055
- vim:ft=cpp:tw=72:ts=2:sw=2:fo=cqrtn:noci:si