rice 1.4.3 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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::