1 #ifndef _LINUX_HELPER_MACROS_H_ 2 #define _LINUX_HELPER_MACROS_H_ 3 4 #define __find_closest(x, a, as, op) \ 5 ({ \ 6 typeof(as) __fc_i, __fc_as = (as) - 1; \ 7 typeof(x) __fc_x = (x); \ 8 typeof(*a) const *__fc_a = (a); \ 9 for (__fc_i = 0; __fc_i < __fc_as; __fc_i++) { \ 10 if (__fc_x op DIV_ROUND_CLOSEST(__fc_a[__fc_i] + \ 11 __fc_a[__fc_i + 1], 2)) \ 12 break; \ 13 } \ 14 (__fc_i); \ 15 }) 16 17 /** 18 * find_closest - locate the closest element in a sorted array 19 * @x: The reference value. 20 * @a: The array in which to look for the closest element. Must be sorted 21 * in ascending order. 22 * @as: Size of 'a'. 23 * 24 * Returns the index of the element closest to 'x'. 25 */ 26 #define find_closest(x, a, as) __find_closest(x, a, as, <=) 27 28 /** 29 * find_closest_descending - locate the closest element in a sorted array 30 * @x: The reference value. 31 * @a: The array in which to look for the closest element. Must be sorted 32 * in descending order. 33 * @as: Size of 'a'. 34 * 35 * Similar to find_closest() but 'a' is expected to be sorted in descending 36 * order. 37 */ 38 #define find_closest_descending(x, a, as) __find_closest(x, a, as, >=) 39 40 #endif 41