class BDB::Recnum

Public Class Methods

[](*args) click to toggle source
static VALUE
bdb_sary_s_create(int argc, VALUE *argv, VALUE obj)
{
    VALUE res;

    res = rb_funcall2(obj, rb_intern("new"), 0, 0);
    if (argc < 0) {
        rb_raise(rb_eArgError, "negative number of arguments");
    }
    if (argc > 0) {
        bdb_sary_push_m(argc, argv, res);
    }
    return res;
}
new(*args) click to toggle source
static VALUE
bdb_recnum_init(int argc, VALUE *argv, VALUE obj)
{
    VALUE *nargv;
    VALUE array = rb_str_new2("array_base");
    VALUE sarray = rb_str_new2("set_array_base");

    if (!argc || TYPE(argv[argc - 1]) != T_HASH) {
        nargv = ALLOCA_N(VALUE, argc + 1);
        MEMCPY(nargv, argv, VALUE, argc);
        nargv[argc] = rb_hash_new();
        argv = nargv;
        argc++;
    }
    rb_hash_aset(argv[argc - 1], array, INT2FIX(0));
    if (rb_hash_aref(argv[argc - 1], sarray) != RHASH(argv[argc - 1])->ifnone) {
        rb_hash_aset(argv[argc - 1], sarray, INT2FIX(0));
    }
    rb_hash_aset(argv[argc - 1], rb_str_new2("set_flags"), INT2FIX(DB_RENUMBER));
    return bdb_init(argc, argv, obj);
}

Public Instance Methods

