On 8/23/06, teeler / gmail.com <teeler / gmail.com> wrote:
> Is there a way i can use the functions defined in compar.c (der, like
> without copying them)?
>
> I'd like to be able to arbitrarily compare VALUE's - do i just have to
> imitate that code? Assuming that the underlying type has Comparable
> mixed in, would I just have to do what compar.c does, something like:
>
> cmp_ge(x, y)
>      VALUE x, y;
> {
>     VALUE c = rb_funcall(x, cmp, 1, y);
>
>      if (NIL_P(c)) return cmperr();
>      if (rb_cmpint(c, x, y) >= 0) return Qtrue;
>      return Qfalse;
> }
>
> and the same for the rest (le, eq, etc.) ?
> It'd be nice if i could just call cmp_ge(VALUE, VALUE) but I realize
> it's not in the C api...

You can just use rb_funcall;

    if (RTEST(rb_funcall(object, rb_intern("=="), 1, other_object))) {
        //...
    }

A new thing I just learned, for single character operators like '<'
and '>' you can just do this;

    if (RTEST(rb_funcall(object, '<', 1, other_object))) {
        //...
    }

If I was going to be doing this type of thing a lot I'd rewrite the
compar.c functions, returning int instead of VALUE. For example;

    #define my_cmperr() (rb_cmperr(x, y), 0)

    int
    my_cmp_ge(VALUE x, VALUE y)
    {
        VALUE c = rb_funcall(x, cmp, 1, y);

        if (NIL_P(c)) return my_cmperr();
        if (rb_cmpint(c, x, y) >= 0) return 1;
        return 0;
    }

Just my personal opinion.

Cheers,
Dave