rice 1.4.3 → 1.5.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 (54) hide show
  1. data/COPYING +2 -2
  2. data/Doxyfile +1 -1
  3. data/Makefile.in +296 -166
  4. data/README +18 -13
  5. data/Rakefile +3 -2
  6. data/aclocal.m4 +375 -248
  7. data/config.guess +296 -261
  8. data/config.sub +268 -94
  9. data/configure +2789 -3054
  10. data/configure.ac +1 -1
  11. data/depcomp +403 -197
  12. data/extconf.rb +14 -3
  13. data/install-sh +139 -119
  14. data/missing +154 -306
  15. data/rice/Builtin_Object_defn.hpp +0 -1
  16. data/rice/Constructor.hpp +31 -30
  17. data/rice/Data_Object_defn.hpp +8 -2
  18. data/rice/Hash.hpp +26 -9
  19. data/rice/Hash.ipp +52 -60
  20. data/rice/Makefile.am +0 -1
  21. data/rice/Makefile.in +278 -152
  22. data/rice/Module_impl.ipp +1 -1
  23. data/rice/VM.cpp +1 -11
  24. data/rice/config.hpp +3 -0
  25. data/rice/config.hpp.in +3 -0
  26. data/rice/detail/Auto_Function_Wrapper.hpp +69 -0
  27. data/rice/detail/Auto_Function_Wrapper.ipp +815 -512
  28. data/rice/detail/Auto_Member_Function_Wrapper.hpp +69 -0
  29. data/rice/detail/Auto_Member_Function_Wrapper.ipp +543 -272
  30. data/rice/detail/object_call.hpp +1 -0
  31. data/rice/detail/ruby.hpp +0 -9
  32. data/rice/detail/ruby_version_code.hpp +1 -1
  33. data/rice/detail/st.hpp +0 -38
  34. data/rice/protect.hpp +1 -0
  35. data/rice/protect.ipp +1 -0
  36. data/rice/to_from_ruby.ipp +1 -1
  37. data/ruby.ac +2 -2
  38. data/ruby/Makefile.in +221 -134
  39. data/ruby/lib/Makefile.in +133 -44
  40. data/ruby/lib/mkmf-rice.rb.in +1 -4
  41. data/ruby/lib/version.rb +1 -1
  42. data/sample/Makefile.in +96 -31
  43. data/test/Makefile.am +0 -1
  44. data/test/Makefile.in +617 -219
  45. data/test/ext/Makefile.in +96 -31
  46. data/test/test_Class.cpp +2 -2
  47. data/test/test_Data_Object.cpp +11 -11
  48. data/test/test_Hash.cpp +7 -4
  49. data/test/test_Module.cpp +17 -1
  50. data/test/test_To_From_Ruby.cpp +44 -0
  51. data/test/test_rice.rb +2 -2
  52. metadata +29 -43
  53. data/rice/Allocation_Strategies.hpp +0 -37
  54. data/test/test_Allocation_Strategies.cpp +0 -77
@@ -2,7 +2,6 @@
2
2
  #define Rice__Builtin_Object_defn__hpp_
3
3
 
4
4
  #include "Object_defn.hpp"
5
- #include "Allocation_Strategies.hpp"
6
5
  #include "detail/ruby.hpp"
7
6
 
8
7
  namespace Rice
data/rice/Constructor.hpp CHANGED
@@ -41,7 +41,7 @@ namespace Rice
41
41
  }
42
42
  };
43
43
 
44
-
44
+
45
45
  template<typename T, typename Arg0_T>
46
46
  class Constructor<T, Arg0_T, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
47
47
  {
@@ -52,7 +52,7 @@ namespace Rice
52
52
  }
53
53
  };
54
54
 
55
-
55
+
56
56
  template<typename T, typename Arg0_T, typename Arg1_T>
57
57
  class Constructor<T, Arg0_T, Arg1_T, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
58
58
  {
@@ -63,7 +63,7 @@ namespace Rice
63
63
  }
64
64
  };
65
65
 
66
-
66
+
67
67
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T>
68
68
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, void, void, void, void, void, void, void, void, void, void, void, void, void>
69
69
  {
@@ -74,7 +74,7 @@ namespace Rice
74
74
  }
75
75
  };
76
76
 
77
-
77
+
78
78
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T>
79
79
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, void, void, void, void, void, void, void, void, void, void, void, void>
80
80
  {
@@ -85,7 +85,7 @@ namespace Rice
85
85
  }
