rice 3.0.0 → 4.0.0

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