27 #define id_each idEach
30 #define id_lshift idLTLT
35 if (argc == 0)
return Qnil;
36 if (argc == 1)
return argv[0];
40 #define ENUM_WANT_SVALUE() do { \
41 i = rb_enum_values_pack(argc, argv); \
44 #define enum_yield rb_yield_values2
168 rb_warn(
"given block not used");
222 return memo->u1.value;
224 if (!
NIL_P(if_none)) {
286 func = find_index_iter_i;
291 rb_warn(
"given block not used");
298 return memo->u1.value;
651 op =
id ?
ID2SYM(
id) : init;
667 return memo->u1.value;
805 return memo->u1.value;
833 #define SORT_BY_BUFSIZE 16
1006 #define ENUMFUNC(name) rb_block_given_p() ? name##_iter_i : name##_i
1008 #define DEFINE_ENUMFUNCS(name) \
1009 static VALUE enum_##name##_func(VALUE result, NODE *memo); \
1012 name##_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, memo)) \
1014 return enum_##name##_func(rb_enum_values_pack(argc, argv), RNODE(memo)); \
1018 name##_iter_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, memo)) \
1020 return enum_##name##_func(enum_yield(argc, argv), RNODE(memo)); \
1024 enum_##name##_func(VALUE result, NODE *memo)
1057 return memo->u1.value;
1091 return memo->u1.value;
1133 result = memo->u1.value;
1167 return memo->u1.value;
1509 return memo->u2.value;
1555 return memo->u2.value;
1695 return memo->u2.value;
1701 long n =
RNODE(memo)->u3.cnt++;
1880 ary = memo->u1.value;
1892 long size = memo->
u3.
cnt;
1991 long n = memo->
u3.
cnt++;
2055 if (
NIL_P(result)) {
2098 for (i=0; i<
argc; i++) {
2108 for (i=0; i<
argc; i++) {
2310 if (mul <= 0)
return INT2FIX(0);
2350 if (n <= 0)
return Qnil;
2356 if (len == 0)
return Qnil;
2357 while (n < 0 || 0 < --n) {
2358 for (i=0; i<
len; i++) {
2544 VALUE initial_state;
2555 rb_block_call(enumerator, idInitialize, 0, 0, chunk_i, enumerator);
2582 if (
RTEST(header_p)) {
2764 VALUE initial_state;
2777 rb_block_call(enumerator, idInitialize, 0, 0, slicebefore_i, enumerator);
2796 #define rb_intern(str) rb_intern_const(str)
#define RB_TYPE_P(obj, type)
const char * rb_builtin_class_name(VALUE x)
static VALUE enum_any(VALUE obj)
static VALUE enum_all(VALUE obj)
const char * rb_obj_classname(VALUE)
#define ENUM_WANT_SVALUE()
static VALUE enum_each_with_index(int argc, VALUE *argv, VALUE obj)
static int sort_by_cmp(const void *ap, const void *bp, void *data)
VALUE rb_ary_sort(VALUE ary)
rb_funcall(memo->yielder, id_lshift, 1, rb_assoc_new(memo->prev_value, memo->prev_elts))
SSL_METHOD *(* func)(void)
VALUE rb_ary_shift(VALUE ary)
static VALUE enum_each_slice(VALUE obj, VALUE n)
VALUE rb_ary_push(VALUE ary, VALUE item)
static VALUE enum_each_cons(VALUE obj, VALUE n)
VALUE rb_ary_tmp_new(long capa)
static VALUE enum_sort_by(VALUE obj)
static VALUE enum_member(VALUE obj, VALUE val)
void rb_raise(VALUE exc, const char *fmt,...)
#define RETURN_ENUMERATOR(obj, argc, argv)
#define DEFINE_ENUMFUNCS(name)
static VALUE enum_slice_before(int argc, VALUE *argv, VALUE enumerable)
ID rb_check_id(volatile VALUE *namep)
Returns ID for the given name if it is interned already, or 0.
int rb_cmpint(VALUE val, VALUE a, VALUE b)
static VALUE enum_to_h(int argc, VALUE *argv, VALUE obj)
VALUE rb_f_send(int argc, VALUE *argv, VALUE recv)
VALUE rb_ivar_get(VALUE, ID)
VALUE rb_equal(VALUE, VALUE)
VALUE rb_block_call_func(RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg))
void Init_Enumerable(void)
static VALUE enum_max(VALUE obj)
static VALUE enum_max_by(VALUE obj)
#define STATIC_ASSERT(name, expr)
VALUE rb_block_proc(void)
static VALUE enum_take(VALUE obj, VALUE n)
static VALUE enum_chunk(int argc, VALUE *argv, VALUE enumerable)
int rb_block_given_p(void)
static VALUE enum_sort(VALUE obj)
static VALUE enum_each_entry(int argc, VALUE *argv, VALUE obj)
#define RARRAY_AREF(a, i)
static VALUE enum_inject(int argc, VALUE *argv, VALUE obj)
static VALUE enum_grep(VALUE obj, VALUE pat)
static VALUE enum_find_all(VALUE obj)
static VALUE enum_cycle_size(VALUE self, VALUE args, VALUE eobj)
void rb_ary_store(VALUE ary, long idx, VALUE val)
#define offsetof(p_type, field)
static void minmax_i_update(VALUE i, VALUE j, struct minmax_t *memo)
static VALUE enum_first(int argc, VALUE *argv, VALUE obj)
unsigned char buf[MIME_BUF_SIZE]
static void minmax_by_i_update(VALUE v1, VALUE v2, VALUE i1, VALUE i2, struct minmax_by_t *memo)
static int reject_i(VALUE key, VALUE value, VALUE result)
static VALUE enum_cycle(int argc, VALUE *argv, VALUE obj)
rb_block_call(enumerable, id_each, 0, 0, chunk_ii, arg)
#define rb_node_newnode(type, a1, a2, a3)
#define CONST_ID(var, str)
static VALUE enum_each_cons_size(VALUE obj, VALUE args, VALUE eobj)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
static void minmax_ii_update(VALUE i, VALUE j, struct minmax_t *memo)
#define RBASIC_SET_CLASS_RAW(obj, cls)
static VALUE enum_collect(VALUE obj)
void ruby_qsort(void *, const size_t, const size_t, int(*)(const void *, const void *, void *), void *)
static VALUE enum_min(VALUE obj)
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1))
static VALUE enum_none(VALUE obj)
VALUE rb_rescue2(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*r_proc)(ANYARGS), VALUE data2,...)
static VALUE enum_size(VALUE self, VALUE args, VALUE eobj)
VALUE rb_attr_get(VALUE, ID)
static VALUE enum_one(VALUE obj)
#define NEW_MEMO_FOR(type, value)
static VALUE enum_drop_while(VALUE obj)
#define NEW_MEMO(a, b, c)
VALUE rb_ary_resize(VALUE ary, long len)
expands or shrinks ary to len elements.
static VALUE enum_reject(VALUE obj)
static VALUE enum_each_with_object(VALUE obj, VALUE memo)
#define RETURN_SIZED_ENUMERATOR(obj, argc, argv, size_fn)
#define RARRAY_PTR_USE(ary, ptr_name, expr)
VALUE rb_enum_values_pack(int argc, const VALUE *argv)
static VALUE enum_partition(VALUE obj)
static VALUE enum_to_a(int argc, VALUE *argv, VALUE obj)
static VALUE enum_minmax_by(VALUE obj)
#define MEMO_FOR(type, value)
static VALUE enum_reverse_each(int argc, VALUE *argv, VALUE obj)
VALUE rb_check_array_type(VALUE ary)
static VALUE enum_count(int argc, VALUE *argv, VALUE obj)
static VALUE enum_drop(VALUE obj, VALUE n)
int rb_respond_to(VALUE, ID)
static VALUE enum_find(int argc, VALUE *argv, VALUE obj)
VALUE rb_ary_dup(VALUE ary)
VALUE rb_ary_concat(VALUE x, VALUE y)
static VALUE enum_zip(int argc, VALUE *argv, VALUE obj)
static VALUE enum_min_by(VALUE obj)
rb_ivar_set(yielder, id_memo, LONG2NUM(++count))
VALUE rb_obj_alloc(VALUE)
const char * rb_id2name(ID id)
static VALUE enum_flat_map(VALUE obj)
static VALUE enum_take_while(VALUE obj)
#define RBASIC_CLEAR_CLASS(obj)
static VALUE enum_find_index(int argc, VALUE *argv, VALUE obj)
static VALUE enum_minmax(VALUE obj)
VALUE rb_hash_aref(VALUE, VALUE)
void rb_warning(const char *fmt,...)
static VALUE call_stop(VALUE *v)
#define RARRAY_ASET(a, i, v)
VALUE rb_define_module(const char *name)
#define RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg)
return rb_yield_values(2, rb_enum_values_pack(argc, argv), INT2NUM(n))
static VALUE enum_each_slice_size(VALUE obj, VALUE args, VALUE eobj)
static VALUE enum_group_by(VALUE obj)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_check_funcall(VALUE, ID, int, const VALUE *)
void rb_warn(const char *fmt,...)
static VALUE call_next(VALUE *v)