diff --git a/libinterp/corefcn/find.cc b/libinterp/corefcn/find.cc --- a/libinterp/corefcn/find.cc +++ b/libinterp/corefcn/find.cc @@ -144,7 +144,7 @@ { ffind_result resvec; dir_handler dirc; - find_to_R (dirc, v, n_to_find, resvec); + resvec = find_to_R > (dirc, v, n_to_find); return resvec.get_list (); } diff --git a/liboctave/util/find.h b/liboctave/util/find.h --- a/liboctave/util/find.h +++ b/liboctave/util/find.h @@ -59,9 +59,8 @@ // nuanced and unintuitive (but Matlab compatible). template - void - find_to_R (dir_handler dirc, const MT& v, octave_idx_type n_to_find, - R& resvec) + R + find_to_R (dir_handler dirc, const MT& v, octave_idx_type n_to_find) { typedef typename MT::iter_type iter_t; @@ -95,7 +94,7 @@ res_dims = dim_vector (numres, 1); iter_t iterator (v); - resvec = R (res_dims); + R resvec (res_dims); octave_idx_type count = dirc.begin (numres); for (iterator.begin (dirc); @@ -104,6 +103,8 @@ { resvec.add (count, iterator); } + + return resvec; } // The method call used for internal liboctave calls to find. It constructs @@ -119,19 +120,26 @@ FORWARD) { find_result resvec; + switch (dir) { case FORWARD: - dir_handler dirc_forward; - find_to_R (dirc_forward, v, n_to_find, resvec); + { + dir_handler dirc_forward; + resvec = find_to_R, find_result> (dirc_forward, v, n_to_find); + } break; + case BACKWARD: - dir_handler dirc_back; - find_to_R (dirc_back, v, n_to_find, resvec); + { + dir_handler dirc_back; + resvec = find_to_R, find_result> (dirc_back, v, n_to_find); + } break; + default: - liboctave_fatal ( - "find: unknown direction: %d; must be FORWARD or BACKWARD", dir); + liboctave_fatal ("find: unknown direction: %d; must be FORWARD or BACKWARD", dir); + break; } return resvec.res;