@@ -60,7 +60,8 @@ template <class Tag, side_t side>
6060static void
6161binsearch (const char * arr , const char * key , char * ret , npy_intp arr_len ,
6262 npy_intp key_len , npy_intp arr_str , npy_intp key_str ,
63- npy_intp ret_str , PyArrayObject * )
63+ npy_intp ret_str , PyArrayObject * , PyArrayObject * ,
64+ PyArray_BinSearchCompareFunc * )
6465{
6566 using T = typename Tag ::type ;
6667 auto cmp = side_to_cmp < Tag , side > ::value ;
@@ -177,7 +178,7 @@ static int
177178argbinsearch (const char * arr , const char * key , const char * sort , char * ret ,
178179 npy_intp arr_len , npy_intp key_len , npy_intp arr_str ,
179180 npy_intp key_str , npy_intp sort_str , npy_intp ret_str ,
180- PyArrayObject * )
181+ PyArrayObject * , PyArrayObject * , PyArray_BinSearchCompareFunc * )
181182{
182183 using T = typename Tag ::type ;
183184 auto cmp = side_to_cmp < Tag , side > ::value ;
@@ -244,10 +245,10 @@ template <side_t side>
244245static void
245246npy_binsearch (const char * arr , const char * key , char * ret , npy_intp arr_len ,
246247 npy_intp key_len , npy_intp arr_str , npy_intp key_str ,
247- npy_intp ret_str , PyArrayObject * cmp )
248+ npy_intp ret_str , PyArrayObject * key_arr , PyArrayObject * arr_arr ,
249+ PyArray_BinSearchCompareFunc * compare )
248250{
249251 using Cmp = typename side_to_generic_cmp < side > ::type ;
250- PyArray_CompareFunc * compare = PyDataType_GetArrFuncs (PyArray_DESCR (cmp ))-> compare ;
251252 npy_intp min_idx = 0 ;
252253 npy_intp max_idx = arr_len ;
253254 const char * last_key = key ;
@@ -258,7 +259,8 @@ npy_binsearch(const char *arr, const char *key, char *ret, npy_intp arr_len,
258259 * gives the search a big boost when keys are sorted, but slightly
259260 * slows down things for purely random ones.
260261 */
261- if (Cmp {}(compare (last_key , key , cmp ), 0 )) {
262+ /* last_key and key are both elements of the key array */
263+ if (Cmp {}(compare (last_key , key , key_arr , key_arr ), 0 )) {
262264 max_idx = arr_len ;
263265 }
264266 else {
@@ -272,7 +274,8 @@ npy_binsearch(const char *arr, const char *key, char *ret, npy_intp arr_len,
272274 const npy_intp mid_idx = min_idx + ((max_idx - min_idx ) >> 1 );
273275 const char * arr_ptr = arr + mid_idx * arr_str ;
274276
275- if (Cmp {}(compare (arr_ptr , key , cmp ), 0 )) {
277+ /* arr_ptr belongs to the haystack, key to the key array */
278+ if (Cmp {}(compare (arr_ptr , key , arr_arr , key_arr ), 0 )) {
276279 min_idx = mid_idx + 1 ;
277280 }
278281 else {
@@ -288,10 +291,10 @@ static int
288291npy_argbinsearch (const char * arr , const char * key , const char * sort , char * ret ,
289292 npy_intp arr_len , npy_intp key_len , npy_intp arr_str ,
290293 npy_intp key_str , npy_intp sort_str , npy_intp ret_str ,
291- PyArrayObject * cmp )
294+ PyArrayObject * key_arr , PyArrayObject * arr_arr ,
295+ PyArray_BinSearchCompareFunc * compare )
292296{
293297 using Cmp = typename side_to_generic_cmp < side > ::type ;
294- PyArray_CompareFunc * compare = PyDataType_GetArrFuncs (PyArray_DESCR (cmp ))-> compare ;
295298 npy_intp min_idx = 0 ;
296299 npy_intp max_idx = arr_len ;
297300 const char * last_key = key ;
@@ -302,7 +305,8 @@ npy_argbinsearch(const char *arr, const char *key, const char *sort, char *ret,
302305 * gives the search a big boost when keys are sorted, but slightly
303306 * slows down things for purely random ones.
304307 */
305- if (Cmp {}(compare (last_key , key , cmp ), 0 )) {
308+ /* last_key and key are both elements of the key array */
309+ if (Cmp {}(compare (last_key , key , key_arr , key_arr ), 0 )) {
306310 max_idx = arr_len ;
307311 }
308312 else {
@@ -323,7 +327,8 @@ npy_argbinsearch(const char *arr, const char *key, const char *sort, char *ret,
323327
324328 arr_ptr = arr + sort_idx * arr_str ;
325329
326- if (Cmp {}(compare (arr_ptr , key , cmp ), 0 )) {
330+ /* arr_ptr belongs to the haystack, key to the key array */
331+ if (Cmp {}(compare (arr_ptr , key , arr_arr , key_arr ), 0 )) {
327332 min_idx = mid_idx + 1 ;
328333 }
329334 else {
0 commit comments