86
86
  };
87
87
 
88
-
88
+
89
89
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T>
90
90
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, void, void, void, void, void, void, void, void, void, void, void>
91
91
  {
@@ -96,7 +96,7 @@ namespace Rice
96
96
  }
97
97
  };
98
98
 
99
-
99
+
100
100
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T>
101
101
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, void, void, void, void, void, void, void, void, void, void>
102
102
  {
@@ -107,7 +107,7 @@ namespace Rice
107
107
  }
108
108
  };
109
109
 
110
-
110
+
111
111
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T>
112
112
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, void, void, void, void, void, void, void, void, void>
113
113
  {
@@ -118,7 +118,7 @@ namespace Rice
118
118
  }
119
119
  };
120
120
 
121
-
121
+
122
122
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T>
123
123
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, void, void, void, void, void, void, void, void>
124
124
  {
@@ -129,7 +129,7 @@ namespace Rice
129
129
  }
130
130
  };
131
131
 
132
-
132
+
133
133
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T>
134
134
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, void, void, void, void, void, void, void>
135
135
  {
@@ -140,7 +140,7 @@ namespace Rice
140
140
  }
141
141
  };
142
142
 
143
-
143
+
144
144
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T>
145
145
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, void, void, void, void, void, void>
146
146
  {
@@ -151,7 +151,7 @@ namespace Rice
151
151
  }
152
152
  };
153
153
 
154
-
154
+
155
155
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T>
156
156
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, void, void, void, void, void>
157
157
  {
@@ -162,7 +162,7 @@ namespace Rice
162
162
  }
163
163
  };
164
164
 
165
-
165
+
166
166
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T>
167
167
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, void, void, void, void>
168
168
  {
@@ -173,7 +173,7 @@ namespace Rice
173
173
  }
174
174
  };
175
175
 
176
-
176
+
177
177
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T, typename Arg12_T>
178
178
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, Arg12_T, void, void, void>
179
179
  {
@@ -184,7 +184,7 @@ namespace Rice
184
184
  }
185
185
  };
186
186
 
187
-
187
+
188
188
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T, typename Arg12_T, typename Arg13_T>
189
189
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, Arg12_T, Arg13_T, void, void>
190
190
  {
@@ -195,7 +195,7 @@ namespace Rice
195
195
  }
196
196
  };
197
197
 
198
-
198
+
199
199
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T, typename Arg12_T, typename Arg13_T, typename Arg14_T>
200
200
  class Constructor<T, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, Arg12_T, Arg13_T, Arg14_T, void>
201
201
  {
@@ -206,7 +206,7 @@ namespace Rice
206
206
  }
207
207
  };
208
208
 
209
-
209
+
210
210
  template<typename T, typename Arg0_T>
211
211
  class Constructor<T, Object, Arg0_T, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
212
212
  {
@@ -217,7 +217,7 @@ namespace Rice
217
217
  }
218
218
  };
219
219
 
220
-
220
+
221
221
  template<typename T, typename Arg0_T, typename Arg1_T>
222
222
  class Constructor<T, Object, Arg0_T, Arg1_T, void, void, void, void, void, void, void, void, void, void, void, void, void>
223
223
  {
@@ -228,7 +228,7 @@ namespace Rice
228
228
  }
229
229
  };
230
230
 
231
-
231
+
232
232
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T>
233
233
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, void, void, void, void, void, void, void, void, void, void, void, void>
234
234
  {
@@ -239,7 +239,7 @@ namespace Rice
239
239
  }
240
240
  };
241
241
 
242
-
242
+
243
243
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T>
244
244
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, void, void, void, void, void, void, void, void, void, void, void>
245
245
  {
@@ -250,7 +250,7 @@ namespace Rice
250
250
  }
251
251
  };
252
252
 
253
-
253
+
254
254
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T>
255
255
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, void, void, void, void, void, void, void, void, void, void>
256
256
  {
@@ -261,7 +261,7 @@ namespace Rice
261
261
  }
262
262
  };
263
263
 
264
-
264
+
265
265
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T>
266
266
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, void, void, void, void, void, void, void, void, void>
267
267
  {
@@ -272,7 +272,7 @@ namespace Rice
272
272
  }
273
273
  };
274
274
 
275
-
275
+
276
276
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T>
277
277
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, void, void, void, void, void, void, void, void>
278
278
  {
@@ -283,7 +283,7 @@ namespace Rice
283
283
  }
