[前][次][番号順一覧][スレッド一覧]

ruby-changes:25463

From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:15:52 +0900 (JST)
Subject: [ruby-changes:25463] marcandRe: r37520 (trunk): * string.c: Support for String#{each_byte,each_char,each_codepoint}.size

marcandre	2012-11-07 02:15:45 +0900 (Wed, 07 Nov 2012)

  New Revision: 37520

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37520

  Log:
    * string.c: Support for String#{each_byte,each_char,each_codepoint}.size
      [Feature #6636]

  Modified files:
    trunk/string.c
    trunk/test/ruby/test_enumerator.rb

Index: string.c
===================================================================
--- string.c	(revision 37519)
+++ string.c	(revision 37520)
@@ -6222,6 +6222,11 @@
     return orig;
 }
 
+static VALUE
+rb_str_each_byte_size(VALUE str, VALUE args)
+{
+    return LONG2FIX(RSTRING_LEN(str));
+}
 
 /*
  *  call-seq:
@@ -6246,13 +6251,27 @@
 {
     long i;
 
-    RETURN_ENUMERATOR(str, 0, 0);
+    RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_byte_size);
     for (i=0; i<RSTRING_LEN(str); i++) {
 	rb_yield(INT2FIX(RSTRING_PTR(str)[i] & 0xff));
     }
     return str;
 }
 
+static VALUE
+rb_str_each_char_size(VALUE str)
+{
+    long len = RSTRING_LEN(str);
+    if (!single_byte_optimizable(str)) {
+	const char *ptr = RSTRING_PTR(str);
+	rb_encoding *enc = rb_enc_get(str);
+	const char *end_ptr = ptr + len;
+	for (len = 0; ptr < end_ptr; ++len) {
+	    ptr += rb_enc_mbclen(ptr, end_ptr, enc);
+	}
+    }
+    return LONG2FIX(len);
+}
 
 /*
  *  call-seq:
@@ -6280,7 +6299,7 @@
     const char *ptr;
     rb_encoding *enc;
 
-    RETURN_ENUMERATOR(str, 0, 0);
+    RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_char_size);
     str = rb_str_new4(str);
     ptr = RSTRING_PTR(str);
     len = RSTRING_LEN(str);
@@ -6333,7 +6352,7 @@
     rb_encoding *enc;
 
     if (single_byte_optimizable(str)) return rb_str_each_byte(str);
-    RETURN_ENUMERATOR(str, 0, 0);
+    RETURN_SIZED_ENUMERATOR(str, 0, 0, rb_str_each_char_size);
     str = rb_str_new4(str);
     ptr = RSTRING_PTR(str);
     end = RSTRING_END(str);
Index: test/ruby/test_enumerator.rb
===================================================================
--- test/ruby/test_enumerator.rb	(revision 37519)
+++ test/ruby/test_enumerator.rb	(revision 37520)
@@ -550,5 +550,11 @@
     assert_equal 102, 1.downto(-100).size
     assert_equal Float::INFINITY, 42.upto(Float::INFINITY).size
   end
+
+  def test_size_for_string
+    assert_equal 5, 'hello'.each_byte.size
+    assert_equal 5, 'hello'.each_char.size
+    assert_equal 5, 'hello'.each_codepoint.size
+  end
 end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]