&(p1) click to toggle source
static VALUE
bdb_sary_and(VALUE obj, VALUE y)
{
    return rb_funcall(bdb_sary_to_a(obj), rb_intern("&"), 1, y);
}
*(p1) click to toggle source
static VALUE
bdb_sary_times(VALUE obj, VALUE y)
{
    return rb_funcall(bdb_sary_to_a(obj), rb_intern("*"), 1, y);
}
+(p1) click to toggle source
static VALUE
bdb_sary_plus(VALUE obj, VALUE y)
{
    return rb_ary_plus(bdb_sary_to_a(obj), y);
}
-(p1) click to toggle source
static VALUE
bdb_sary_diff(VALUE obj, VALUE y)
{
    return rb_funcall(bdb_sary_to_a(obj), rb_intern("-"), 1, y);
}
<<(p1) click to toggle source
static VALUE
bdb_sary_push(VALUE obj, VALUE y)
{
    bdb_DB *dbst;
    VALUE tmp[2];

    GetDB(obj, dbst);
    tmp[0] = INT2NUM(dbst->len);
    tmp[1] = y;
    bdb_put(2, tmp, obj);
    dbst->len++;
    return obj;
}
<=>(p1) click to toggle source
static VALUE
bdb_sary_cmp(VALUE obj, VALUE obj2)
{
    bdb_DB *dbst, *dbst2 = 0;
    VALUE a, a2, tmp, ary;
    long i, len;

    if (obj == obj2) return INT2FIX(0);
    GetDB(obj, dbst);
    len = dbst->len;
    if (!rb_obj_is_kind_of(obj2, bdb_cRecnum)) {
        obj2 = rb_convert_type(obj2, T_ARRAY, "Array", "to_ary");
        if (len > RARRAY_LEN(obj2)) {
            len = RARRAY_LEN(obj2);
        }
        ary = Qtrue;
    }
    else {
        GetDB(obj2, dbst2);
        len = dbst->len;
        if (len > dbst2->len) {
            len = dbst2->len;
        }
        ary = Qfalse;
    }
    for (i = 0; i < len; i++) {
        tmp = INT2NUM(i);
        a = bdb_get(1, &tmp, obj);
        if (ary) {
            a2 = RARRAY_PTR(obj2)[i];
        }
        else {
            a2 = bdb_get(1, &tmp, obj2);
        }
        tmp = rb_funcall(a, id_cmp, 1, a2);
        if (tmp != INT2FIX(0)) {
            return tmp;
        }
    }
    len = dbst->len - ary?RARRAY_LEN(obj2):dbst2->len;
    if (len == 0) return INT2FIX(0);
    if (len > 0) return INT2FIX(1);
    return INT2FIX(-1);
}
[](p1, p2 = v2) click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
    VALUE arg1, arg2;
    long beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
        beg = NUM2LONG(arg1);
        len = NUM2LONG(arg2);
        if (beg < 0) {
            beg = dbst->len + beg;
        }
        return bdb_sary_subseq(obj, beg, len);
    }

    if (FIXNUM_P(arg1)) {
        return bdb_sary_entry(obj, arg1);
    }
    else if (TYPE(arg1) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }
    else {
        switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
          case Qfalse:
            break;
          case Qnil:
            return Qnil;
          default:
            return bdb_sary_subseq(obj, beg, len);
        }
    }
    return bdb_sary_entry(obj, arg1);
}
[]=(*args) click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
    long  beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (argc == 3) {
        bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
        return argv[2];
    }
    if (argc != 2) {
        rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
    }
    if (FIXNUM_P(argv[0])) {
        beg = FIX2LONG(argv[0]);
        goto fixnum;
    }
    else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
        bdb_sary_replace(obj, beg, len, argv[1]);
        return argv[1];
    }
    if (TYPE(argv[0]) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }

    beg = NUM2LONG(argv[0]);
  fixnum:
    if (beg < 0) {
        beg += dbst->len;
        if (beg < 0) {
            rb_raise(rb_eIndexError, "index %ld out of array",
                     beg - dbst->len);
        }
    }
    if (beg > dbst->len) {
        VALUE nargv[2];
        int i;

        nargv[1] = Qnil;
        for (i = dbst->len; i < beg; i++) {
            nargv[0] = INT2NUM(i);
            bdb_put(2, nargv, obj);
            dbst->len++;
        }
    }
    argv[0] = INT2NUM(beg);
    bdb_put(2, argv, obj);
    dbst->len++;
    return argv[1];
}
at(p1) click to toggle source
static VALUE
bdb_sary_at(VALUE obj, VALUE pos)
{
    return bdb_sary_entry(obj, pos);
}
clear(*args) click to toggle source
static VALUE
bdb_sary_clear(int argc, VALUE *argv, VALUE obj)
{
    bdb_DB *dbst;
    VALUE g;
    int flags = 0;

    if (argc && TYPE(argv[argc - 1]) == T_HASH) {
        VALUE f = argv[argc - 1];
        if ((g = rb_hash_aref(f, rb_intern("flags"))) != RHASH(f)->ifnone ||
            (g = rb_hash_aref(f, rb_str_new2("flags"))) != RHASH(f)->ifnone) {
            flags = NUM2INT(g);
        }
        argc--;
    }
    if (argc == 1) {
        flags = NUM2INT(argv[0]);
    }
    g = INT2FIX(flags);
    bdb_clear(1, &g, obj);
    GetDB(obj, dbst);
    dbst->len = 0;
    return obj;
}
collect(*args) click to toggle source
static VALUE
bdb_sary_collect(int argc, VALUE *argv, VALUE obj)
{
    if (!rb_block_given_p()) {
        return bdb_sary_to_a(obj);
    }
    return bdb_each_kvc(argc, argv, obj, DB_NEXT, rb_ary_new(), BDB_ST_VALUE);
}
collect!(*args) click to toggle source
static VALUE
bdb_sary_collect_bang(int argc, VALUE *argv, VALUE obj)
{
    return bdb_each_kvc(argc, argv, obj, DB_NEXT, Qtrue, BDB_ST_VALUE);
}
compact() click to toggle source
static VALUE
bdb_sary_compact(VALUE obj)
{
    return rb_funcall(bdb_sary_to_a(obj), rb_intern("compact!"), 0, 0);
}
compact!() click to toggle source
static VALUE
bdb_sary_compact_bang(VALUE obj)
{
    bdb_DB *dbst;
    long i, j;
    VALUE tmp;

    GetDB(obj, dbst);
    j = dbst->len;
    for (i = 0; i < dbst->len; ) {
        tmp = INT2NUM(i);
        tmp = bdb_get(1, &tmp, obj);
        if (NIL_P(tmp)) {
            bdb_del(obj, INT2NUM(i));
            dbst->len--;
        }
        else {
            i++;
        }
    }
    if (dbst->len == j) return Qnil;
    return obj;
}
concat(p1) click to toggle source
static VALUE
bdb_sary_concat(VALUE obj, VALUE y)
{
    bdb_DB *dbst;
    long i;
    VALUE tmp[2];

    y = rb_convert_type(y, T_ARRAY, "Array", "to_ary");
    GetDB(obj, dbst);
    for (i = 0; i < RARRAY_LEN(y); i++) {
        tmp[0] = INT2NUM(dbst->len);
        tmp[1] = RARRAY_PTR(y)[i];
        bdb_put(2, tmp, obj);
        dbst->len++;
    }
    return obj;
}
db_get(p1, p2 = v2) click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
    VALUE arg1, arg2;
    long beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
        beg = NUM2LONG(arg1);
        len = NUM2LONG(arg2);
        if (beg < 0) {
            beg = dbst->len + beg;
        }
        return bdb_sary_subseq(obj, beg, len);
    }

    if (FIXNUM_P(arg1)) {
        return bdb_sary_entry(obj, arg1);
    }
    else if (TYPE(arg1) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }
    else {
        switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
          case Qfalse:
            break;
          case Qnil:
            return Qnil;
          default:
            return bdb_sary_subseq(obj, beg, len);
        }
    }
    return bdb_sary_entry(obj, arg1);
}
db_put(*args) click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
    long  beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (argc == 3) {
        bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
        return argv[2];
    }
    if (argc != 2) {
        rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
    }
    if (FIXNUM_P(argv[0])) {
        beg = FIX2LONG(argv[0]);
        goto fixnum;
    }
    else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
        bdb_sary_replace(obj, beg, len, argv[1]);
        return argv[1];
    }
    if (TYPE(argv[0]) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }

    beg = NUM2LONG(argv[0]);
  fixnum:
    if (beg < 0) {
        beg += dbst->len;
        if (beg < 0) {
            rb_raise(rb_eIndexError, "index %ld out of array",
                     beg - dbst->len);
        }
    }
    if (beg > dbst->len) {
        VALUE nargv[2];
        int i;

        nargv[1] = Qnil;
        for (i = dbst->len; i < beg; i++) {
            nargv[0] = INT2NUM(i);
            bdb_put(2, nargv, obj);
            dbst->len++;
        }
    }
    argv[0] = INT2NUM(beg);
    bdb_put(2, argv, obj);
    dbst->len++;
    return argv[1];
}
delete(p1) click to toggle source
static VALUE
bdb_sary_delete(VALUE obj, VALUE item)
{
    bdb_DB *dbst;
    long i1, i2;
    VALUE tmp, a;

    GetDB(obj, dbst);
    i2 = dbst->len;
    for (i1 = 0; i1 < dbst->len;) {
        tmp = INT2NUM(i1);
        a = bdb_get(1, &tmp, obj);
        if (rb_equal(a, item)) {
            bdb_del(obj, INT2NUM(i1));
            dbst->len--;
        }
        else {
            i1++;
        }
    }
    if (dbst->len == i2) {
        if (rb_block_given_p()) {
            return rb_yield(item);
        }
        return Qnil;
    }
    return item;
}
delete_at(p1) click to toggle source
static VALUE
bdb_sary_delete_at_m(VALUE obj, VALUE a)
{
    bdb_DB *dbst;
    long pos;
    VALUE tmp;
    VALUE del = Qnil;

    GetDB(obj, dbst);
    pos = NUM2INT(a);
    if (pos >= dbst->len) return Qnil;
    if (pos < 0) pos += dbst->len;
    if (pos < 0) return Qnil;

    tmp = INT2NUM(pos);
    del = bdb_get(1, &tmp, obj);
    bdb_del(obj, tmp);
    dbst->len--;
    return del;
}
delete_if() click to toggle source
static VALUE
bdb_sary_delete_if(VALUE obj)
{
    bdb_sary_reject_bang(obj);
    return obj;
}
empty?() click to toggle source
static VALUE
bdb_sary_empty_p(VALUE obj)
{
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (dbst->len < 0) rb_raise(bdb_eFatal, "Invalid BDB::Recnum");
    return (dbst->len)?Qfalse:Qtrue;
}
fetch(p1, p2 = v2) click to toggle source
static VALUE
bdb_sary_fetch(int argc, VALUE *argv, VALUE obj)
{
    VALUE pos, ifnone;
    bdb_DB *dbst;
    long idx;

    GetDB(obj, dbst);
    rb_scan_args(argc, argv, "11", &pos, &ifnone);
    idx = NUM2LONG(pos);

    if (idx < 0) {
        idx +=  dbst->len;
    }
    if (idx < 0 || dbst->len <= idx) {
        return ifnone;
    }
    pos = INT2NUM(idx);
    return bdb_get(1, &pos, obj);
}
fill(p1, p2 = v2, p3 = v3) click to toggle source
static VALUE
bdb_sary_fill(int argc, VALUE *argv, VALUE obj)
{
    VALUE item, arg1, arg2, tmp[2];
    long beg, len, i;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    rb_scan_args(argc, argv, "12", &item, &arg1, &arg2);
    switch (argc) {
      case 1:
          len = dbst->len;
          beg = 0;
          break;
      case 2:
        if (rb_range_beg_len(arg1, &beg, &len, dbst->len, 1)) {
            break;
        }
        /* fall through */
      case 3:
        beg = NIL_P(arg1)?0:NUM2LONG(arg1);
        if (beg < 0) {
            beg += dbst->len;
            if (beg < 0) beg = 0;
        }
        len = NIL_P(arg2)?dbst->len - beg:NUM2LONG(arg2);
        break;
    }
    tmp[1] = item;
    for (i = 0; i < len; i++) {
        tmp[0] = INT2NUM(i + beg);
        bdb_put(2, tmp, obj);
        if ((i + beg) >= dbst->len) dbst->len++;
    }
    return obj;
}
filter(*args) click to toggle source
static VALUE
bdb_sary_filter(int argc, VALUE *argv, VALUE obj)
{
    rb_warn("BDB::Recnum#filter is deprecated; use BDB::Recnum#collect!");
    return bdb_sary_collect_bang(argc, argv, obj);
}
first() click to toggle source
static VALUE
bdb_sary_first(VALUE obj)
{
    bdb_DB *dbst;
    VALUE tmp;

    GetDB(obj, dbst);
    tmp = INT2NUM(0);
    return bdb_get(1, &tmp, obj);
}
get(p1, p2 = v2) click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
    VALUE arg1, arg2;
    long beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
        beg = NUM2LONG(arg1);
        len = NUM2LONG(arg2);
        if (beg < 0) {
            beg = dbst->len + beg;
        }
        return bdb_sary_subseq(obj, beg, len);
    }

    if (FIXNUM_P(arg1)) {
        return bdb_sary_entry(obj, arg1);
    }
    else if (TYPE(arg1) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }
    else {
        switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
          case Qfalse:
            break;
          case Qnil:
            return Qnil;
          default:
            return bdb_sary_subseq(obj, beg, len);
        }
    }
    return bdb_sary_entry(obj, arg1);
}
indexes(*args) click to toggle source
static VALUE
bdb_sary_indexes(int argc, VALUE *argv, VALUE obj)
{
#if HAVE_RB_ARY_VALUES_AT
    rb_warn("Recnum#%s is deprecated; use Recnum#values_at",
#if HAVE_RB_FRAME_THIS_FUNC
            rb_id2name(rb_frame_this_func()));
#else
            rb_id2name(rb_frame_last_func()));
