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/