[#17002] strict prototype for c++ — Takaaki Tateishi <ttate@...>
立石です.
At Fri, 3 May 2002 02:59:36 +0900,
[#17017] 標準添付案 — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
At Wed, 8 May 2002 19:50:17 +0900,
At Wed, 8 May 2002 22:45:06 +0900,
At Thu, 9 May 2002 00:47:46 +0900,
田中です。一応 blade は見てます。
堀之内です。
堀之内です。
At Tue, 14 May 2002 14:45:28 +0900,
[#17031] double acosh — WATANABE Hirofumi <eban@...>
わたなべです。
なかだです。
わたなべです。
まつもと ゆきひろです
わたなべです。
[#17037] here document2 つで __LINE__ がずれる — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#17053] socket in Win32 — nobu.nakada@...
なかだです。
[#17059] [PATCH] mswin32 configure — nobu.nakada@...
なかだです。
[#17060] rb_warn — Tadayoshi Funaba <tadf@...>
ふなばです。
[#17095] irb & jarh — Tanaka Akira <akr@...17n.org>
ふと、irb で jarh をいくつか試したのですが、うまく扱えないものがあるようです。
けいじゅ@日本ラショナルソフトウェアです.
In article <200205160811.RAA31441@ishitsuka.com>,
[#17112] [Cleanup] rb_thread_select() — nobu.nakada@...
なかだです。
[#17122] Array#bsearch — Beyond <beyond@...>
[#17128] Thread: deadlock trouble — nagai@...
永井@知能.九工大です.
At Fri, 17 May 2002 14:47:53 +0900,
[#17134] argv[0] — Tanaka Akira <akr@...17n.org>
ふと ruby インタプリタの C における argv[0] を知りたくなったんですが、
まつもと ゆきひろです
In article <1021723554.017958.5113.nullmailer@picachu.netlab.jp>,
In article <1021723554.017958.5113.nullmailer@picachu.netlab.jp>,
[#17144] Re: msvcrt — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
なかだです。
[#17158] else without rescue — nobu.nakada@...
なかだです。
[#17179] コマンドラインオプションの順序制約 — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
[#17194] [RCR] Array#rotate{,!} — nobu.nakada@...
なかだです。
まつもと ゆきひろです
[#17208] Etc — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#17223] race condition on Queue#pop? — Tanaka Akira <akr@...17n.org>
なんとなく thread.rb を眺めていて、Queue#pop に race condition がある
なかだです。
まつもと ゆきひろです
なかだです。
[#17228] Re: [ruby-list:35305] Re: ((1.2)..(3.4)).to_a — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
たけ(tk)です。
まつもと ゆきひろです
たけ(tk)です。
まつもと ゆきひろです
あづみです。
[#17238] Re: [ruby-list:35304] Re: ((1.2)..(3.4)).to_a — siena@... (Siena.)
Siena. です。
[ruby-dev:17210] Re: [RCR] Array#rotate{,!}
なかだです。
At Thu, 23 May 2002 17:05:22 +0900,
U.Nakamura <usa@osb.att.ne.jp> wrote:
> | RCR(http://www.rubygarden.org/article.php?sid=237)に書いときま
> | したが、Array#rotate{,!}というのはどうでしょうか。自明かとは思
> | いますが、
>
> 回転寿司シミュレータ(なんじゃそりゃ)に便利かも。
オヤジがまわってる?
> | --- Array#rotate!(index)
> | self[index]が先頭になるように回転する。変更されたときはself、
> | されなかったときはnilを返す。
> |
> | --- Array#rotate(index)
> | 回転された新しいArrayを返す。
>
> 省略時引数として index = 1 というのを消極的に提案します。
うーむ。indexをmoduloにしたりして消極的なパッチ。
Index: array.c
===================================================================
RCS file: /cvs/ruby/src/ruby/array.c,v
retrieving revision 1.83
diff -u -2 -p -r1.83 array.c
--- array.c 2002/05/22 05:57:08 1.83
+++ array.c 2002/05/23 10:34:08
@@ -1027,4 +1027,15 @@ rb_ary_to_a(ary)
}
+static void
+ary_reverse(p1, p2)
+ VALUE *p1, *p2;
+{
+ while (p1 < p2) {
+ VALUE tmp = *p1;
+ *p1++ = *p2;
+ *p2-- = tmp;
+ }
+}
+
VALUE
rb_ary_reverse(ary)
@@ -1032,5 +1043,4 @@ rb_ary_reverse(ary)
{
VALUE *p1, *p2;
- VALUE tmp;
rb_ary_modify(ary);
@@ -1039,11 +1049,6 @@ rb_ary_reverse(ary)
p1 = RARRAY(ary)->ptr;
p2 = p1 + RARRAY(ary)->len - 1; /* points last item */
+ ary_reverse(p1, p2);
- while (p1 < p2) {
- tmp = *p1;
- *p1++ = *p2;
- *p2-- = tmp;
- }
-
return ary;
}
@@ -1064,4 +1069,99 @@ rb_ary_reverse_m(ary)
}
+static unsigned long
+modulo_index(x, y)
+ long x;
+ unsigned long y;
+{
+ /* x must not be LONG_MIN */
+ if (x < 0) {
+ if (x == LONG_MIN) return y - (-(LONG_MIN+1UL) % y + 1) % y;
+ return y - (unsigned long)-x % y;
+ }
+ else {
+ return (unsigned long)x % y;
+ }
+}
+
+VALUE
+rb_ary_rotate(ary, cnt)
+ VALUE ary;
+ long cnt;
+{
+ rb_ary_modify(ary);
+
+ if (cnt != 0) {
+ VALUE *ptr = RARRAY(ary)->ptr;
+ long len = RARRAY(ary)->len;
+
+ cnt = modulo_index(cnt, len);
+ if (cnt == 0) return Qnil;
+
+ --len;
+ if (cnt > 1) ary_reverse(ptr, ptr + cnt - 1);
+ if (cnt < len) ary_reverse(ptr + cnt, ptr + len);
+ if (len > 0) ary_reverse(ptr, ptr + len);
+ return ary;
+ }
+
+ return Qnil;
+}
+
+static long
+rotate_arg(argc, argv)
+ int argc;
+ VALUE *argv;
+{
+ long n = 1;
+
+ switch (argc) {
+ case 1:
+ n = NUM2LONG(argv[0]);
+ case 0:
+ break;
+ default:
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
+ }
+
+ return n;
+}
+
+static VALUE
+rb_ary_rotate_bang(argc, argv, ary)
+ int argc;
+ VALUE *argv;
+ VALUE ary;
+{
+ long n = rotate_arg(argc, argv);
+
+ if (RARRAY(ary)->len <= 1) return Qnil;
+ return rb_ary_rotate(ary, n);
+}
+
+static VALUE
+rb_ary_rotate_m(argc, argv, ary)
+ int argc;
+ VALUE *argv;
+ VALUE ary;
+{
+ VALUE rotated;
+ VALUE *ptr = RARRAY(ary)->ptr;
+ long len = RARRAY(ary)->len;
+ long n = rotate_arg(argc, argv);
+
+ if (len > 1 && n != 0)
+ n = modulo_index(n, len);
+ else
+ n = 0;
+
+ rotated = rb_ary_new2(len);
+ DUPSETUP(rotated, ary);
+ RARRAY(rotated)->len = len;
+ len -= n;
+ MEMCPY(RARRAY(rotated)->ptr, ptr + n, VALUE, len);
+ MEMCPY(RARRAY(rotated)->ptr + len, ptr, VALUE, n);
+ return rotated;
+}
+
int
rb_cmpint(cmp)
@@ -1879,4 +1979,6 @@ Init_Array()
rb_define_method(rb_cArray, "reverse", rb_ary_reverse_m, 0);
rb_define_method(rb_cArray, "reverse!", rb_ary_reverse_bang, 0);
+ rb_define_method(rb_cArray, "rotate", rb_ary_rotate_m, -1);
+ rb_define_method(rb_cArray, "rotate!", rb_ary_rotate_bang, -1);
rb_define_method(rb_cArray, "sort", rb_ary_sort, 0);
rb_define_method(rb_cArray, "sort!", rb_ary_sort_bang, 0);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