284
284
  };
285
285
 
286
-
286
+
287
287
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T>
288
288
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, void, void, void, void, void, void, void>
289
289
  {
@@ -294,7 +294,7 @@ namespace Rice
294
294
  }
295
295
  };
296
296
 
297
-
297
+
298
298
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T>
299
299
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, void, void, void, void, void, void>
300
300
  {
@@ -305,7 +305,7 @@ namespace Rice
305
305
  }
306
306
  };
307
307
 
308
-
308
+
309
309
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T>
310
310
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, void, void, void, void, void>
311
311
  {
@@ -316,7 +316,7 @@ namespace Rice
316
316
  }
317
317
  };
318
318
 
319
-
319
+
320
320
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T>
321
321
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, void, void, void, void>
322
322
  {
@@ -327,7 +327,7 @@ namespace Rice
327
327
  }
328
328
  };
329
329
 
330
-
330
+
331
331
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T>
332
332
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, void, void, void>
333
333
  {
@@ -338,7 +338,7 @@ namespace Rice
338
338
  }
339
339
  };
340
340
 
341
-
341
+
342
342
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T, typename Arg12_T>
343
343
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, Arg12_T, void, void>
344
344
  {
@@ -349,7 +349,7 @@ namespace Rice
349
349
  }
350
350
  };
351
351
 
352
-
352
+
353
353
  template<typename T, typename Arg0_T, typename Arg1_T, typename Arg2_T, typename Arg3_T, typename Arg4_T, typename Arg5_T, typename Arg6_T, typename Arg7_T, typename Arg8_T, typename Arg9_T, typename Arg10_T, typename Arg11_T, typename Arg12_T, typename Arg13_T>
354
354
  class Constructor<T, Object, Arg0_T, Arg1_T, Arg2_T, Arg3_T, Arg4_T, Arg5_T, Arg6_T, Arg7_T, Arg8_T, Arg9_T, Arg10_T, Arg11_T, Arg12_T, Arg13_T, void>
355
355
  {
@@ -360,7 +360,8 @@ namespace Rice
360
360
  }
361
361
  };
362
362
 
363
- } // namespace Rice
363
+
364
+ } // namespace Rice
364
365
 
365
366
 
366
367
  #endif // Rice__Constructor__hpp_
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "Object_defn.hpp"
5
5
  #include "Data_Type_fwd.hpp"
6
- #include "Allocation_Strategies.hpp"
7
6
  #include "ruby_mark.hpp"
8
7
  #include "detail/to_ruby.hpp"
9
8
  #include "detail/ruby.hpp"
@@ -23,6 +22,13 @@ struct Default_Mark_Function
23
22
  static const Ruby_Data_Func mark;
24
23
  };
25
24
 
25
+ template<typename T>
26
+ struct Default_Free_Function
27
+ {
28
+ static void free(T * obj) { delete obj; }
29
+ };
30
+
31
+
26
32
  //! A smartpointer-like wrapper for Ruby data objects.
