rice 2.1.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/COPYING +2 -2
  5. data/Gemfile +3 -0
  6. data/README.md +69 -0
  7. data/Rakefile +95 -12
  8. data/include/rice/rice.hpp +7766 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +30 -376
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +14 -9
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -49
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +6 -0
  71. data/sample/callbacks/sample_callbacks.cpp +35 -0
  72. data/sample/callbacks/test.rb +28 -0
  73. data/sample/enum/extconf.rb +3 -0
  74. data/sample/enum/sample_enum.cpp +3 -17
  75. data/sample/enum/test.rb +2 -2
  76. data/sample/inheritance/animals.cpp +8 -24
  77. data/sample/inheritance/extconf.rb +3 -0
  78. data/sample/inheritance/test.rb +1 -1
  79. data/sample/map/extconf.rb +3 -0
  80. data/sample/map/map.cpp +10 -18
  81. data/sample/map/test.rb +1 -1
  82. data/test/embed_ruby.cpp +34 -0
  83. data/test/embed_ruby.hpp +4 -0
  84. data/test/ext/t1/extconf.rb +3 -0
  85. data/test/ext/t1/t1.cpp +1 -3
  86. data/test/ext/t2/extconf.rb +3 -0
  87. data/test/ext/t2/t2.cpp +1 -1
  88. data/test/extconf.rb +23 -0
  89. data/test/ruby/test_callbacks_sample.rb +28 -0
  90. data/test/ruby/test_multiple_extensions.rb +18 -0
  91. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  92. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  93. data/test/test_Address_Registration_Guard.cpp +25 -11
  94. data/test/test_Array.cpp +131 -74
  95. data/test/test_Attribute.cpp +147 -0
  96. data/test/test_Builtin_Object.cpp +36 -15
  97. data/test/test_Class.cpp +151 -274
  98. data/test/test_Constructor.cpp +10 -9
  99. data/test/test_Data_Object.cpp +135 -193
  100. data/test/test_Data_Type.cpp +323 -252
  101. data/test/test_Director.cpp +56 -42
  102. data/test/test_Enum.cpp +230 -104
  103. data/test/test_Exception.cpp +7 -7
  104. data/test/test_Hash.cpp +33 -31
  105. data/test/test_Identifier.cpp +6 -6
  106. data/test/test_Inheritance.cpp +221 -0
  107. data/test/test_Iterator.cpp +161 -0
  108. data/test/test_Jump_Tag.cpp +1 -1
  109. data/test/test_Keep_Alive.cpp +161 -0
  110. data/test/test_Memory_Management.cpp +4 -5
  111. data/test/test_Module.cpp +169 -111
  112. data/test/test_Object.cpp +51 -19
  113. data/test/test_Ownership.cpp +275 -0
  114. data/test/test_Self.cpp +205 -0
  115. data/test/test_Stl_Optional.cpp +90 -0
  116. data/test/test_Stl_Pair.cpp +144 -0
  117. data/test/test_Stl_SmartPointer.cpp +200 -0
  118. data/test/test_Stl_String.cpp +74 -0
  119. data/test/test_Stl_Vector.cpp +652 -0
  120. data/test/test_String.cpp +3 -3
  121. data/test/test_Struct.cpp +31 -40
  122. data/test/test_Symbol.cpp +3 -3
  123. data/test/test_To_From_Ruby.cpp +283 -218
  124. data/test/test_global_functions.cpp +41 -20
  125. data/test/unittest.cpp +34 -8
  126. data/test/unittest.hpp +0 -4
  127. metadata +117 -137
  128. data/Doxyfile +0 -2280
  129. data/Makefile.am +0 -26
  130. data/Makefile.in +0 -920
  131. data/README +0 -1055
  132. data/README.mingw +0 -8
  133. data/aclocal.m4 +0 -1088
  134. data/bootstrap +0 -8
  135. data/check_stdcxx_11.ac +0 -142
  136. data/config.guess +0 -1421
  137. data/config.sub +0 -1807
  138. data/configure +0 -7481
  139. data/configure.ac +0 -55
  140. data/depcomp +0 -791
  141. data/doxygen.ac +0 -314
  142. data/doxygen.am +0 -186
  143. data/extconf.rb +0 -69
  144. data/install-sh +0 -501
  145. data/missing +0 -215
  146. data/post-autoconf.rb +0 -22
  147. data/post-automake.rb +0 -28
  148. data/rice/Address_Registration_Guard.cpp +0 -22
  149. data/rice/Arg_impl.hpp +0 -129
  150. data/rice/Arg_operators.cpp +0 -21
  151. data/rice/Arg_operators.hpp +0 -19
  152. data/rice/Array.hpp +0 -214
  153. data/rice/Array.ipp +0 -256
  154. data/rice/Builtin_Object.hpp +0 -8
  155. data/rice/Builtin_Object.ipp +0 -50
  156. data/rice/Builtin_Object_defn.hpp +0 -50
  157. data/rice/Class.cpp +0 -57
  158. data/rice/Class.hpp +0 -8
  159. data/rice/Class.ipp +0 -6
  160. data/rice/Class_defn.hpp +0 -83
  161. data/rice/Data_Type.cpp +0 -54
  162. data/rice/Data_Type_fwd.hpp +0 -12
  163. data/rice/Director.cpp +0 -13
  164. data/rice/Exception.cpp +0 -59
  165. data/rice/Exception_Base.hpp +0 -8
  166. data/rice/Exception_Base.ipp +0 -13
  167. data/rice/Exception_Base_defn.hpp +0 -27
  168. data/rice/Hash.hpp +0 -227
  169. data/rice/Hash.ipp +0 -329
  170. data/rice/Identifier.cpp +0 -8
  171. data/rice/Jump_Tag.hpp +0 -24
  172. data/rice/Makefile.am +0 -124
  173. data/rice/Makefile.in +0 -839
  174. data/rice/Module.cpp +0 -84
  175. data/rice/Module.hpp +0 -8
  176. data/rice/Module.ipp +0 -6
  177. data/rice/Module_defn.hpp +0 -88
  178. data/rice/Module_impl.hpp +0 -281
  179. data/rice/Module_impl.ipp +0 -345
  180. data/rice/Object.cpp +0 -169
  181. data/rice/Object.hpp +0 -8
  182. data/rice/Object.ipp +0 -19
  183. data/rice/Object_defn.hpp +0 -191
  184. data/rice/Require_Guard.hpp +0 -21
  185. data/rice/String.cpp +0 -94
  186. data/rice/String.hpp +0 -91
  187. data/rice/Struct.cpp +0 -117
  188. data/rice/Struct.hpp +0 -162
  189. data/rice/Struct.ipp +0 -26
  190. data/rice/Symbol.cpp +0 -25
  191. data/rice/Symbol.hpp +0 -66
  192. data/rice/Symbol.ipp +0 -44
  193. data/rice/config.hpp +0 -47
  194. data/rice/config.hpp.in +0 -46
  195. data/rice/detail/Arguments.hpp +0 -118
  196. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  197. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3694
  198. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  199. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2774
  200. data/rice/detail/Caster.hpp +0 -103
  201. data/rice/detail/Not_Copyable.hpp +0 -25
  202. data/rice/detail/Wrapped_Function.hpp +0 -33
  203. data/rice/detail/cfp.hpp +0 -24
  204. data/rice/detail/cfp.ipp +0 -51
  205. data/rice/detail/check_ruby_type.cpp +0 -27
  206. data/rice/detail/check_ruby_type.hpp +0 -23
  207. data/rice/detail/creation_funcs.hpp +0 -37
  208. data/rice/detail/creation_funcs.ipp +0 -36
  209. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  210. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  211. data/rice/detail/demangle.cpp +0 -56
  212. data/rice/detail/demangle.hpp +0 -19
  213. data/rice/detail/env.hpp +0 -11
  214. data/rice/detail/method_data.cpp +0 -86
  215. data/rice/detail/node.hpp +0 -13
  216. data/rice/detail/object_call.hpp +0 -69
  217. data/rice/detail/object_call.ipp +0 -131
  218. data/rice/detail/protect.cpp +0 -29
  219. data/rice/detail/protect.hpp +0 -34
  220. data/rice/detail/ruby_version_code.hpp +0 -6
  221. data/rice/detail/ruby_version_code.hpp.in +0 -6
  222. data/rice/detail/st.hpp +0 -22
  223. data/rice/detail/traits.hpp +0 -43
  224. data/rice/detail/win32.hpp +0 -16
  225. data/rice/detail/wrap_function.hpp +0 -341
  226. data/rice/detail/wrap_function.ipp +0 -514
  227. data/rice/protect.hpp +0 -92
  228. data/rice/protect.ipp +0 -1134
  229. data/rice/rubypp.rb +0 -97
  230. data/rice/to_from_ruby.hpp +0 -8
  231. data/rice/to_from_ruby.ipp +0 -294
  232. data/rice/to_from_ruby_defn.hpp +0 -70
  233. data/ruby.ac +0 -135
  234. data/ruby/Makefile.am +0 -1
  235. data/ruby/Makefile.in +0 -625
  236. data/ruby/lib/Makefile.am +0 -3
  237. data/ruby/lib/Makefile.in +0 -503
  238. data/ruby/lib/mkmf-rice.rb.in +0 -217
  239. data/ruby/lib/version.rb +0 -3
  240. data/sample/Makefile.am +0 -47
  241. data/sample/Makefile.in +0 -486
  242. data/test/Makefile.am +0 -72
  243. data/test/Makefile.in +0 -1150
  244. data/test/ext/Makefile.am +0 -41
  245. data/test/ext/Makefile.in +0 -480
  246. data/test/test_rice.rb +0 -41
