Hi,
I'm trying to copy all the key/value pairs from a Ruby
hash into an STL hash. (BTW, I'm using Ruby 1.8.4 and
cannot change the ruby version easily.)
It looks like rb_hash_foreach() in hash.c does exactly
what I want--allows me to pass in a function pointer,
which it will invoke yielding each key/value pair--but
it's declared static in hash.c.
I looked at duplicating that functionality in my own
C code, but it requires "st.h" as well as constants
such as HASH_DELETED which are defined privately in
hash.c.
Is there a different way I should be going about this?
Thanks for any help,
Bill
Maybe try something like:
static VALUE hsh_iterfunc(VALUE data_ary, VALUE hsh) {
VALUE key = rb_ary_entry(data_ary, 0);
VALUE value = rb_ary_entry(data_ary, 1);
// do whatever, e.g.
rb_funcall(rb_mKernel, rb_intern("puts"), 2, key, value);
return data_ary;
}
VALUE ruby_iterhsh(VALUE self, VALUE hsh) {
return rb_iterate(rb_each, hsh, hsh_iterfunc, hsh);
}
// ... later,
rb_define_method(cSomeClass, "iterhsh", ruby_iterhsh, 1);
Hope that helps,
Ross
···
On Fri, 29 Dec 2006 08:22:34 -0000, Bill Kelly <billk@cts.com> wrote:
Hi,
I'm trying to copy all the key/value pairs from a Ruby
hash into an STL hash. (BTW, I'm using Ruby 1.8.4 and
cannot change the ruby version easily.)
It looks like rb_hash_foreach() in hash.c does exactly
what I want--allows me to pass in a function pointer,
which it will invoke yielding each key/value pair--but
it's declared static in hash.c.
I looked at duplicating that functionality in my own
C code, but it requires "st.h" as well as constants
such as HASH_DELETED which are defined privately in
hash.c.
Is there a different way I should be going about this?
--
Ross Bamford - rosco@roscopeco.remove.co.uk
> I'm trying to copy all the key/value pairs from a Ruby
> hash into an STL hash. (BTW, I'm using Ruby 1.8.4 and
> cannot change the ruby version easily.)
Maybe try something like:
static VALUE hsh_iterfunc(VALUE data_ary, VALUE hsh) {
VALUE key = rb_ary_entry(data_ary, 0);
VALUE value = rb_ary_entry(data_ary, 1);
// do whatever, e.g.
rb_funcall(rb_mKernel, rb_intern("puts"), 2, key, value);
return data_ary;
}
VALUE ruby_iterhsh(VALUE self, VALUE hsh) {
return rb_iterate(rb_each, hsh, hsh_iterfunc, hsh);
}
Thanks! Works great.
What I'm passing in as the second parameter isn't really a VALUE,
it's a pointer to the STL hash. As far as I could tell from grepping
the ruby sources, that *seems* to be legal (some ruby code passes
a NODE* for the second parameter, masquerading as a VALUE.)
(Unless a NODE* really is a VALUE, in which case my passing in
a fake VALUE maybe isn't so good after all. I'm a little uncomfortable
not knowing for sure...)
Regards,
Bill
···
From: "Ross Bamford" <rosco@roscopeco.remove.co.uk>
On Fri, 29 Dec 2006 08:22:34 -0000, Bill Kelly <billk@cts.com> wrote:
From: "Ross Bamford" <rosco@roscopeco.remove.co.uk>
> I'm trying to copy all the key/value pairs from a Ruby
> hash into an STL hash. (BTW, I'm using Ruby 1.8.4 and
> cannot change the ruby version easily.)
Maybe try something like:
static VALUE hsh_iterfunc(VALUE data_ary, VALUE hsh) {
VALUE key = rb_ary_entry(data_ary, 0);
VALUE value = rb_ary_entry(data_ary, 1);
// do whatever, e.g.
rb_funcall(rb_mKernel, rb_intern("puts"), 2, key, value);
return data_ary;
}
VALUE ruby_iterhsh(VALUE self, VALUE hsh) {
return rb_iterate(rb_each, hsh, hsh_iterfunc, hsh);
}
Thanks! Works great.
No problem 
What I'm passing in as the second parameter isn't really a VALUE,
it's a pointer to the STL hash. As far as I could tell from grepping
the ruby sources, that *seems* to be legal (some ruby code passes
a NODE* for the second parameter, masquerading as a VALUE.)
(Unless a NODE* really is a VALUE, in which case my passing in
a fake VALUE maybe isn't so good after all. I'm a little uncomfortable
not knowing for sure...)
No, that should be fine - ruby guarantees that VALUE casts to void*, and the second argument is purely for your use.
Cheers,
···
On Wed, 03 Jan 2007 05:05:21 -0000, Bill Kelly <billk@cts.com> wrote:
On Fri, 29 Dec 2006 08:22:34 -0000, Bill Kelly <billk@cts.com> wrote:
--
Ross Bamford - rosco@roscopeco.remove.co.uk