summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-01-30 05:11:03 +0000
committermarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-01-30 05:11:03 +0000
commit39048aca7592a4096380f45f421bad578b61efb8 (patch)
tree43d9ac2aed6a5abd87a5cf28c40257e4dca016b2
parentddea0c823239d2eb9b699dc00adf6b0963913d27 (diff)
* array.c (rb_ary_bsearch): Return enumerator if no block [#7725]
* range.c (range_bsearch): ditto * test/ruby/test_array.rb: Test for above * test/ruby/test_range.rb: ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38984 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog10
-rw-r--r--array.c1
-rw-r--r--range.c2
-rw-r--r--test/ruby/test_array.rb6
-rw-r--r--test/ruby/test_range.rb6
5 files changed, 25 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 53d2e44014..70c16e6607 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Wed Jan 30 14:10:52 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * array.c (rb_ary_bsearch): Return enumerator if no block [#7725]
+
+ * range.c (range_bsearch): ditto
+
+ * test/ruby/test_array.rb: Test for above
+
+ * test/ruby/test_range.rb: ditto
+
Wed Jan 30 13:53:43 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
* lib/matrix.rb: Take conjugate for inner product
diff --git a/array.c b/array.c
index 5d91b38884..3f448063ce 100644
--- a/array.c
+++ b/array.c
@@ -2438,6 +2438,7 @@ rb_ary_bsearch(VALUE ary)
int smaller = 0, satisfied = 0;
VALUE v, val;
+ RETURN_ENUMERATOR(ary, 0, 0);
while (low < high) {
mid = low + ((high - low) / 2);
val = rb_ary_entry(ary, mid);
diff --git a/range.c b/range.c
index 6bced0a3eb..12436cea05 100644
--- a/range.c
+++ b/range.c
@@ -595,6 +595,7 @@ range_bsearch(VALUE range)
#define BSEARCH(conv) \
do { \
+ RETURN_ENUMERATOR(range, 0, 0); \
if (EXCL(range)) high--; \
org_high = high; \
while (low < high) { \
@@ -639,6 +640,7 @@ range_bsearch(VALUE range)
VALUE low = beg;
VALUE high = end;
VALUE mid, org_high;
+ RETURN_ENUMERATOR(range, 0, 0);
if (EXCL(range)) high = rb_funcall(high, '-', 1, INT2FIX(1));
org_high = high;
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 6c7f920d79..ae0f76c970 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -2249,6 +2249,12 @@ class TestArray < Test::Unit::TestCase
assert_raise(ArgumentError) { a.rotate!(1, 1) }
end
+ def test_bsearch_with_no_block
+ enum = [1, 2, 42, 100, 666].bsearch
+ assert_nil enum.size
+ assert_equal 42, enum.each{|x| x >= 33 }
+ end
+
def test_bsearch_in_find_minimum_mode
a = [0, 4, 7, 10, 12]
assert_equal(4, a.bsearch {|x| x >= 4 })
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index f8e9658728..c8867cf2ec 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -356,6 +356,12 @@ class TestRange < Test::Unit::TestCase
assert_equal 42, (1..42).each.size
end
+ def test_bsearch_with_no_block
+ enum = (42...666).bsearch
+ assert_nil enum.size
+ assert_equal 200, enum.each{|x| x >= 200 }
+ end
+
def test_bsearch_for_fixnum
ary = [3, 4, 7, 9, 12]
assert_equal(0, (0...ary.size).bsearch {|i| ary[i] >= 2 })