32#define ARY_DEFAULT_SIZE 16
33#define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))
34#define SMALL_ARRAY_LEN 16
37should_be_T_ARRAY(
VALUE ary)
43should_not_be_shared_and_embedded(
VALUE ary)
48#define ARY_SHARED_P(ary) \
49 (assert(should_be_T_ARRAY((VALUE)(ary))), \
50 assert(should_not_be_shared_and_embedded((VALUE)ary)), \
51 FL_TEST_RAW((ary),ELTS_SHARED)!=0)
53#define ARY_EMBED_P(ary) \
54 (assert(should_be_T_ARRAY((VALUE)(ary))), \
55 assert(should_not_be_shared_and_embedded((VALUE)ary)), \
56 FL_TEST_RAW((ary), RARRAY_EMBED_FLAG) != 0)
58#define ARY_HEAP_PTR(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.ptr)
59#define ARY_HEAP_LEN(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.len)
60#define ARY_HEAP_CAPA(a) (assert(!ARY_EMBED_P(a)), assert(!ARY_SHARED_ROOT_P(a)), \
61 RARRAY(a)->as.heap.aux.capa)
63#define ARY_EMBED_PTR(a) (assert(ARY_EMBED_P(a)), RARRAY(a)->as.ary)
64#define ARY_EMBED_LEN(a) \
65 (assert(ARY_EMBED_P(a)), \
66 (long)((RBASIC(a)->flags >> RARRAY_EMBED_LEN_SHIFT) & \
67 (RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)))
68#define ARY_HEAP_SIZE(a) (assert(!ARY_EMBED_P(a)), assert(ARY_OWNS_HEAP_P(a)), ARY_CAPA(a) * sizeof(VALUE))
70#define ARY_OWNS_HEAP_P(a) (assert(should_be_T_ARRAY((VALUE)(a))), \
71 !FL_TEST_RAW((a), ELTS_SHARED|RARRAY_EMBED_FLAG))
73#define FL_SET_EMBED(a) do { \
74 assert(!ARY_SHARED_P(a)); \
75 FL_SET((a), RARRAY_EMBED_FLAG); \
76 RARY_TRANSIENT_UNSET(a); \
80#define FL_UNSET_EMBED(ary) FL_UNSET((ary), RARRAY_EMBED_FLAG|RARRAY_EMBED_LEN_MASK)
81#define FL_SET_SHARED(ary) do { \
82 assert(!ARY_EMBED_P(ary)); \
83 FL_SET((ary), ELTS_SHARED); \
85#define FL_UNSET_SHARED(ary) FL_UNSET((ary), ELTS_SHARED)
87#define ARY_SET_PTR(ary, p) do { \
88 assert(!ARY_EMBED_P(ary)); \
89 assert(!OBJ_FROZEN(ary)); \
90 RARRAY(ary)->as.heap.ptr = (p); \
92#define ARY_SET_EMBED_LEN(ary, n) do { \
94 assert(ARY_EMBED_P(ary)); \
95 assert(!OBJ_FROZEN(ary)); \
96 RBASIC(ary)->flags &= ~RARRAY_EMBED_LEN_MASK; \
97 RBASIC(ary)->flags |= (tmp_n) << RARRAY_EMBED_LEN_SHIFT; \
99#define ARY_SET_HEAP_LEN(ary, n) do { \
100 assert(!ARY_EMBED_P(ary)); \
101 RARRAY(ary)->as.heap.len = (n); \
103#define ARY_SET_LEN(ary, n) do { \
104 if (ARY_EMBED_P(ary)) { \
105 ARY_SET_EMBED_LEN((ary), (n)); \
108 ARY_SET_HEAP_LEN((ary), (n)); \
110 assert(RARRAY_LEN(ary) == (n)); \
112#define ARY_INCREASE_PTR(ary, n) do { \
113 assert(!ARY_EMBED_P(ary)); \
114 assert(!OBJ_FROZEN(ary)); \
115 RARRAY(ary)->as.heap.ptr += (n); \
117#define ARY_INCREASE_LEN(ary, n) do { \
118 assert(!OBJ_FROZEN(ary)); \
119 if (ARY_EMBED_P(ary)) { \
120 ARY_SET_EMBED_LEN((ary), RARRAY_LEN(ary)+(n)); \
123 RARRAY(ary)->as.heap.len += (n); \
127#define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? RARRAY_EMBED_LEN_MAX : \
128 ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : ARY_HEAP_CAPA(ary))
129#define ARY_SET_CAPA(ary, n) do { \
130 assert(!ARY_EMBED_P(ary)); \
131 assert(!ARY_SHARED_P(ary)); \
132 assert(!OBJ_FROZEN(ary)); \
133 RARRAY(ary)->as.heap.aux.capa = (n); \
136#define ARY_SHARED_ROOT(ary) (assert(ARY_SHARED_P(ary)), RARRAY(ary)->as.heap.aux.shared_root)
137#define ARY_SET_SHARED(ary, value) do { \
138 const VALUE _ary_ = (ary); \
139 const VALUE _value_ = (value); \
140 assert(!ARY_EMBED_P(_ary_)); \
141 assert(ARY_SHARED_P(_ary_)); \
142 assert(ARY_SHARED_ROOT_P(_value_)); \
143 RB_OBJ_WRITE(_ary_, &RARRAY(_ary_)->as.heap.aux.shared_root, _value_); \
145#define RARRAY_SHARED_ROOT_FLAG FL_USER5
146#define ARY_SHARED_ROOT_P(ary) (assert(should_be_T_ARRAY((VALUE)(ary))), \
147 FL_TEST_RAW((ary), RARRAY_SHARED_ROOT_FLAG))
148#define ARY_SHARED_ROOT_REFCNT(ary) \
149 (assert(ARY_SHARED_ROOT_P(ary)), RARRAY(ary)->as.heap.aux.capa)
150#define ARY_SHARED_ROOT_OCCUPIED(ary) (ARY_SHARED_ROOT_REFCNT(ary) == 1)
151#define ARY_SET_SHARED_ROOT_REFCNT(ary, value) do { \
152 assert(ARY_SHARED_ROOT_P(ary)); \
153 RARRAY(ary)->as.heap.aux.capa = (value); \
155#define FL_SET_SHARED_ROOT(ary) do { \
156 assert(!ARY_EMBED_P(ary)); \
157 assert(!RARRAY_TRANSIENT_P(ary)); \
158 FL_SET((ary), RARRAY_SHARED_ROOT_FLAG); \
173#define ary_verify(ary) ary_verify_(ary, __FILE__, __LINE__)
176ary_verify_(
VALUE ary,
const char *file,
int line)
217rb_ary_verify(
VALUE ary)
222#define ary_verify(ary) ((void)0)
251ary_mem_clear(
VALUE ary,
long beg,
long size)
259memfill(
register VALUE *mem,
register long size,
register VALUE val)
299 ary_memcpy0(ary, beg,
argc,
argv, ary);
303ary_heap_alloc(
VALUE ary,
size_t capa)
330ary_heap_free(
VALUE ary)
341ary_heap_realloc(
VALUE ary,
size_t new_capa)
346 if (new_capa <= old_capa) {
352 if (new_ptr ==
NULL) {
367#if USE_TRANSIENT_HEAP
369rb_ary_transient_heap_evacuate_(
VALUE ary,
int transient,
int promote)
390 new_ptr = ary_heap_alloc(ary, capa);
395 RARRAY(ary)->as.heap.ptr = new_ptr;
411 rb_ary_transient_heap_evacuate_(ary,
TRUE,
TRUE);
422ary_resize_capa(
VALUE ary,
long capacity)
431 VALUE *
ptr = ary_heap_alloc(ary, capacity);
439 ary_heap_realloc(ary, capacity);
449 if (
len > capacity)
len = capacity;
451 ary_heap_free_ptr(ary,
ptr, old_capa);
462ary_shrink_capa(
VALUE ary)
467 assert(old_capa >= capacity);
468 if (old_capa > capacity) ary_heap_realloc(ary, capacity);
474ary_double_capa(
VALUE ary,
long min)
485 ary_resize_capa(ary, new_capa);
491rb_ary_decrement_share(
VALUE shared_root)
506rb_ary_unshare(
VALUE ary)
508 VALUE shared_root =
RARRAY(ary)->as.heap.aux.shared_root;
509 rb_ary_decrement_share(shared_root);
514rb_ary_unshare_safe(
VALUE ary)
522rb_ary_increment_share(
VALUE shared_root)
532rb_ary_set_shared(
VALUE ary,
VALUE shared_root)
534 rb_ary_increment_share(shared_root);
541rb_ary_modify_check(
VALUE ary)
550 rb_ary_modify_check(ary);
562 rb_ary_decrement_share(shared_root);
574 rb_ary_decrement_share(shared_root);
590ary_ensure_room_for_push(
VALUE ary,
long add_len)
593 long new_len = old_len + add_len;
604 rb_ary_modify_check(ary);
614 if (new_len > capa - (capa >> 6)) {
615 ary_double_capa(ary, new_len);
626 rb_ary_modify_check(ary);
629 if (new_len > capa) {
630 ary_double_capa(ary, new_len);
665 RARRAY(ary1)->as.heap.aux.shared_root ==
RARRAY(ary2)->as.heap.aux.shared_root &&
666 RARRAY(ary1)->as.heap.len ==
RARRAY(ary2)->as.heap.len) {
687 return ary_alloc(
klass);
704 ary = ary_alloc(
klass);
706 ptr = ary_heap_alloc(ary, capa);
738 for (
i=0;
i<
n;
i++) {
754 ary_memcpy(ary, 0,
n, elts);
770 VALUE ary = ary_new(0, capa);
778 VALUE ary = ary_new(0, capa);
779 ary_memfill(ary, 0, capa,
Qnil);
827ary_discard(
VALUE ary)
835ary_make_shared(
VALUE ary)
848 ary_shrink_capa(ary);
875 return (
VALUE)shared;
880ary_make_substitution(
VALUE ary)
891 return rb_ary_increment_share(ary_make_shared(ary));
906#define to_ary rb_to_array_type
1012 rb_ary_unshare_safe(ary);
1039 ary_resize_capa(ary,
len);
1044 rb_warn(
"block supersedes default value argument");
1052 ary_memfill(ary, 0,
len, val);
1096 ary_double_capa(ary, idx);
1099 ary_mem_clear(ary,
len, idx -
len + 1);
1105 ARY_SET(ary, idx, val);
1125 shared = ary_make_shared(ary);
1128 rb_ary_set_shared(result, shared);
1140ary_make_shared_copy(
VALUE ary)
1175 return ary_make_partial(ary,
rb_cArray, offset,
n);
1198 VALUE target_ary = ary_ensure_room_for_push(ary, 1);
1211 VALUE target_ary = ary_ensure_room_for_push(ary,
len);
1212 ary_memcpy0(ary, oldlen,
len,
argv, target_ary);
1244 rb_ary_modify_check(ary);
1246 if (
n == 0)
return Qnil;
1251 ary_resize_capa(ary,
n * 2);
1286 rb_ary_modify_check(ary);
1299 rb_ary_modify_check(ary);
1313 ARY_SET(ary, 0,
Qnil);
1314 ary_make_shared(ary);
1360 rb_ary_modify_check(ary);
1371 if (
n<=0)
return ary;
1373 rb_ary_modify_check(ary);
1376 setup_occupied_shared:
1377 ary_mem_clear(ary, 0,
n);
1388 ary_make_shared(ary);
1389 goto setup_occupied_shared;
1399ary_ensure_room_for_unshift(
VALUE ary,
int argc)
1404 const VALUE *head, *sharedp;
1414 rb_ary_modify_check(ary);
1417 goto makeroom_if_need;
1423 if (capa - (capa >> 6) <= new_len) {
1424 ary_double_capa(ary, new_len);
1433 ary_make_shared(ary);
1438 if (head - sharedp <
argc) {
1441 room = capa - new_len;
1444 head = sharedp +
argc + room;
1483 rb_ary_modify_check(ary);
1487 target_ary = ary_ensure_room_for_unshift(ary,
argc);
1488 ary_memcpy0(ary, 0,
argc,
argv, target_ary);
1496 return rb_ary_unshift_m(1,&item,ary);
1501rb_ary_elt(
VALUE ary,
long offset)
1505 if (offset < 0 ||
len <= offset) {
1514 return rb_ary_entry_internal(ary, offset);
1523 if (beg > alen)
return Qnil;
1524 if (beg < 0 ||
len < 0)
return Qnil;
1526 if (alen <
len || alen < beg +
len) {
1530 if (
len == 0)
return ary_new(
klass, 0);
1532 return ary_make_partial(ary,
klass, beg,
len);
1578 return rb_ary_aref2(ary,
argv[0],
argv[1]);
1722 if (block_given &&
argc == 2) {
1723 rb_warn(
"block supersedes default value argument");
1731 if (block_given)
return rb_yield(pos);
1785 rb_warn(
"given block not used");
1839 rb_warn(
"given block not used");
1857 if (!
NIL_P(tmp))
return tmp;
1862rb_ary_splice(
VALUE ary,
long beg,
long len,
const VALUE *rptr,
long rlen)
1876 if (olen <
len || olen < beg +
len) {
1882 rofs = (rptr >= optr && rptr < optr + olen) ? rptr - optr : -1;
1890 target_ary = ary_ensure_room_for_push(ary, rlen-
len);
1892 ary_mem_clear(ary, olen, beg - olen);
1895 ary_memcpy0(ary, beg, rlen, rptr, target_ary);
1906 alen = olen + rlen -
len;
1908 ary_double_capa(ary, alen);
1936 rb_ary_modify_check(ary);
1941 rb_bug(
"probable buffer overflow: %ld for %ld",
len, capa);
1961 if (
len == olen)
return ary;
1967 ary_double_capa(ary,
len);
1969 ary_mem_clear(ary, olen,
len - olen);
1984 ary_heap_realloc(ary,
len);
2031 long offset, beg,
len;
2035 rb_ary_modify_check(ary);
2041 rb_ary_modify_check(ary);
2083 rb_ary_modify_check(ary);
2085 if (
argc == 1)
return ary;
2097 rb_ary_splice(ary, pos, 0,
argv + 1,
argc - 1);
2102rb_ary_length(
VALUE ary);
2107 return rb_ary_length(ary);
2159rb_ary_each_index(
VALUE ary)
2186rb_ary_reverse_each(
VALUE ary)
2214rb_ary_length(
VALUE ary)
2230rb_ary_empty_p(
VALUE ary)
2267 int *first = (
int *)
arg[3];
2273 ary_join_1(
obj, ary, sep, 0, result, first);
2285 for (
i=0;
i<max;
i++) {
2287 if (
i > 0 && !
NIL_P(sep))
2299 if (
i > 0 && !
NIL_P(sep))
2324 args[3] = (
VALUE)first;
2350 VALUE val, tmp, result;
2362 if (
NIL_P(tmp) || tmp != val) {
2366 ary_join_0(ary, sep,
i, result);
2368 ary_join_1(ary, ary, sep,
i, result, &first);
2378 ary_join_0(ary, sep,
RARRAY_LEN(ary), result);
2409 rb_warn(
"$, is set to non-nil value");
2446rb_ary_inspect(
VALUE ary)
2455 return rb_ary_inspect(ary);
2468rb_ary_to_a(
VALUE ary)
2497rb_ary_to_h(
VALUE ary)
2504 const VALUE e = rb_ary_elt(ary,
i);
2507 if (
NIL_P(key_value_pair)) {
2528rb_ary_to_ary_m(
VALUE ary)
2553 ary_reverse(p1, p2);
2571rb_ary_reverse_bang(
VALUE ary)
2587rb_ary_reverse_m(
VALUE ary)
2595 do *p2-- = *p1++;
while (--
len > 0);
2602rotate_count(
long cnt,
long len)
2700sort_reentered(
VALUE ary)
2709sort_1(
const void *ap,
const void *
bp,
void *dummy)
2712 VALUE retval = sort_reentered(data->
ary);
2721 sort_reentered(data->
ary);
2726sort_2(
const void *ap,
const void *
bp,
void *dummy)
2729 VALUE retval = sort_reentered(data->
ary);
2734 if ((
long)a > (
long)b)
return 1;
2735 if ((
long)a < (
long)b)
return -1;
2747 sort_reentered(data->
ary);
2782 VALUE tmp = ary_make_substitution(
ary);
2796 rb_ary_unshare(
ary);
2814 rb_ary_unshare(
ary);
2931 VALUE index_result = rb_ary_bsearch_index(
ary);
2936 return index_result;
2956 int smaller = 0, satisfied = 0;
2960 while (low < high) {
2961 mid = low + ((high - low) / 2);
2979 case 1: smaller = 1;
break;
2980 case -1: smaller = 0;
2985 " (must be numeric, true, false or nil)",
2995 if (!satisfied)
return Qnil;
3109 long beg,
len,
i, j;
3118 long end = olen < beg+
len ? olen : beg+
len;
3119 for (j = beg; j < end; j++) {
3142 const long end = beg +
len;
3183 append_values_at_single(result,
ary, olen,
argv[
i]);
3234select_bang_i(
VALUE a)
3248 return (i1 == i2) ?
Qnil :
ary;
3252select_bang_ensure(
VALUE a)
3257 long i1 =
arg->len[0], i2 =
arg->len[1];
3259 if (i2 <
len && i2 < i1) {
3302 args.len[0] = args.len[1] = 0;
3327 rb_ary_select_bang(
ary);
3339 ary_resize_capa(
ary,
len * 2);
3389 ary_resize_smaller(
ary, i2);
3415 ary_resize_smaller(
ary, i2);
3427 if (pos < 0)
return Qnil;
3486 long pos,
len, orig_len;
3488 rb_ary_modify_check(
ary);
3497 if (pos < 0)
return Qnil;
3499 else if (orig_len < pos)
return Qnil;
3500 if (orig_len < pos +
len) {
3501 len = orig_len - pos;
3506 rb_ary_splice(
ary, pos,
len, 0, 0);
3517 goto delete_pos_len;
3546reject_bang_i(
VALUE a)
3560 return (i1 == i2) ?
Qnil :
ary;
3567 rb_ary_modify_check(
ary);
3569 args.len[0] = args.len[1] = 0;
3593 return ary_reject_bang(
ary);
3616 ary_reject(
ary, rejected_ary);
3617 return rejected_ary;
3643 ary_reject_bang(
ary);
3666 args[0] = result; args[1] = (
VALUE)
n;
3719 for (j=0; j<
argc; j++) {
3720 tmp[j+1] = rb_ary_elt(
argv[j],
i);
3732 for (j=0; j<
argc; j++) {
3746 for (j=0; j<
argc; j++) {
3772 long elen = -1, alen,
i, j;
3773 VALUE tmp, result = 0;
3777 for (
i=0;
i<alen;
i++) {
3782 for (j=0; j<elen; j++) {
3790 for (j=0; j<elen; j++) {
3813 rb_ary_modify_check(copy);
3815 if (copy == orig)
return copy;
3818 VALUE shared_root = 0;
3821 ary_heap_free(copy);
3830 rb_ary_decrement_share(shared_root);
3835 VALUE shared_root = ary_make_shared(orig);
3837 ary_heap_free(copy);
3840 rb_ary_unshare_safe(copy);
3845 rb_ary_set_shared(copy, shared_root);
3864 rb_ary_modify_check(
ary);
3867 rb_ary_unshare(
ary);
3916 long beg = 0, end = 0,
len = 0;
3939 if (beg < 0) beg = 0;
3954 ary_resize_capa(
ary, end);
3964 for (
i=beg;
i<end;
i++) {
3971 ary_memfill(
ary, beg,
len, item);
4003 long len, xlen, ylen;
4050 rb_ary_modify_check(
ary);
4055 else if (
argc > 1) {
4061 ary_append(
ary, args);
4071 return ary_append(x,
to_ary(y));
4122 ary_memcpy(ary2, 0, t,
ptr);
4123 while (t <=
len/2) {
4208 const VALUE *p1, *p2;
4217 for (
i = 0;
i < len1;
i++) {
4255 if (ary1 == ary2)
return Qtrue;
4274 if (!
rb_eql(rb_ary_elt(ary1,
i), rb_ary_elt(ary2,
i)))
4291 if (ary1 == ary2)
return Qtrue;
4380 VALUE e1 = rb_ary_elt(ary1,
i), e2 = rb_ary_elt(ary2,
i);
4427 if (ary1 == ary2)
return INT2FIX(0);
4461 VALUE hash = ary_tmp_hash_new(
ary);
4462 return ary_add_hash(hash,
ary);
4480 VALUE hash = ary_tmp_hash_new(
ary);
4481 return ary_add_hash_by(hash,
ary);
4485ary_recycle_hash(
VALUE hash)
4530 VALUE elt = rb_ary_elt(ary1,
i);
4531 if (rb_ary_includes_by_eql(ary2, elt))
continue;
4537 hash = ary_make_hash(ary2);
4542 ary_recycle_hash(hash);
4594 for (j = 0; j <
argc; j++) {
4600 if (rb_ary_includes_by_eql(
argv[j], elt))
break;
4642 if (!rb_ary_includes_by_eql(ary2,
v))
continue;
4643 if (rb_ary_includes_by_eql(ary3,
v))
continue;
4649 hash = ary_make_hash(ary2);
4658 ary_recycle_hash(hash);
4687 result = rb_ary_and(result,
argv[
i]);
4707 if (rb_ary_includes_by_eql(ary_union, elt))
continue;
4747 rb_ary_union(ary3, ary1);
4748 rb_ary_union(ary3, ary2);
4752 hash = ary_make_hash(ary1);
4753 rb_ary_union_hash(hash, ary2);
4756 ary_recycle_hash(hash);
4781 VALUE hash, ary_union;
4792 rb_ary_union(ary_union,
ary);
4793 for (
i = 0;
i <
argc;
i++) rb_ary_union(ary_union,
argv[
i]);
4798 hash = ary_make_hash(
ary);
4799 for (
i = 0;
i <
argc;
i++) rb_ary_union_hash(hash,
argv[
i]);
4802 ary_recycle_hash(hash);
4924rb_ary_minmax(
VALUE ary)
4929 return rb_assoc_new(rb_ary_min(0, 0, ary), rb_ary_max(0, 0, ary));
4967rb_ary_uniq_bang(
VALUE ary)
4972 rb_ary_modify_check(ary);
4976 hash = ary_make_hash_by(ary);
4978 hash = ary_make_hash(ary);
4984 rb_ary_modify_check(ary);
4987 rb_ary_unshare(ary);
4990 ary_resize_capa(ary, hash_size);
4992 ary_recycle_hash(hash);
5019rb_ary_uniq(
VALUE ary)
5028 hash = ary_make_hash_by(ary);
5032 hash = ary_make_hash(ary);
5037 ary_recycle_hash(hash);
5056rb_ary_compact_bang(
VALUE ary)
5073 ary_resize_smaller(ary,
n);
5089rb_ary_compact(
VALUE ary)
5092 rb_ary_compact_bang(ary);
5137 rb_warn(
"given block not used");
5148flatten(
VALUE ary,
int level)
5151 VALUE stack, result, tmp, elt, vmemo;
5189 if (level >= 0 &&
RARRAY_LEN(stack) / 2 >= level) {
5262 int mod = 0, level = -1;
5266 rb_ary_modify_check(ary);
5268 if (level == 0)
return Qnil;
5270 result = flatten(ary, level);
5271 if (result == ary) {
5311 if (level == 0)
return ary_make_shared_copy(ary);
5314 result = flatten(ary, level);
5315 if (result == ary) {
5316 result = ary_make_shared_copy(ary);
5322#define OPTHASH_GIVEN_P(opts) \
5323 (argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1))
5326#define RAND_UPTO(max) (long)rb_random_ulong_limited((randgen), (max)-1)
5354 keyword_ids[0] = id_random;
5399 rb_ary_shuffle_bang(
argc,
argv, ary);
5436 long n,
len,
i, j, k, idx[10];
5438 long memo_threshold;
5444 keyword_ids[0] = id_random;
5457 return rb_ary_elt(ary,
i);
5464 for (
i = 0;
i <
n; ++
i) {
5471 for (
i = 0;
i <
n; ++
i) {
5493 if (j >=
i) l =
i, g = ++j;
5494 if (k >= l && (++k >= g)) ++k;
5505 sorted[0] = idx[0] = rnds[0];
5506 for (
i=1;
i<
n;
i++) {
5508 for (j = 0; j <
i; ++j) {
5509 if (k < sorted[j])
break;
5512 memmove(&sorted[j+1], &sorted[j],
sizeof(sorted[0])*(
i-j));
5513 sorted[j] = idx[
i] = k;
5517 for (
i=0;
i<
n;
i++) {
5522 else if (
n <= memo_threshold / 2) {
5524#undef RUBY_UNTYPED_DATA_WARNING
5525#define RUBY_UNTYPED_DATA_WARNING 0
5531 for (
i=0;
i<
n;
i++) {
5534 if (r > max_idx) max_idx = r;
5537 if (
len <= max_idx)
n = 0;
5540 for (
i=0;
i<
n;
i++) {
5541 long j2 = j = ptr_result[
i];
5547 ptr_result[
i] = ptr_ary[j2];
5559 for (
i=0;
i<
n;
i++) {
5562 ptr_result[j] = ptr_result[
i];
5586 return rb_fix_mul_fix(rb_ary_length(
self),
n);
5622 if (
n <= 0)
return Qnil;
5633#define tmpary(n) rb_ary_tmp_new(n)
5634#define tmpary_discard(a) (ary_discard(a), RBASIC_SET_CLASS_RAW(a, rb_cArray))
5642yield_indexed_values(
const VALUE values,
const long r,
const long *
const p)
5650 return !
RBASIC(values)->klass;
5666permute0(
const long n,
const long r,
long *
const p,
char *
const used,
const VALUE values)
5671 const char *
const unused =
memchr(&used[
i], 0,
n-
i);
5686 for (
i = 0;
i <
n; ++
i) {
5687 if (used[
i])
continue;
5689 if (!yield_indexed_values(values, r, p)) {
5705descending_factorial(
long from,
long how_many)
5710 while (--how_many > 0) {
5722binomial_coefficient(
long comb,
long size)
5726 if (comb >
size-comb) {
5732 else if (comb == 0) {
5736 for (
i = 1;
i < comb; ++
i) {
5749 return descending_factorial(
n, k);
5791 if (r < 0 ||
n < r) {
5805 char *used = (
char*)(p + r);
5806 VALUE ary0 = ary_make_shared_copy(ary);
5811 permute0(
n, r, p, used, ary0);
5819combinate0(
const long len,
const long n,
long *
const stack,
const VALUE values)
5826 for (lev++; lev <
n; lev++) {
5827 stack[lev+1] = stack[lev]+1;
5829 if (!yield_indexed_values(values,
n, stack+1)) {
5833 if (lev == 0)
return;
5835 }
while (stack[lev+1]+
n ==
len+lev+1);
5845 return binomial_coefficient(k,
n);
5881 if (
n < 0 ||
len <
n) {
5893 VALUE ary0 = ary_make_shared_copy(ary);
5898 combinate0(
len,
n, stack, ary0);
5918rpermute0(
const long n,
const long r,
long *
const p,
const VALUE values)
5924 if (++
index < r-1) {
5928 for (
i = 0;
i <
n; ++
i) {
5930 if (!yield_indexed_values(values, r, p)) {
5935 if (
index <= 0)
return;
5936 }
while ((
i = ++p[--
index]) >=
n);
5979rb_ary_repeated_permutation(
VALUE ary,
VALUE num)
6001 VALUE ary0 = ary_make_shared_copy(ary);
6004 rpermute0(
n, r, p, ary0);
6012rcombinate0(
const long n,
const long r,
long *
const p,
const long rest,
const VALUE values)
6018 if (++
index < r-1) {
6022 for (;
i <
n; ++
i) {
6024 if (!yield_indexed_values(values, r, p)) {
6029 if (
index <= 0)
return;
6030 }
while ((
i = ++p[--
index]) >=
n);
6042 return binomial_coefficient(k,
n + k - 1);
6073rb_ary_repeated_combination(
VALUE ary,
VALUE num)
6091 else if (
len == 0) {
6097 VALUE ary0 = ary_make_shared_copy(ary);
6100 rcombinate0(
len,
n, p,
n, ary0);
6145 for (
i = 1;
i <
n;
i++) arrays[
i] =
Qnil;
6149 for (
i = 0;
i <
n;
i++) counters[
i] = 0;
6154 for (
i = 0;
i <
n;
i++) {
6156 arrays[
i] = ary_make_shared_copy(arrays[
i]);
6161 for (
i = 0;
i <
n;
i++) {
6177 for (j = 0; j <
n; j++) {
6182 if (
NIL_P(result)) {
6202 while (counters[m] ==
RARRAY_LEN(arrays[m])) {
6205 if (--m < 0)
goto done;
6213 return NIL_P(result) ? ary : result;
6259rb_ary_take_while(
VALUE ary)
6319rb_ary_drop_while(
VALUE ary)
6347 rb_warn(
"given block not used");
6354 for (
i = 0;
i <
len; ++
i) {
6383 rb_warn(
"given block not used");
6390 for (
i = 0;
i <
len; ++
i) {
6419 rb_warn(
"given block not used");
6426 for (
i = 0;
i <
len; ++
i) {
6456 rb_warn(
"given block not used");
6460 if (result)
return Qfalse;
6466 for (
i = 0;
i <
len; ++
i) {
6468 if (result)
return Qfalse;
6476 if (result)
return Qfalse;
6505 if (!--
argc)
return self;
6610 v = finish_exact_sum(
n, r,
v,
argc!=0);
6614 v = finish_exact_sum(
n, r,
v,
i!=0);
6626 goto has_float_value;
6671 goto has_some_value;
6683rb_ary_deconstruct(
VALUE ary)
6930#define rb_intern(str) rb_intern_const(str)
void rb_mem_clear(VALUE *mem, long size)
VALUE rb_ary_new_from_values(long n, const VALUE *elts)
#define ARY_OWNS_HEAP_P(a)
void rb_ary_transient_heap_evacuate(VALUE ary, int promote)
#define FL_UNSET_EMBED(ary)
VALUE rb_ary_includes(VALUE ary, VALUE item)
#define FL_SET_SHARED(ary)
#define ARY_SHARED_ROOT_REFCNT(ary)
#define ARY_SET_SHARED(ary, value)
void rb_ary_detransient(VALUE ary)
#define ARY_SHARED_P(ary)
VALUE rb_ary_assoc(VALUE ary, VALUE key)
RUBY_FUNC_EXPORTED size_t rb_ary_memsize(VALUE ary)
void rb_ary_store(VALUE ary, long idx, VALUE val)
VALUE rb_ary_reverse(VALUE ary)
#define ARY_INCREASE_PTR(ary, n)
VALUE rb_ary_shift(VALUE ary)
VALUE rb_ary_tmp_new_fill(long capa)
VALUE rb_ary_sort(VALUE ary)
VALUE rb_to_array_type(VALUE ary)
#define tmpary_discard(a)
VALUE rb_get_values_at(VALUE obj, long olen, int argc, const VALUE *argv, VALUE(*func)(VALUE, long))
VALUE rb_ary_resurrect(VALUE ary)
VALUE rb_ary_dup(VALUE ary)
VALUE rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
MJIT_FUNC_EXPORTED VALUE rb_ary_behead(VALUE ary, long n)
VALUE rb_ary_push(VALUE ary, VALUE item)
void rb_ary_free(VALUE ary)
VALUE rb_ary_freeze(VALUE ary)
VALUE rb_ary_each(VALUE ary)
VALUE rb_ary_last(int argc, const VALUE *argv, VALUE ary)
VALUE rb_ary_delete(VALUE ary, VALUE item)
VALUE rb_ary_delete_at(VALUE ary, long pos)
MJIT_FUNC_EXPORTED VALUE rb_check_to_array(VALUE ary)
void rb_ary_set_len(VALUE ary, long len)
#define ARY_SHARED_ROOT(ary)
#define ARY_SHARED_ROOT_OCCUPIED(ary)
VALUE * rb_ary_ptr_use_start(VALUE ary)
VALUE rb_ary_unshift(VALUE ary, VALUE item)
void rb_ary_modify(VALUE ary)
VALUE rb_ary_replace(VALUE copy, VALUE orig)
#define ARY_SET_SHARED_ROOT_REFCNT(ary, value)
void rb_ary_ptr_use_end(VALUE ary)
#define ARY_SET_HEAP_LEN(ary, n)
VALUE() rb_ary_new_from_args(long n,...)
#define RARRAY_SHARED_ROOT_FLAG
VALUE rb_ary_to_ary(VALUE obj)
VALUE rb_ary_concat(VALUE x, VALUE y)
#define ARY_SET_EMBED_LEN(ary, n)
VALUE rb_ary_shared_with_p(VALUE ary1, VALUE ary2)
#define ARY_SET_LEN(ary, n)
VALUE rb_ary_new_capa(long capa)
VALUE rb_check_array_type(VALUE ary)
VALUE rb_ary_resize(VALUE ary, long len)
expands or shrinks ary to len elements.
#define ARY_SHARED_ROOT_P(ary)
VALUE rb_ary_pop(VALUE ary)
#define FL_SET_SHARED_ROOT(ary)
VALUE rb_ary_tmp_new(long capa)
VALUE rb_ary_clear(VALUE ary)
VALUE rb_ary_subseq(VALUE ary, long beg, long len)
VALUE rb_ary_at(VALUE ary, VALUE pos)
void rb_ary_delete_same(VALUE ary, VALUE item)
#define FL_UNSET_SHARED(ary)
#define ARY_SET_CAPA(ary, n)
MJIT_FUNC_EXPORTED VALUE rb_ary_tmp_new_from_values(VALUE klass, long n, const VALUE *elts)
VALUE rb_ary_plus(VALUE x, VALUE y)
VALUE rb_ary_rotate(VALUE ary, long cnt)
VALUE rb_ary_cmp(VALUE ary1, VALUE ary2)
#define OPTHASH_GIVEN_P(opts)
VALUE rb_ary_to_s(VALUE ary)
VALUE rb_ary_cat(VALUE ary, const VALUE *argv, long len)
VALUE rb_ary_entry(VALUE ary, long offset)
#define ARY_INCREASE_LEN(ary, n)
MJIT_FUNC_EXPORTED VALUE rb_ary_aref1(VALUE ary, VALUE arg)
VALUE rb_ary_sort_bang(VALUE ary)
#define ARY_SET_PTR(ary, p)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
VALUE rb_ary_join(VALUE ary, VALUE sep)
VALUE rb_ary_rassoc(VALUE ary, VALUE value)
#define range(low, item, hi)
VALUE rb_enc_associate(VALUE obj, rb_encoding *enc)
void rb_enc_copy(VALUE obj1, VALUE obj2)
rb_encoding * rb_usascii_encoding(void)
#define rb_cmpint(cmp, a, b)
char str[HTML_ESCAPE_MAX_LEN+1]
void rb_include_module(VALUE, VALUE)
VALUE rb_define_class(const char *, VALUE)
Defines a top-level class.
void rb_define_alias(VALUE, const char *, const char *)
Defines an alias of a method.
int rb_block_given_p(void)
Determines if the current method is given a block.
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *)
VALUE rb_cObject
Object class.
void rb_raise(VALUE exc, const char *fmt,...)
void rb_bug(const char *fmt,...)
void rb_warn(const char *fmt,...)
VALUE rb_ensure(VALUE(*)(VALUE), VALUE, VALUE(*)(VALUE), VALUE)
An equivalent to ensure clause.
VALUE rb_obj_dig(int argc, VALUE *argv, VALUE self, VALUE notfound)
int rb_eql(VALUE, VALUE)
Determines if obj1 and obj2 are equal in terms of Object::eql?.
VALUE rb_obj_class(VALUE)
Equivalent to Object#class in Ruby.
VALUE rb_inspect(VALUE)
Convenient wrapper of Object::inspect.
VALUE rb_convert_type_with_id(VALUE, int, const char *, ID)
double rb_num2dbl(VALUE)
Converts a Numeric object to double.
VALUE rb_equal(VALUE, VALUE)
Same as Object#===, case equality.
VALUE rb_obj_is_kind_of(VALUE, VALUE)
Determines if obj is a kind of c.
VALUE rb_obj_freeze(VALUE)
Make the object unmodifiable.
VALUE rb_check_convert_type_with_id(VALUE, int, const char *, ID)
rb_atomic_t cnt[RUBY_NSIG]
void st_free_table(st_table *tab)
st_table * st_init_numtable_with_size(st_index_t size)
int st_delete(st_table *tab, st_data_t *key, st_data_t *value)
st_table * st_init_numtable(void)
int st_insert(st_table *tab, st_data_t key, st_data_t value)
void st_clear(st_table *tab)
int st_lookup(st_table *tab, st_data_t key, st_data_t *value)
struct cmp_opt_data cmp_opt
void * rb_transient_heap_alloc(VALUE obj, size_t req_size)
int rb_transient_heap_managed_ptr_p(const void *ptr)
void rb_transient_heap_verify(void)
void ruby_qsort(void *, const size_t, const size_t, int(*)(const void *, const void *, void *), void *)