27
33
  /*! A data object is a ruby object of type T_DATA, which is usually
28
34
  * created by using the Data_Wrap_Struct or Data_Make_Struct macro.
@@ -73,7 +79,7 @@ public:
73
79
  T * obj,
74
80
  VALUE klass = Data_Type<T>::klass(),
75
81
  Ruby_Data_Func mark_func = Default_Mark_Function<T>::mark,
76
- Ruby_Data_Func free_func = Default_Allocation_Strategy<T>::free);
82
+ Ruby_Data_Func free_func = Default_Free_Function<T>::free);
77
83
 
78
84
  //! Unwrap a Ruby object.
79
85
  /*! This constructor is analgous to calling Data_Get_Struct. Uses
data/rice/Hash.hpp CHANGED
@@ -2,9 +2,9 @@
2
2
  #define Rice__Hash__hpp_
3
3
 
4
4
  #include "Builtin_Object_defn.hpp"
5
+ #include "Array.hpp"
5
6
  #include "to_from_ruby_defn.hpp"
6
7
  #include "detail/ruby.hpp"
7
- #include "detail/st.hpp"
8
8
  #include "detail/traits.hpp"
9
9
  #include <iterator>
10
10
 
@@ -152,7 +152,10 @@ class Hash::Iterator
152
152
  {
153
153
  public:
154
154
  //! Construct a new Iterator.
155
- Iterator(Hash_Ref_T hash, st_data_t bin, st_table_entry * ptr);
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);
156
159
 
157
160
  //! Copy construct an Iterator.
158
161
  Iterator(Iterator const & iterator);
@@ -189,21 +192,35 @@ public:
189
192
  //! Swap with another iterator of the same type.
190
193
  void swap(Iterator & iterator);
191
194
 
195
+ protected:
196
+ Object current_key();
197
+
198
+ Array hash_keys();
199
+
192
200
  private:
193
201
  Hash hash_;
194
- st_table * tbl_;
195
- #if RICE__RUBY_VERSION_CODE >= 190
196
- st_index_t bin_;
197
- #else
198
- int bin_;
199
- #endif
200
- st_table_entry * ptr_;
202
+ int current_index_;
203
+ VALUE keys_;
201
204
 
202
205
  mutable typename detail::remove_const<Value_T>::Type tmp_;
203
206
  };
204
207
 
205
208
  } // namespace Rice
206
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
+
207
224
  #include "Hash.ipp"
208
225
 
209
226
  #endif // Rice__Hash__hpp_
data/rice/Hash.ipp CHANGED
@@ -6,16 +6,9 @@
6
6
  #include "Builtin_Object.hpp"
7
7
  #include "Exception.hpp"
8
8
  #include "Builtin_Object.hpp"
9
+ #include "detail/st.hpp"
9
10
  #include <algorithm>
10
11
 
11
- // TODO: Evil hack
12
- struct st_table_entry {
13
- unsigned int hash;
14
- st_data_t key;
15
- st_data_t record;
16
- st_table_entry *next;
17
- };
18
-
19
12
  inline Rice::Hash::
20
13
  Hash()
21
14
  : Builtin_Object<RHash, T_HASH>(protect(rb_hash_new))
@@ -31,7 +24,7 @@ Hash(Object v)
31
24
  inline size_t Rice::Hash::
32
25
  size() const
33
26
  {
34
- return RHASH_TBL(this->value())->num_entries;
27
+ return RHASH_SIZE(this->value());
35
28
  }
36
29
 
37
30
  inline Rice::Hash::Proxy::
@@ -145,28 +138,30 @@ swap(Rice::Hash::Entry & entry)
145
138
 
146
139
  template<typename Hash_Ref_T, typename Value_T>
147
140
  inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
148
- Iterator(Hash_Ref_T hash, st_data_t bin, st_table_entry * ptr)
141
+ Iterator(Hash_Ref_T hash)
149
142
  : hash_(hash)
150
- , tbl_(RHASH_TBL(hash.value()))
151
- , bin_(bin)
152
- , ptr_(ptr)
143
+ , current_index_(0)
144
+ , keys_(Qnil)
145
+ , tmp_(hash, Qnil)
146
+ {
147
+ }
148
+
149
+ template<typename Hash_Ref_T, typename Value_T>
150
+ inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
151
+ Iterator(Hash_Ref_T hash, int start_at)
152
+ : hash_(hash)
153
+ , current_index_(start_at)
154
+ , keys_(Qnil)
153
155
  , tmp_(hash, Qnil)
154
156
  {
155
- // If we aren't already at the end, then use the increment operator to
156
- // point to the first element
157
- if(!ptr_ && bin_ < tbl_->num_bins)
158
- {
159
- operator++();
160
- }
161
157
  }
162
158
 
163
159
  template<typename Hash_Ref_T, typename Value_T>
164
160
  inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
165
161
  Iterator(Iterator const & iterator)
166
162
  : hash_(iterator.hash_.value())
167
- , tbl_(iterator.tbl_)
168
- , bin_(iterator.bin_)
169
- , ptr_(iterator.ptr_)
163
+ , current_index_(iterator.current_index_)
164
+ , keys_(Qnil)
170
165
  , tmp_(iterator.hash_, Qnil)
171
166
  {
172
167
  }
@@ -176,9 +171,8 @@ template<typename Iterator_T>
176
171
  inline Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
177
172
  Iterator(Iterator_T const & iterator)
178
173
  : hash_(iterator.hash_.value())
179
- , tbl_(iterator.tbl_)
180
- , bin_(iterator.bin_)
181
- , ptr_(iterator.ptr_)
174
+ , current_index_(iterator.current_index_)
175
+ , keys_(Qnil)
182
176
  , tmp_(iterator.hash_, Qnil)
183
177
  {
184
178
  }
@@ -200,25 +194,9 @@ inline Rice::Hash::Iterator<Hash_Ref_T, Value_T> &
200
194
  Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
201
195
  operator++()
202
196
  {
203
- // Go to the next element in the bin; this will be a no-op if we were
204
- // called from the constructor, because ptr_ will be 0 (and if its
205
- // not, this function won't get called).
206
- if(ptr_)
207
- {
208
- ptr_ = ptr_->next;
209
- }
210
-
211
- // If we've reached the end of the bin, then try the next bin until
212
- // we have run out of bins
213
- while(ptr_ == 0)
214
- {
215
- ++bin_;
216
- if(bin_ == tbl_->num_bins)
217
- {
218
- // At the end..
219
- return *this;
220
- }
221
- ptr_ = tbl_->bins[bin_];
197
+ // Ensure we're within the range
198
+ if(current_index_ < hash_keys().size()) {
199
+ current_index_++;
222
200
  }
223
201
 
224
202
  return *this;
@@ -239,7 +217,7 @@ inline Value_T
239
217
  Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
240
218
  operator*()
241
219
  {
242
- return Value_T(hash_, ptr_->key);
220
+ return Value_T(hash_, current_key());
243
221
  }
244
222
 
245
223
  template<typename Hash_Ref_T, typename Value_T>
@@ -247,7 +225,7 @@ inline Value_T *
247
225
  Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
248
226
  operator->()
249
227
  {
250
- Entry tmp(hash_, ptr_->key);
228
+ Entry tmp(hash_, current_key());
251
229
  this->tmp_.swap(tmp);
252
230
  return &tmp_;
253
231
  }
@@ -257,9 +235,7 @@ inline bool Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
257
235
  operator==(Iterator const & rhs) const
258
236
  {
259
237
  return hash_.value() == rhs.hash_.value()
260
- && tbl_ == rhs.tbl_
261
- && bin_ == rhs.bin_
262
- && ptr_ == rhs.ptr_;
238
+ && current_index_ == rhs.current_index_;
263
239
  }
264
240
 
265
241
  template<typename Hash_Ref_T, typename Value_T>
@@ -277,37 +253,53 @@ swap(Iterator& iterator)
277
253
  using namespace std;
278
254
 
279
255
  hash_.swap(iterator.hash_);
280
- swap(tbl_, iterator.tbl_);
281
- swap(bin_, iterator.bin_);
282
- swap(ptr_, iterator.ptr_);
256
+ swap(keys_, iterator.keys_);
257
+ swap(current_index_, iterator.current_index_);
258
+ }
259
+
260
+ template<typename Hash_Ref_T, typename Value_T>
261
+ inline Rice::Object
262
+ Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
263
+ current_key()
264
+ {
265
+ return hash_keys()[current_index_];
266
+ }
267
+
268
+
269
+ template<typename Hash_Ref_T, typename Value_T>
270
+ inline Rice::Array
271
+ Rice::Hash::Iterator<Hash_Ref_T, Value_T>::
272
+ hash_keys()
273
+ {
274
+ if(NIL_P(keys_)) {
275
+ keys_ = rb_funcall(hash_, rb_intern("keys"), 0, 0);
276
+ }
277
+
278
+ return Rice::Array(keys_);
283
279
  }
284
280
 
285
281
  inline Rice::Hash::iterator Rice::Hash::
286
282
  begin()
287
283
  {
288
- st_table * tbl(RHASH_TBL(value()));
289
- return iterator(*this, 0, tbl->bins[0]);
284
+ return iterator(*this);
290
285
  }
291
286
 
292
287
  inline Rice::Hash::const_iterator Rice::Hash::
293
288
  begin() const
294
289
  {
295
- st_table * tbl(RHASH_TBL(value()));
296
- return const_iterator(*this, 0, tbl->bins[0]);
290
+ return const_iterator(*this);
297
291
  }
298
292
 
299
293
  inline Rice::Hash::iterator Rice::Hash::
300
294
  end()
301
295
  {
302
- st_table * tbl(RHASH_TBL(value()));
303
- return iterator(*this, tbl->num_bins, 0);
296
+ return iterator(*this, size());
304
297
  }
305
298
 
306
299
  inline Rice::Hash::const_iterator Rice::Hash::
307
300
  end() const
308
301
  {
309
- st_table * tbl(RHASH_TBL(value()));
310
- return const_iterator(*this, tbl->num_bins, 0);
302
+ return const_iterator(*this, size());
311
303
  }
312
304
 
313
305
  inline bool Rice::