#endif
#endif
    return bdb_sary_values_at(argc, argv, obj);
}
indices(*args) click to toggle source
static VALUE
bdb_sary_indexes(int argc, VALUE *argv, VALUE obj)
{
#if HAVE_RB_ARY_VALUES_AT
    rb_warn("Recnum#%s is deprecated; use Recnum#values_at",
#if HAVE_RB_FRAME_THIS_FUNC
            rb_id2name(rb_frame_this_func()));
#else
            rb_id2name(rb_frame_last_func()));
#endif
#endif
    return bdb_sary_values_at(argc, argv, obj);
}
insert(*args) click to toggle source
static VALUE
bdb_sary_insert(int argc, VALUE *argv, VALUE obj)
{
    long pos;

    if (argc < 2) {
        rb_raise(rb_eArgError, "wrong number of arguments(at least 2)");
    }
    pos = NUM2LONG(argv[0]);
    if (pos == -1) {
        bdb_DB *dbst;

        GetDB(obj, dbst);
        pos = dbst->len;
    }
    else if (pos < 0) {
        pos++;
    }

    bdb_sary_replace(obj, pos, 0, rb_ary_new4(argc-1, argv+1));
    return obj;
}
last() click to toggle source
static VALUE
bdb_sary_last(VALUE obj)
{
    bdb_DB *dbst;
    VALUE tmp;

    GetDB(obj, dbst);
    if (!dbst->len) return Qnil;
    tmp = INT2NUM(dbst->len);
    return bdb_get(1, &tmp, obj);
}
length() click to toggle source
static VALUE
bdb_sary_length(VALUE obj)
{
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (dbst->len < 0) rb_raise(bdb_eFatal, "Invalid BDB::Recnum");
    return INT2NUM(dbst->len);
}
Also aliased as: size
map() click to toggle source
static VALUE
bdb_sary_collect(int argc, VALUE *argv, VALUE obj)
{
    if (!rb_block_given_p()) {
        return bdb_sary_to_a(obj);
    }
    return bdb_each_kvc(argc, argv, obj, DB_NEXT, rb_ary_new(), BDB_ST_VALUE);
}
map!(*args) click to toggle source
static VALUE
bdb_sary_collect_bang(int argc, VALUE *argv, VALUE obj)
{
    return bdb_each_kvc(argc, argv, obj, DB_NEXT, Qtrue, BDB_ST_VALUE);
}
nitems() click to toggle source
static VALUE
bdb_sary_nitems(VALUE obj)
{
    bdb_DB *dbst;
    long i, j;
    VALUE tmp;

    GetDB(obj, dbst);
    j = 0;
    for (i = 0; i < dbst->len; ) {
        tmp = INT2NUM(i);
        tmp = bdb_get(1, &tmp, obj);
        if (!NIL_P(tmp)) j++;
    }
    return INT2NUM(j);
}
pop() click to toggle source
static VALUE
bdb_sary_pop(VALUE obj)
{
    VALUE res;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (dbst->len == 0) return Qnil;
    res = bdb_intern_shift_pop(obj, DB_LAST, 1);
    return res;
}
push(*args) click to toggle source
static VALUE
bdb_sary_push_m(int argc, VALUE *argv, VALUE obj)
{
    bdb_DB *dbst;
    long i;
    VALUE tmp[2];

    if (argc == 0) {
        rb_raise(rb_eArgError, "wrong # of arguments(at least 1)");
    }
    if (argc > 0) {
        GetDB(obj, dbst);
        for (i = 0; i < argc; i++) {
            tmp[0] = INT2NUM(dbst->len);
            tmp[1] = argv[i];
            bdb_put(2, tmp, obj);
            dbst->len++;
        }
    }
    return obj;
}
put(*args) click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
    long  beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (argc == 3) {
        bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
        return argv[2];
    }
    if (argc != 2) {
        rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
    }
    if (FIXNUM_P(argv[0])) {
        beg = FIX2LONG(argv[0]);
        goto fixnum;
    }
    else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
        bdb_sary_replace(obj, beg, len, argv[1]);
        return argv[1];
    }
    if (TYPE(argv[0]) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }

    beg = NUM2LONG(argv[0]);
  fixnum:
    if (beg < 0) {
        beg += dbst->len;
        if (beg < 0) {
            rb_raise(rb_eIndexError, "index %ld out of array",
                     beg - dbst->len);
        }
    }
    if (beg > dbst->len) {
        VALUE nargv[2];
        int i;

        nargv[1] = Qnil;
        for (i = dbst->len; i < beg; i++) {
            nargv[0] = INT2NUM(i);
            bdb_put(2, nargv, obj);
            dbst->len++;
        }
    }
    argv[0] = INT2NUM(beg);
    bdb_put(2, argv, obj);
    dbst->len++;
    return argv[1];
}
reject!() click to toggle source
static VALUE
bdb_sary_reject_bang(VALUE obj)
{
    bdb_DB *dbst;
    long i1, i2;
    VALUE tmp, a;

    GetDB(obj, dbst);
    i2 = dbst->len;
    for (i1 = 0; i1 < dbst->len;) {
        tmp = INT2NUM(i1);
        a = bdb_get(1, &tmp, obj);
        if (!RTEST(rb_yield(a))) {
            i1++;
            continue;
        }
        bdb_del(obj, tmp);
        dbst->len--;
    }
    if (dbst->len == i2) return Qnil;
    return obj;
}
replace(p1) click to toggle source
static VALUE
bdb_sary_replace_m(VALUE obj, VALUE obj2)
{
    bdb_DB *dbst;

    GetDB(obj, dbst);
    obj2 = rb_convert_type(obj2, T_ARRAY, "Array", "to_ary");
    bdb_sary_replace(obj, 0, dbst->len, obj2);
    return obj;
}
reverse() click to toggle source
static VALUE
bdb_sary_reverse_m(VALUE obj)
{
    return bdb_to_type(obj, rb_ary_new(), Qnil);
}
reverse!() click to toggle source
static VALUE
bdb_sary_reverse_bang(VALUE obj)
{
    long i, j;
    bdb_DB *dbst;
    VALUE tmp[2], interm;

    GetDB(obj, dbst);
    if (dbst->len <= 1) return obj;
    i = 0;
    j = dbst->len - 1;
    while (i < j) {
        tmp[0] = INT2NUM(i);
        interm = bdb_get(1, tmp, obj);
        tmp[0] = INT2NUM(j);
        tmp[1] = bdb_get(1, tmp, obj);
        tmp[0] = INT2NUM(i);
        bdb_put(2, tmp, obj);
        tmp[0] = INT2NUM(j);
        tmp[1] = interm;
        bdb_put(2, tmp, obj);
        i++; j--;
    }
    return obj;
}
rindex(p1) click to toggle source
static VALUE
bdb_sary_rindex(VALUE obj, VALUE a)
{
    return bdb_internal_value(obj, a, Qtrue, DB_PREV);
}
select(*args) click to toggle source
static VALUE
bdb_sary_select(int argc, VALUE *argv, VALUE obj)
{
    VALUE result;
    long i;

    if (rb_block_given_p()) {
        if (argc > 0) {
            rb_raise(rb_eArgError, "wrong number arguments(%d for 0)", argc);
        }
        return bdb_each_kvc(argc, argv, obj, DB_NEXT, rb_ary_new(), BDB_ST_SELECT);
    }
#if HAVE_RB_ARY_VALUES_AT
        rb_warn("Recnum#select(index..) is deprecated; use Recnum#values_at");
#endif
    result = rb_ary_new();
    for (i = 0; i < argc; i++) {
        rb_ary_push(result, bdb_sary_fetch(1, argv + i, obj));
    }
    return result;
}
shift() click to toggle source
static VALUE
bdb_sary_shift(VALUE obj)
{
    VALUE res;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (dbst->len == 0) return Qnil;
    res = bdb_intern_shift_pop(obj, DB_FIRST, 1);
    return res;
}
size()
Alias for: length
slice(p1, p2 = v2) click to toggle source
static VALUE
bdb_sary_aref(int argc, VALUE *argv, VALUE obj)
{
    VALUE arg1, arg2;
    long beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
        beg = NUM2LONG(arg1);
        len = NUM2LONG(arg2);
        if (beg < 0) {
            beg = dbst->len + beg;
        }
        return bdb_sary_subseq(obj, beg, len);
    }

    if (FIXNUM_P(arg1)) {
        return bdb_sary_entry(obj, arg1);
    }
    else if (TYPE(arg1) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }
    else {
        switch (rb_range_beg_len(arg1, &beg, &len, dbst->len, 0)) {
          case Qfalse:
            break;
          case Qnil:
            return Qnil;
          default:
            return bdb_sary_subseq(obj, beg, len);
        }
    }
    return bdb_sary_entry(obj, arg1);
}
slice!(p1, p2 = v2) click to toggle source
static VALUE
bdb_sary_slice_bang(int argc, VALUE *argv, VALUE obj)
{
    VALUE arg1, arg2;
    long pos, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
        pos = NUM2LONG(arg1);
        len = NUM2LONG(arg2);
      delete_pos_len:
        if (pos < 0) {
            pos = dbst->len + pos;
        }
        arg2 = bdb_sary_subseq(obj, pos, len);
        bdb_sary_replace(obj, pos, len, Qnil);
        return arg2;
    }

    if (!FIXNUM_P(arg1) && rb_range_beg_len(arg1, &pos, &len, dbst->len, 1)) {
        goto delete_pos_len;
    }

    pos = NUM2LONG(arg1);
    if (pos >= dbst->len) return Qnil;
    if (pos < 0) pos += dbst->len;
    if (pos < 0) return Qnil;

    arg1 = INT2NUM(pos);
    arg2 = bdb_sary_at(obj, arg1);
    if (bdb_del(obj, arg1) != Qnil) dbst->len--;
    return arg2;
}
store(*args) click to toggle source
static VALUE
bdb_sary_aset(int argc, VALUE *argv, VALUE obj)
{
    long  beg, len;
    bdb_DB *dbst;

    GetDB(obj, dbst);
    if (argc == 3) {
        bdb_sary_replace(obj, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
        return argv[2];
    }
    if (argc != 2) {
        rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc);
    }
    if (FIXNUM_P(argv[0])) {
        beg = FIX2LONG(argv[0]);
        goto fixnum;
    }
    else if (rb_range_beg_len(argv[0], &beg, &len, dbst->len, 1)) {
        bdb_sary_replace(obj, beg, len, argv[1]);
        return argv[1];
    }
    if (TYPE(argv[0]) == T_BIGNUM) {
        rb_raise(rb_eIndexError, "index too big");
    }

    beg = NUM2LONG(argv[0]);
  fixnum:
    if (beg < 0) {
        beg += dbst->len;
        if (beg < 0) {
            rb_raise(rb_eIndexError, "index %ld out of array",
                     beg - dbst->len);
        }
    }
    if (beg > dbst->len) {
        VALUE nargv[2];
        int i;

        nargv[1] = Qnil;
        for (i = dbst->len; i < beg; i++) {
            nargv[0] = INT2NUM(i);
            bdb_put(2, nargv, obj);
            dbst->len++;
        }
    }
    argv[0] = INT2NUM(beg);
    bdb_put(2, argv, obj);
    dbst->len++;
    return argv[1];
}
to_a() click to toggle source
static VALUE
bdb_sary_to_a(VALUE obj)
{
    return bdb_to_type(obj, rb_ary_new(), Qfalse);
}
to_ary() click to toggle source
static VALUE
bdb_sary_to_a(VALUE obj)
{
    return bdb_to_type(obj, rb_ary_new(), Qfalse);
}
unshift(*args) click to toggle source
static VALUE
bdb_sary_unshift_m(int argc, VALUE *argv, VALUE obj)
{
    bdb_DB *dbst;
    VALUE tmp[2];
    long i;

    if (argc == 0) {
        rb_raise(rb_eArgError, "wrong # of arguments(at least 1)");
    }
    if (argc > 0) {
/* ++ */
        GetDB(obj, dbst);
        for (i = dbst->len - 1; i >= 0; i++) {
            tmp[0] = INT2NUM(i);
            tmp[1] = bdb_get(1, tmp, obj);
            tmp[0] = INT2NUM(i + argc);
            bdb_put(2, tmp, obj);
        }
        for (i = 0; i < argc; i++) {
            tmp[0] = INT2NUM(i);
            tmp[1] = argv[i];
            bdb_put(2, tmp, obj);
            dbst->len++;
        }
    }
    return obj;
}
values_at(*args) click to toggle source
static VALUE
bdb_sary_values_at(int argc, VALUE *argv, VALUE obj)
{
    VALUE result;
    long i;

    result = rb_ary_new();
    for (i = 0; i < argc; i++) {
        rb_ary_push(result, bdb_sary_fetch(1, argv + i, obj));
    }
    return result;
}
|(p1) click to toggle source
static VALUE
bdb_sary_or(VALUE obj, VALUE y)
{
    return rb_funcall(bdb_sary_to_a(obj), rb_intern("|"), 1, y);
}