data/rice/Hash.hpp DELETED
@@ -1,227 +0,0 @@
1
- #ifndef Rice__Hash__hpp_
2
- #define Rice__Hash__hpp_
3
-
4
- #include "Builtin_Object_defn.hpp"
5
- #include "Array.hpp"
6
- #include "to_from_ruby_defn.hpp"
7
- #include "detail/ruby.hpp"
8
- #include "detail/traits.hpp"
9
- #include <iterator>
10
-
11
- namespace Rice
12
- {
13
-
14
- //! A wrapper for the ruby Hash class.
15
- //! This class provides a C++-style interface to ruby's Hash class and
16
- //! its associated rb_hash_* functions.
17
- //! Example:
18
- //! \code
19
- //! Hash h;
20
- //! h[42] = String("foo");
21
- //! h[10] = String("bar");
22
- //! std::cout << String(h[42]) << std::endl;
23
- //! \endcode
24
- class Hash
25
- : public Builtin_Object<T_HASH>
26
- {
27
- public:
28
- //! Construct a new hash.
29
- Hash();
30
-
31
- //! Wrap an existing hash.
32
- /*! \param v the hash to wrap.
33
- */
34
- Hash(Object v);
35
-
36
- //! Return the number of elements in the hash.
37
- size_t size() const;
38
-
39
- private:
40
- //! A helper class so hash[key]=value can work.
41
- class Proxy;
42
-
43
- public:
44
- //! Get the value for the given key.
45
- /*! \param key the key whose value should be retrieved from the hash.
46
- * \return the value associated with the given key.
47
- */
48
- template<typename Key_T>
49
- Proxy const operator[](Key_T const & key) const;
50
-
51
- //! Get the value for the given key.
52
- /*! \param key the key whose value should be retrieved from the hash.
53
- * \return the value associated with the given key.
54
- */
55
- template<typename Key_T>
56
- Proxy operator[](Key_T const & key);
57
-
58
- //! Get the value for the given key
59
- /*! The returned value is converted to the type given by Value_T.
60
- * \param key the key whose value should be retrieved from the hash.
61
- * \return the value associated with the given key, converted to C++
62
- * type Value_T.
63
- */
64
- template<typename Value_T, typename Key_T>
65
- Value_T get(Key_T const & key);
66
-
67
- //! A helper class for dereferencing iterators
68
- class Entry;
69
-
70
- //! A helper class for implementing iterators for a Hash.
71
- template<typename Hash_Ref_T, typename Value_T>
72
- class Iterator;
73
-
74
- public:
75
- //! An iterator.
76
- typedef Iterator<Hash &, Entry> iterator;
77
-
78
- //! A const iterator.
79
- typedef Iterator<Hash const &, Entry const> const_iterator;
80
-
81
- public:
82
- //! Return an iterator to the beginning of the hash.
83
- iterator begin();
84
-
85
- //! Return a const iterator to the beginning of the hash.
86
- const_iterator begin() const;
87
-
88
- //! Return an iterator to the end of the hash.
89
- iterator end();
90
-
91
- //! Return a const to the end of the hash.
92
- const_iterator end() const;
93
- };
94
-
95
- //! A helper class so hash[key]=value can work.
96
- class Hash::Proxy
97
- {
98
- public:
99
- //! Construct a new Proxy.
100
- Proxy(Hash hash, Object key);
101
-
102
- //! Implicit conversion to Object.
103
- operator Object() const;
104
-
105
- //! Explicit conversion to VALUE.
106
- VALUE value() const;
107
-
108
- //! Assignment operator.
109
- template<typename T>
110
- Object operator=(T const & value);
111
-
112
- void swap(Proxy & proxy);
113
-
114
- private:
115
- Hash hash_;
116
- Object key_;
117
- };
118
-
119
- //! A helper class for dereferencing iterators
120
- /*! This class is intended to look similar to an std::pair.
121
- */
122
- class Hash::Entry
123
- {
124
- public:
125
- //! Construct a new Entry.
126
- Entry(Hash hash, Object key);
127
-
128
- //! Copy constructor.
129
- Entry(Entry const & entry);
130
-
131
- Object const key; //!< The key
132
- Object const & first; //!< An alias for the key
133
-
134
- Proxy value; //!< The value
135
- Proxy & second; //!< An alias for the value
136
-
137
- Entry & operator=(Entry const & rhs);
138
-
139
- void swap(Entry & entry);
140
-
141
- friend bool operator<(Entry const & lhs, Entry const & rhs);
142
- };
143
-
144
- bool operator<(Hash::Entry const & lhs, Hash::Entry const & rhs);
145
-
146
- //! A helper class for implementing iterators for a Hash.
147
- template<typename Hash_Ref_T, typename Value_T>
148
- class Hash::Iterator
149
- : public std::iterator<
150
- std::input_iterator_tag,
151
- Value_T>
152
- {
153
- public:
154
- //! Construct a new Iterator.
155
- Iterator(Hash_Ref_T hash);
156
-
157
- //! Construct a new Iterator with a given start-at index point
158
- Iterator(Hash_Ref_T hash, int start_at);
159
-
160
- //! Copy construct an Iterator.
161
- Iterator(Iterator const & iterator);
162
-
163
- //! Construct an Iterator from another Iterator of a different const
164
- //! qualification.
165
- template<typename Iterator_T>
166
- Iterator(Iterator_T const & iterator);
167
-
168
- //! Assignment operator.
169
- Iterator & operator=(Iterator const & rhs);
170
-
171
- //! Preincrement operator.
172
- Iterator & operator++();
173
-
174
- //! Postincrement operator.
175
- Iterator operator++(int);
176
-
177
- //! Dereference operator.
178
- Value_T operator*();
179
-
180
- //! Dereference operator.
181
- Value_T * operator->();
182
-
183
- //! Equality operator.
184
- bool operator==(Iterator const & rhs) const;
185
-
186
- //! Inequality operator.
187
- bool operator!=(Iterator const & rhs) const;
188
-
189
- template<typename Hash_Ref_T_, typename Value_T_>
190
- friend class Hash::Iterator;
191
-
192
- //! Swap with another iterator of the same type.
193
- void swap(Iterator & iterator);
194
-
195
- protected:
196
- Object current_key();
197
-
198
- Array hash_keys();
199
-
200
- private:
201
- Hash hash_;
202
- size_t current_index_;
203
- VALUE keys_;
204
-
205
- mutable typename detail::remove_const<Value_T>::Type tmp_;
206
- };
207
-
208
- } // namespace Rice
209
-
210
- template<>
211
- inline
212
- Rice::Hash from_ruby<Rice::Hash>(Rice::Object x)
213
- {
214
- return Rice::Hash(x);
215
- }
216
-
217
- template<>
218
- inline
219
- Rice::Object to_ruby<Rice::Hash>(Rice::Hash const & x)
220
- {
221
- return x;
222
- }
223
-
224
- #include "Hash.ipp"
225
-
226
- #endif // Rice__Hash__hpp_
227
-
data/rice/Hash.ipp DELETED
@@ -1,329 +0,0 @@
1
- #ifndef Rice__Hash__ipp_
2
- #define Rice__Hash__ipp_
3
-
4
- #include "protect.hpp"
5
- #include "to_from_ruby.hpp"
6
- #include "Exception.hpp"
7
- #include "Builtin_Object.hpp"
8
- #include "detail/st.hpp"
9
- #include <algorithm>
10
-
11
- inline Rice::Hash::
12
- Hash()
13
- : Builtin_Object<T_HASH>(protect(rb_hash_new))
14
- {
15
- }
16
-
17
- inline Rice::Hash::
18
- Hash(Object v)
19
- : Builtin_Object<T_HASH>(v)
20
- {
21
- }
22
-
23
- inline size_t Rice::Hash::
24
- size() const
25
- {
26
- return RHASH_SIZE(this->value());
27
- }
28
-
29
- inline Rice::Hash::Proxy::
30
- Proxy(Hash hash, Object key)
31
- : hash_(hash)
32
- , key_(key)
33
- {
34
- }
35
-
36
- /*
37
- inline Rice::Hash::Proxy::
38
- operator VALUE() const
39
- {
40
- return value();
41
- }
42
- */
43
-
44
- inline Rice::Hash::Proxy::
45
- operator Rice::Object() const
46
- {
47
- return value();
48
- }
49
-
50
- inline VALUE Rice::Hash::Proxy::
51
- value() const
52
- {
53
- return protect(rb_hash_aref, hash_, key_);
54
- }
55
-
56
- template<typename T>
57
- inline Rice::Object Rice::Hash::Proxy::
58
- operator=(T const & value)
59
- {
60
- return protect(rb_hash_aset, hash_, key_, to_ruby(value));
61
- }
62
-
63
- inline void Rice::Hash::Proxy::
64
- swap(Proxy & proxy)
65
- {
66
- hash_.swap(proxy.hash_);
67
- key_.swap(proxy.key_);
68
- }
69
-
70
- template<typename Key_T>
71
- inline Rice::Hash::Proxy const Rice::Hash::
72
- operator[](Key_T const & key) const
73
- {
74
- return Proxy(*this, to_ruby(key));
75
- }
76
-
77
- template<typename Key_T>
78
- inline Rice::Hash::Proxy Rice::Hash::
79
- operator[](Key_T const & key)
80
- {
81
- return Proxy(*this, to_ruby(key));
82
- }
83
-
84
- template<typename Value_T, typename Key_T>
85
- inline Value_T Rice::Hash::
86
- get(Key_T const & key)
87
- {
88
- Object ruby_key(to_ruby(key));
89
- Object value = operator[](ruby_key);
90
- try
91
- {
92
- return from_ruby<Value_T>(value);
93
- }
94
- catch(Exception const & ex)
95
- {
96
- String s_key(ruby_key.to_s());
97
- throw Exception(
98
- ex,
99
- "%s while converting value for key %s",
100
- ex.what(),
101
- s_key.c_str());
102
- }
103
- }
104
-
105
- inline Rice::Hash::Entry::
106
- Entry(Hash hash, Object key)
107
- : key(key)
108
- , first(Hash::Entry::key)
109
- , value(hash, key)
110
- , second(Hash::Entry::value)
111
- {
112
- }
113
-
114
- inline Rice::Hash::Entry::
115
- Entry(Entry const & entry)
116
- : key(entry.key)
117
- , first(Hash::Entry::key)
118
- , value(entry.value)
119
- , second(Hash::Entry::value)
120
- {
121
- }
122
-
123
- inline Rice::Hash::Entry & Rice::Hash::Entry::
124
- operator=(Rice::Hash::Entry const & rhs)
125
- {
126
- Entry tmp(rhs);
127
- swap(tmp);
128
- return *this;
129
- }
130
-
131
- inline void Rice::Hash::Entry::
132
- swap(Rice::Hash::Entry & entry)
133
- {
134
- const_cast<Object &>(key).swap(const_cast<Object &>(entry.key));
135
- value.swap(entry.value);
136
- }
137
-
138
- template<typename Hash_Ref_T, typename Value_T>
139
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
140
- Iterator(Hash_Ref_T hash)
141
- : hash_(hash)
142
- , current_index_(0)
143
- , keys_(Qnil)
144
- , tmp_(hash, Qnil)
145
- {
146
- }
147
-
148
- template<typename Hash_Ref_T, typename Value_T>
149
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
150
- Iterator(Hash_Ref_T hash, int start_at)
151
- : hash_(hash)
152
- , current_index_(start_at)
153
- , keys_(Qnil)
154
- , tmp_(hash, Qnil)
155
- {
156
- }
157
-
158
- template<typename Hash_Ref_T, typename Value_T>
159
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
160
- Iterator(Iterator const & iterator)
161
- : hash_(iterator.hash_.value())
162
- , current_index_(iterator.current_index_)
163
- , keys_(Qnil)
164
- , tmp_(iterator.hash_, Qnil)
165
- {
166
- }
167
-
168
- template<typename Hash_Ref_T, typename Value_T>
169
- template<typename Iterator_T>
170
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
171
- Iterator(Iterator_T const & iterator)
172
- : hash_(iterator.hash_.value())
173
- , current_index_(iterator.current_index_)
174
- , keys_(Qnil)
175
- , tmp_(iterator.hash_, Qnil)
176
- {
177
- }
178
-
179
- template<typename Hash_Ref_T, typename Value_T>
180
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T> &
181
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
182
- operator=(Iterator const & iterator)
183
- {
184
- Iterator tmp(iterator);
185
-
186
- this->swap(tmp);
187
-
188
- return *this;
189
- }
190
-
191
- template<typename Hash_Ref_T, typename Value_T>
192
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T> &
193
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
194
- operator++()
195
- {
196
- // Ensure we're within the range
197
- if(current_index_ < hash_keys().size()) {
198
- current_index_++;
199
- }
200
-
201
- return *this;
202
- }
203
-
204
- template<typename Hash_Ref_T, typename Value_T>
205
- inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>
206
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
207
- operator++(int)
208
- {
209
- Iterator copy(*this);
210
- ++(*this);
211
- return copy;
212
- }
213
-
214
- template<typename Hash_Ref_T, typename Value_T>
215
- inline Value_T
216
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
217
- operator*()
218
- {
219
- return Value_T(hash_, current_key());
220
- }
221
-
222
- template<typename Hash_Ref_T, typename Value_T>
223
- inline Value_T *
224
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
225
- operator->()
226
- {
227
- Entry tmp(hash_, current_key());
228
- this->tmp_.swap(tmp);
229
- return &tmp_;
230
- }
231
-
232
- template<typename Hash_Ref_T, typename Value_T>
233
- inline bool Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
234
- operator==(Iterator const & rhs) const
235
- {
236
- return hash_.value() == rhs.hash_.value()
237
- && current_index_ == rhs.current_index_;
238
- }
239
-
240
- template<typename Hash_Ref_T, typename Value_T>
241
- inline bool Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
242
- operator!=(Iterator const & rhs) const
243
- {
244
- return !(*this == rhs);
245
- }
246
-
247
- template<typename Hash_Ref_T, typename Value_T>
248
- inline void
249
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
250
- swap(Iterator& iterator)
251
- {
252
- using namespace std;
253
-
254
- hash_.swap(iterator.hash_);
255
- swap(keys_, iterator.keys_);
256
- swap(current_index_, iterator.current_index_);
257
- }
258
-
259
- template<typename Hash_Ref_T, typename Value_T>
260
- inline Rice::Object
261
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
262
- current_key()
263
- {
264
- return hash_keys()[current_index_];
265
- }
266
-
267
-
268
- template<typename Hash_Ref_T, typename Value_T>
269
- inline Rice::Array
270
- Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
271
- hash_keys()
272
- {
273
- if(NIL_P(keys_)) {
274
- keys_ = rb_funcall(hash_, rb_intern("keys"), 0, 0);
275
- }
276
-
277
- return Rice::Array(keys_);
278
- }
279
-
280
- inline Rice::Hash::iterator Rice::Hash::
281
- begin()
282
- {
283
- return iterator(*this);
284
- }
285
-
286
- inline Rice::Hash::const_iterator Rice::Hash::
287
- begin() const
288
- {
289
- return const_iterator(*this);
290
- }
291
-
292
- inline Rice::Hash::iterator Rice::Hash::
293
- end()
294
- {
295
- return iterator(*this, (int)size());
296
- }
297
-
298
- inline Rice::Hash::const_iterator Rice::Hash::
299
- end() const
300
- {
301
- return const_iterator(*this, (int)size());
302
- }
303
-
304
- inline bool Rice::
305
- operator<(
306
- Hash::Entry const & lhs, Hash::Entry const & rhs)
307
- {
308
- Object lhs_key(lhs.key);
309
- Object rhs_key(rhs.key);
310
- if(lhs_key < rhs_key)
311
- {
312
- return true;
313
- }
314
- else if(lhs_key > rhs_key)
315
- {
316
- return false;
317
- }
318
- else if(Object(lhs.value.value()) < Object(rhs.value.value()))
319
- {
320
- return true;
321
- }
322
- else
323
- {
324
- return false;
325
- }
326
- }
327
-
328
- #endif // Rice__Hash__ipp_
329
-