rice 1.4.3 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +2 -2
- data/Doxyfile +1 -1
- data/Makefile.in +296 -166
- data/README +18 -13
- data/Rakefile +3 -2
- data/aclocal.m4 +375 -248
- data/config.guess +296 -261
- data/config.sub +268 -94
- data/configure +2789 -3054
- data/configure.ac +1 -1
- data/depcomp +403 -197
- data/extconf.rb +14 -3
- data/install-sh +139 -119
- data/missing +154 -306
- data/rice/Builtin_Object_defn.hpp +0 -1
- data/rice/Constructor.hpp +31 -30
- data/rice/Data_Object_defn.hpp +8 -2
- data/rice/Hash.hpp +26 -9
- data/rice/Hash.ipp +52 -60
- data/rice/Makefile.am +0 -1
- data/rice/Makefile.in +278 -152
- data/rice/Module_impl.ipp +1 -1
- data/rice/VM.cpp +1 -11
- data/rice/config.hpp +3 -0
- data/rice/config.hpp.in +3 -0
- data/rice/detail/Auto_Function_Wrapper.hpp +69 -0
- data/rice/detail/Auto_Function_Wrapper.ipp +815 -512
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +69 -0
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +543 -272
- data/rice/detail/object_call.hpp +1 -0
- data/rice/detail/ruby.hpp +0 -9
- data/rice/detail/ruby_version_code.hpp +1 -1
- data/rice/detail/st.hpp +0 -38
- data/rice/protect.hpp +1 -0
- data/rice/protect.ipp +1 -0
- data/rice/to_from_ruby.ipp +1 -1
- data/ruby.ac +2 -2
- data/ruby/Makefile.in +221 -134
- data/ruby/lib/Makefile.in +133 -44
- data/ruby/lib/mkmf-rice.rb.in +1 -4
- data/ruby/lib/version.rb +1 -1
- data/sample/Makefile.in +96 -31
- data/test/Makefile.am +0 -1
- data/test/Makefile.in +617 -219
- data/test/ext/Makefile.in +96 -31
- data/test/test_Class.cpp +2 -2
- data/test/test_Data_Object.cpp +11 -11
- data/test/test_Hash.cpp +7 -4
- data/test/test_Module.cpp +17 -1
- data/test/test_To_From_Ruby.cpp +44 -0
- data/test/test_rice.rb +2 -2
- metadata +29 -43
- data/rice/Allocation_Strategies.hpp +0 -37
- data/test/test_Allocation_Strategies.cpp +0 -77
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
|
-
|
363
|
+
|
364
|
+
} // namespace Rice
|
364
365
|
|
365
366
|
|
366
367
|
#endif // Rice__Constructor__hpp_
|
data/rice/Data_Object_defn.hpp
CHANGED
@@ -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 =
|
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
|
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
|
-
|
195
|
-
|
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
|
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
|
141
|
+
Iterator(Hash_Ref_T hash)
|
149
142
|
: hash_(hash)
|
150
|
-
,
|
151
|
-
,
|
152
|
-
,
|
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
|
-
,
|
168
|
-
,
|
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
|
-
,
|
180
|
-
,
|
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
|
-
//
|
204
|
-
|
205
|
-
|
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_,
|
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_,
|
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
|
-
&&
|
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(
|
281
|
-
swap(
|
282
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
310
|
-
return const_iterator(*this, tbl->num_bins, 0);
|
302
|
+
return const_iterator(*this, size());
|
311
303
|
}
|
312
304
|
|
313
305
|
inline bool Rice::
|