[compute] 44/49: Fix binary_find algorithm

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Fri Dec 18 17:58:21 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch master
in repository compute.

commit 10583d386851459c5605a2ab89f884527a750a7a
Author: Jakub Szuppe <j.szuppe at gmail.com>
Date:   Sat Sep 19 18:00:23 2015 +0200

    Fix binary_find algorithm
    
    This prevents iterators from going out of range which
    resulted in errors.
---
 .../boost/compute/algorithm/detail/binary_find.hpp | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/include/boost/compute/algorithm/detail/binary_find.hpp b/include/boost/compute/algorithm/detail/binary_find.hpp
index e27065b..53dc413 100644
--- a/include/boost/compute/algorithm/detail/binary_find.hpp
+++ b/include/boost/compute/algorithm/detail/binary_find.hpp
@@ -95,29 +95,39 @@ inline InputIterator binary_find(InputIterator first,
     size_t threads = parameters->get(cache_key, "tpb", 128);
     size_t count = iterator_range_size(first, last);
 
+    InputIterator search_first = first;
+    InputIterator search_last = last;
+
     while(count > find_if_limit) {
 
         scalar<uint_> index(queue.get_context());
         index.write(static_cast<uint_>(count), queue);
 
         binary_find_kernel kernel(threads);
-        kernel.set_range(first, last, predicate);
+        kernel.set_range(search_first, search_last, predicate);
         kernel.exec(queue, index);
 
         size_t i = index.read(queue);
 
         if(i == count) {
-            first = last - count%threads;
+            search_first = search_last - ((count - 1)%(threads - 1));
             break;
         } else {
-            last = first + i;
-            first = last - count/threads;
+            search_last = search_first + i;
+            search_first = search_last - ((count - 1)/(threads - 1));
         }
 
-        count = iterator_range_size(first, last);
+        // Make sure that first and last stay within the input range
+        search_last = std::min(search_last, last);
+        search_last = std::max(search_last, first);
+
+        search_first = std::max(search_first, first);
+        search_first = std::min(search_first, last);
+
+        count = iterator_range_size(search_first, search_last);
     }
 
-    return find_if(first, last, predicate, queue);
+    return find_if(search_first, search_last, predicate, queue);
 }
 
 } // end detail namespace

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/compute.git



More information about the debian-science-commits mailing list