rice 3.0.0 → 4.0.3

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 (238) 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/include/rice/stl.hpp +1113 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +12 -14
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +11 -6
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -46
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  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/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. data/test/test_rice.rb +0 -45
data/rice/Object_defn.hpp DELETED
@@ -1,214 +0,0 @@
1
- #ifndef Rice__Object_defn__hpp_
2
- #define Rice__Object_defn__hpp_
3
-
4
- /*! \file Object.hpp
5
- */
6
-
7
- #include "Identifier.hpp"
8
- #include "detail/ruby.hpp"
9
-
10
- #include <iosfwd>
11
- #include <vector>
12
-
13
- namespace Rice
14
- {
15
-
16
- class Class;
17
- class String;
18
- class Array;
19
-
20
- //! The base class for all Objects
21
- /*! Perhaps the name "Object" is a misnomer, because this class really
22
- * holds an object reference, not an object.
23
- */
24
- class Object
25
- {
26
- public:
27
- //! Encapsulate an existing ruby object.
28
- Object(VALUE value = Qnil) : value_(value) { }
29
-
30
- //! Copy constructor
31
- Object(Object const & other) : value_(other.value()) { }
32
-
33
- //! Destructor
34
- virtual ~Object() { }
35
-
36
- //! Returns false if the object is nil or false; returns true
37
- //! otherwise.
38
- // Having this conversion also prevents accidental conversion to
39
- // undesired integral types (e.g. long or int) by making the
40
- // conversion ambiguous.
41
- bool test() const { return RTEST(value_); }
42
-
43
- //! Returns false if the object is nil or false; returns true
44
- //! otherwise.
45
- operator bool() const { return test(); }
46
-
47
- //! Returns true if the object is nil, false otherwise.
48
- bool is_nil() const { return NIL_P(value_); }
49
-
50
- //! Implicit conversion to VALUE.
51
- operator VALUE() const { return value_; }
52
-
53
- //! Explicitly get the encapsulated VALUE.
54
- // Returns a const ref so that Address_Registration_Guard can access
55
- // the address where the VALUE is stored
56
- VALUE const volatile & value() const { return value_; }
57
-
58
- //! Get the class of an object.
59
- /*! \return the object's Class.
60
- */
61
- Class class_of() const;
62
-
63
- //! Compare this object to another object.
64
- /*! Gets the result of self <=> other and returns the result. The
65
- * result will be less than zero if self < other, greater than zero
66
- * if self > other, and equal to zero if self == other.
67
- */
68
- int compare(Object const & other) const;
69
-
70
- //! Return a string representation of an object.
71
- /*! \return the result of calling to_s on the object. A String is not
72
- * returned, because it is not possible to return an instance of a
73
- * derived class.
74
- */
75
- String to_s() const;
76
-
77
- //! Inspect the object.
78
- /*! \return the result of calling inspect on the object. A String is
79
- * not returned, because it is not possible to return an instance of
80
- * a derived class.
81
- */
82
- String inspect() const;
83
-
84
- //! Freeze the object.
85
- void freeze();
86
-
87
- //! Determine if the object is frozen.
88
- /*! \return true if the object is frozen, false otherwise.
89
- */
90
- bool is_frozen() const;
91
-
92
- //! Swap with another Object.
93
- void swap(Object & other);
94
-
95
- //! Evaluate the given string in the context of the object.
96
- /*! This is equivalant to calling obj.instance_eval(s) from inside the
97
- * interpreter.
98
- * \return the result of the expression.
99
- */
100
- Object instance_eval(String const & s);
101
-
102
- //! Return the type of the underlying C object.
103
- /*! This is equivalent to calling rb_type(obj).
104
- * \return the type of the underlying C object (e.g. T_DATA, T_ARRAY,
105
- * etc.).
106
- */
107
- int rb_type() const;
108
-
109
- //! Determine whether the object is an instance of a class/module.
110
- /*! \param klass a class or module.
111
- * \return true if the object is an instance of the given
112
- * class/module or one of its descendants.
113
- */
114
- bool is_a(Object klass) const;
115
-
116
- //! Determine if the objects responds to a method.
117
- /*! \param id the name of the method
118
- * \return true if the objects responds to the method, false
119
- * otherwise.
120
- */
121
- bool respond_to(Identifier id) const;
122
-
123
- //! Determine whether class is the object's class.
124
- /*! \param klass a class.
125
- * \return true if the object is an instance of the given class.
126
- */
127
- bool is_instance_of(Object klass) const;
128
-
129
- //! Set an instance variable.
130
- /*! \param name the name of the instance variable to set (including
131
- * the leading @ sign)
132
- * \param value the value of the variable, which will be converted to
133
- * a Ruby type if necessary.
134
- */
135
- template<typename T>
136
- void iv_set(
137
- Identifier name,
138
- T const & value);
139
-
140
- //! Get the value of an instance variable.
141
- /*! \param name the name of the instance variable to get
142
- * \return the value of the instance variable
143
- */
144
- Object iv_get(
145
- Identifier name) const;
146
-
147
- //! Get the value of an instance variable, but don't warn if it is
148
- //unset.
149
- /*! \param name the name of the instance variable to get
150
- * \return the value of the instance variable
151
- */
152
- Object attr_get(
153
- Identifier name) const;
154
-
155
- //! Call the Ruby method specified by 'id' on object 'obj'.
156
- /*! Pass in arguments (arg1, arg2, ...). The arguments will be converted to
157
- * Ruby objects with to_ruby<>.
158
- *
159
- * E.g.:
160
- * \code
161
- * Rice::Object obj = x.call("foo", "one", 2);
162
- * \endcode
163
- *
164
- * If a return type is specified, the return value will automatically be
165
- * converted to that type as long as 'from_ruby' exists for that type.
166
- *
167
- * E.g.:
168
- * \code
169
- * float ret = x.call<float>("foo", z, 42);
170
- * \endcode
171
- */
172
- template<typename ...ArgT>
173
- Object call(Identifier id, ArgT... args) const;
174
-
175
- //! Vectorized call.
176
- /*! Calls the method identified by id with the list of arguments
177
- * identified by args.
178
- * \param id the name of the method to call
179
- * \param args the arguments to the method
180
- * \return the return value of the method call
181
- */
182
- Object vcall(Identifier id, Array args);
183
-
184
- //! Mark the object with the garbage collector.
185
- void mark() const;
186
-
187
- protected:
188
- //! Set the encapsulated value.
189
- void set_value(VALUE v);
190
-
191
- //! Unpack the provided arguments and convert them all to Ruby types.
192
- template<typename ...ArgT>
193
- std::vector<VALUE> convert_args(ArgT&... args) const;
194
-
195
- private:
196
- volatile VALUE value_;
197
- };
198
-
199
- std::ostream & operator<<(std::ostream & out, Object const & obj);
200
-
201
- bool operator==(Object const & lhs, Object const & rhs);
202
- bool operator!=(Object const & lhs, Object const & rhs);
203
- bool operator<(Object const & lhs, Object const & rhs);
204
- bool operator>(Object const & lhs, Object const & rhs);
205
-
206
- extern Object const Nil;
207
- extern Object const True;
208
- extern Object const False;
209
- extern Object const Undef;
210
-
211
- } // namespace Rice
212
-
213
- #endif // Rice__Object_defn__hpp_
214
-
@@ -1,21 +0,0 @@
1
- #ifndef Rice__Require_Guard__hpp_
2
- #define Rice__Require_Guard__hpp_
3
-
4
- /*! \def RICE_REQUIRE_GUARD
5
- * \brief Put this inside your Init_module function to keep it from
6
- * being required more than once with the same name (if you use
7
- * Rice, and your module is initialized more than once, an
8
- * exception will be thrown).
9
- */
10
- #define RICE_REQUIRE_GUARD \
11
- static bool Rice__module_initialized = false; \
12
- if(Rice__module_initialized) \
13
- { \
14
- return; \
15
- } \
16
- /* TODO: If module initialization fails, it's not possible to */ \
17
- /* retry */ \
18
- Rice__module_initialized = true
19
-
20
- #endif // Rice__Require_Guard__hpp_
21
-
data/rice/String.cpp DELETED
@@ -1,89 +0,0 @@
1
- #include "String.hpp"
2
- #include "Builtin_Object.hpp"
3
- #include "protect.hpp"
4
- #include "detail/ruby.hpp"
5
-
6
- #include <stdarg.h>
7
- #define va_init_list(a,b) va_start(a,b)
8
-
9
- Rice::String::
10
- String()
11
- : Builtin_Object<T_STRING>(protect(rb_str_new2, ""))
12
- {
13
- }
14
-
15
- Rice::String::
16
- String(VALUE v)
17
- : Builtin_Object<T_STRING>(v)
18
- {
19
- }
20
-
21
- Rice::String::
22
- String(Object v)
23
- : Builtin_Object<T_STRING>(v)
24
- {
25
- }
26
-
27
- Rice::String::
28
- String(char const * s)
29
- : Builtin_Object<T_STRING>(protect(rb_str_new2, s))
30
- {
31
- }
32
-
33
- Rice::String::
34
- String(std::string const & s)
35
- : Builtin_Object<T_STRING>(protect(rb_str_new, s.data(), (long)s.length()))
36
- {
37
- }
38
-
39
- Rice::String::
40
- String(Identifier id)
41
- : Builtin_Object<T_STRING>(protect(rb_str_new2, id.c_str()))
42
- {
43
- }
44
-
45
- Rice::String Rice::String::
46
- format(char const * fmt, ...)
47
- {
48
- va_list args;
49
- char buf[BUFSIZ];
50
-
51
- va_init_list(args, fmt);
52
- vsnprintf(buf, BUFSIZ, fmt, args);
53
- buf[BUFSIZ - 1] = '\0';
54
- va_end(args);
55
-
56
- String s = String(buf);
57
- return s;
58
- }
59
-
60
- size_t Rice::String::
61
- length() const
62
- {
63
- return RSTRING_LEN(value());
64
- }
65
-
66
- char Rice::String::
67
- operator[](ptrdiff_t index) const
68
- {
69
- return RSTRING_PTR(value())[index];
70
- }
71
-
72
- char const * Rice::String::
73
- c_str() const
74
- {
75
- return RSTRING_PTR(value());
76
- }
77
-
78
- std::string Rice::String::
79
- str() const
80
- {
81
- return std::string(RSTRING_PTR(value()), length());
82
- }
83
-
84
- Rice::Identifier Rice::String::
85
- intern() const
86
- {
87
- return rb_intern(c_str());
88
- }
89
-
data/rice/String.hpp DELETED
@@ -1,91 +0,0 @@
1
- #ifndef Rice__String__hpp_
2
- #define Rice__String__hpp_
3
-
4
- #include "Identifier.hpp"
5
- #include "Builtin_Object_defn.hpp"
6
- #include "to_from_ruby_defn.hpp"
7
- #include "detail/ruby.hpp"
8
- #include <string>
9
-
10
- namespace Rice
11
- {
12
-
13
- //! A Wraper for the ruby String class.
14
- /*! This class provides a C++-style interface to ruby's String class and
15
- * its associated rb_str_* functions.
16
- *
17
- * Example:
18
- * \code
19
- * String s(String::format("%s: %d", "foo", 42));
20
- * std::cout << s.length() << std::endl;
21
- * \endcode
22
- */
23
- class String
24
- : public Builtin_Object<T_STRING>
25
- {
26
- public:
27
- //! Construct a new string.
28
- String();
29
-
30
- //! Wrap an existing string.
31
- String(VALUE v);
32
-
33
- //! Wrap an existing string.
34
- String(Object v);
35
-
36
- //! Construct a String from an Identifier.
37
- String(Identifier id);
38
-
39
- //! Construct a String from a null-terminated C string.
40
- String(char const * s);
41
-
42
- //! Construct a String from an std::string.
43
- String(std::string const & s);
44
-
45
- //! Format a string using printf-style formatting.
46
- static String format(char const * s, ...);
47
-
48
- //! Get the length of the String.
49
- /*! \return the length of the string.
50
- */
51
- size_t length() const;
52
-
53
- //! Get the character at the given index.
54
- /*! \param index the desired index.
55
- * \return the character at the given index.
56
- */
57
- char operator[](ptrdiff_t index) const;
58
-
59
- //! Return a pointer to the beginning of the underlying C string.
60
- char const * c_str() const;
61
-
62
- //! Return a copy of the string as an std::string.
63
- std::string str() const;
64
-
65
- //! Create an Identifier from the String.
66
- /*! Calls rb_intern to create an ID.
67
- * \return an Identifier holding the ID returned from rb_intern.
68
- */
69
- Identifier intern() const;
70
- };
71
-
72
- } // namespace Rice
73
-
74
- template<>
75
- inline
76
- Rice::String from_ruby<Rice::String>(Rice::Object x)
77
- {
78
- return Rice::String(x);
79
- }
80
-
81
- template<>
82
- inline
83
- Rice::Object to_ruby<Rice::String>(Rice::String const & x)
84
- {
85
- return x;
86
- }
87
-
88
- #include "Builtin_Object.ipp"
89
-
90
- #endif // Rice__String__hpp_
91
-
data/rice/Struct.cpp DELETED
@@ -1,117 +0,0 @@
1
- #include "Struct.hpp"
2
- #include "Symbol.hpp"
3
-
4
- #include <stdexcept>
5
-
6
- Rice::Struct::
7
- Struct()
8
- : Module_impl<Class, Struct>(rb_cObject)
9
- , members_()
10
- , members_guard_(&members_)
11
- , member_offset_()
12
- , member_offset_guard_(&member_offset_)
13
- {
14
- }
15
-
16
- Rice::Struct::
17
- Struct(Rice::Struct const & s)
18
- : Module_impl<Class, Struct>(s)
19
- , members_(s.members_.value())
20
- , members_guard_(&members_)
21
- , member_offset_(s.member_offset_.value())
22
- , member_offset_guard_(&member_offset_)
23
- {
24
- }
25
-
26
- Rice::Struct::
27
- ~Struct()
28
- {
29
- }
30
-
31
- Rice::Struct & Rice::Struct::
32
- initialize(
33
- Module module,
34
- Identifier name)
35
- {
36
- Class struct_class(rb_cStruct);
37
- Object type = struct_class.vcall("new", members_);
38
-
39
- set_value(type);
40
- module.const_set(name, type);
41
-
42
- return *this;
43
- }
44
-
45
- Rice::Struct & Rice::Struct::
46
- define_member(
47
- Identifier name)
48
- {
49
- if(value() != rb_cObject)
50
- {
51
- throw std::runtime_error("struct is already initialized");
52
- }
53
-
54
- // TODO: not exception-safe
55
- Symbol ruby_name(name);
56
- member_offset_[ruby_name] = members_.size();
57
- members_.push(ruby_name);
58
-
59
- return *this;
60
- }
61
-
62
- unsigned long Rice::Struct::
63
- offset_of(Identifier name) const
64
- {
65
- Symbol ruby_name(name);
66
- return from_ruby<unsigned long>(member_offset_[ruby_name]);
67
- }
68
-
69
- void Rice::Struct::
70
- swap(Rice::Struct & other)
71
- {
72
- members_.swap(other.members_);
73
- members_guard_.swap(other.members_guard_);
74
- member_offset_.swap(other.member_offset_);
75
- member_offset_guard_.swap(other.member_offset_guard_);
76
- Class::swap(other);
77
- }
78
-
79
- Rice::Struct::Instance
80
- Rice::Struct::
81
- new_instance(Array args) const
82
- {
83
- Object instance = const_cast<Struct *>(this)->vcall("new", args);
84
- return Instance(*this, instance);
85
- }
86
-
87
- Rice::Struct::Instance::
88
- Instance(
89
- Struct const & type,
90
- Array args)
91
- : Builtin_Object<T_STRUCT>(type.new_instance(args))
92
- , type_(type)
93
- {
94
- }
95
-
96
- Rice::Struct::Instance::
97
- Instance(
98
- Struct const & type,
99
- Object s)
100
- : Builtin_Object<T_STRUCT>(s)
101
- , type_(type)
102
- {
103
- }
104
-
105
- void Rice::Struct::Instance::
106
- swap(Instance & other)
107
- {
108
- type_.swap(other.type_);
109
- Builtin_Object<T_STRUCT>::swap(other);
110
- }
111
-
112
- Rice::Struct Rice::
113
- define_struct()
114
- {
115
- return Struct();
116
- }
117
-
data/rice/Struct.hpp DELETED
@@ -1,162 +0,0 @@
1
- #ifndef Rice__ruby_struct__hpp_
2
- #define Rice__ruby_struct__hpp_
3
-
4
- #include "Array.hpp"
5
- #include "Hash.hpp"
6
- #include "Module.hpp"
7
- #include "Class.hpp"
8
- #include "Builtin_Object.hpp"
9
- #include "Address_Registration_Guard.hpp"
10
-
11
- namespace Rice
12
- {
13
- class Struct;
14
-
15
- //! Define a new Struct
16
- Struct define_struct();
17
-
18
- //! A wrapper for creating Struct classes.
19
- /*! The Struct class is used for creating new Classes. Note that the
20
- * notation used here differs slightly from the notation inside the
21
- * interpreter.
22
- *
23
- * Inside the interpreter, calling Struct.new creates a new Class:
24
- * \code
25
- * irb(main):001:0> MyStruct = Struct.new(:a, :b, :c)
26
- * => S
27
- * irb(main):002:0> MyStruct.class
28
- * => Class
29
- * \endcode
30
- *
31
- * Instantiating that Class creates an instance of that Class:
32
- * \code
33
- * irb(main):003:0> mystruct_instance = MyStruct.new
34
- * => #<struct MyStruct a=nil, b=nil, c=nil>
35
- * irb(main):004:0> mystruct_instance.class
36
- * => MyStruct
37
- * irb(main):005:0> mystruct_instance.class.ancestors
38
- * => [MyStruct, Struct, Enumerable, Object, Kernel]
39
- * \endcode
40
- *
41
- * Thus, inside the interpreter, MyStruct is a Class which inherits
42
- * from Struct, and mystruct_instance is an instance of MyStruct.
43
- *
44
- * At the C++ level, we might do this instead:
45
- * \code
46
- * Struct rb_cMyStruct = define_struct()
47
- * .define_member("a")
48
- * .define_member("b")
49
- * .define_member("c")
50
- * .initialize("MyStruct");
51
- * Struct::Instance mystruct_instance(rb_cMyStruct.new_instance());
52
- * \endcode
53
- *
54
- * Here rb_cMyStruct is an instance of Struct and that mystruct_instance
55
- * is an instance of Struct::Instance.
56
- */
57
- class Struct
58
- : public Module_impl<Class, Struct>
59
- {
60
- public:
61
- //! Create a new Struct.
62
- Struct();
63
-
64
- //! Copy constructor.
65
- Struct(Struct const & s);
66
-
67
- //! Destructor.
68
- virtual ~Struct();
69
-
70
- //! Define a new Struct member.
71
- /*! Defines a new member of the Struct. Must be called before the
72
- * Struct is initialized.
73
- * \return *this
74
- */
75
- Struct & define_member(
76
- Identifier name);
77
-
78
- //! Initialize the Struct class.
79
- /*! Must be called after all Struct members have been defined.
80
- * \param module the module under which to define the Struct.
81
- * \param name the name of the Class at the ruby level.
82
- */
83
- Struct & initialize(
84
- Module module,
85
- Identifier name);
86
-
87
- //! Get the offset of a member in the Struct.
88
- /*! Internally, Struct members are stored as a single array of VALUE.
89
- * This function determines the offset of a given member in that
90
- * array.
91
- * \param member the name of the desired member.
92
- * \return the index of the given member.
93
- */
94
- unsigned long offset_of(Identifier name) const;
95
-
96
- class Instance;
97
- friend class Instance;
98
- friend Struct Rice::define_struct();
99
-
100
- //! Create a new instance of the Struct
101
- /*! \param args the arguments to the constructor.
102
- * \return a new Struct::Instance
103
- */
104
- Instance new_instance(Array args = Array()) const;
105
-
106
- //! Swap with another Struct.
107
- void swap(Struct & other);
108
-
109
- Array members() const { return members_; }
110
-
111
- private:
112
- Array members_;
113
- Address_Registration_Guard members_guard_;
114
-
115
- Hash member_offset_;
116
- Address_Registration_Guard member_offset_guard_;
117
- };
118
-
119
-
120
- //! An instance of a Struct
121
- //! \sa Struct
122
- class Struct::Instance
123
- : public Builtin_Object<T_STRUCT>
124
- {
125
- public:
126
- //! Create a new Instance of a Struct.
127
- /*! \param type the Struct type to create.
128
- * \param args the initial values for the objects of the instance.
129
- */
130
- Instance(
131
- Struct const & type,
132
- Array args = Array());
133
-
134
- //! Encapsulate an existing Struct instance.
135
- /*! \param type the Struct type to encapsulate.
136
- * \param s the instance to encapsulate.
137
- */
138
- Instance(
139
- Struct const & type,
140
- Object s);
141
-
142
- //! Get a member, given its offset.
143
- /*! \param index the (integral) index into the Struct's internal
144
- * array or its name (an Identifier or char const *)
145
- * \return the member.
146
- */
147
- template<typename T>
148
- Object operator[](T index);
149
-
150
- //! Swap with another Struct::Instance.
151
- void swap(Instance & other);
152
-
153
- private:
154
- Struct type_;
155
- };
156
-
157
- } // namespace Rice
158
-
159
- #include "Struct.ipp"
160
-
161
- #endif // Rice__ruby_struct__hpp_
162
-