[#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:17194] [RCR] Array#rotate{,!}
なかだです。
RCR(http://www.rubygarden.org/article.php?sid=237)に書いときま
したが、Array#rotate{,!}というのはどうでしょうか。自明かとは思
いますが、
--- Array#rotate!(index)
self[index]が先頭になるように回転する。変更されたときはself、
されなかったときはnilを返す。
--- Array#rotate(index)
回転された新しいArrayを返す。
ということでパッチ。
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 03:54:57
@@ -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,10 +1049,5 @@ rb_ary_reverse(ary)
p1 = RARRAY(ary)->ptr;
p2 = p1 + RARRAY(ary)->len - 1; /* points last item */
-
- while (p1 < p2) {
- tmp = *p1;
- *p1++ = *p2;
- *p2-- = tmp;
- }
+ ary_reverse(p1, p2);
return ary;
@@ -1064,4 +1069,76 @@ rb_ary_reverse_m(ary)
}
+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;
+
+ if (cnt < 0) {
+ cnt += len;
+ if (cnt < 0) {
+ rb_raise(rb_eIndexError, "index %ld out of array", cnt - len);
+ }
+ if (cnt == 0) return Qnil;
+ }
+ else {
+ if (cnt >= len) {
+ rb_raise(rb_eIndexError, "index %ld out of array", cnt);
+ }
+ }
+
+ --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 VALUE
+rb_ary_rotate_bang(ary, cnt)
+ VALUE ary, cnt;
+{
+ long n = NUM2LONG(cnt);
+
+ if (RARRAY(ary)->len <= 1) return Qnil;
+ return rb_ary_rotate(ary, n);
+}
+
+static VALUE
+rb_ary_rotate_m(ary, cnt)
+ VALUE ary, cnt;
+{
+ long n = NUM2LONG(cnt), len = RARRAY(ary)->len;
+ VALUE rotated, *ptr = RARRAY(ary)->ptr;
+
+ if (n < 0) {
+ n += len;
+ if (n < 0) {
+ rb_raise(rb_eIndexError, "index %ld out of array", n - len);
+ }
+ }
+ else {
+ if (n >= len) {
+ rb_raise(rb_eIndexError, "index %ld out of array", n);
+ }
+ }
+
+ 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 +1956,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はできる。
中田 伸悦