1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_HELPER_MACROS_H_ 2 #ifndef _LINUX_HELPER_MACROS_H_ 3 #define _LINUX_HELPER_MACROS_H_ 3 #define _LINUX_HELPER_MACROS_H_ 4 4 5 #include <linux/math.h> << 6 << 7 #define __find_closest(x, a, as, op) 5 #define __find_closest(x, a, as, op) \ 8 ({ 6 ({ \ 9 typeof(as) __fc_i, __fc_as = (as) - 1; 7 typeof(as) __fc_i, __fc_as = (as) - 1; \ 10 typeof(x) __fc_x = (x); 8 typeof(x) __fc_x = (x); \ 11 typeof(*a) const *__fc_a = (a); 9 typeof(*a) const *__fc_a = (a); \ 12 for (__fc_i = 0; __fc_i < __fc_as; __f 10 for (__fc_i = 0; __fc_i < __fc_as; __fc_i++) { \ 13 if (__fc_x op DIV_ROUND_CLOSES 11 if (__fc_x op DIV_ROUND_CLOSEST(__fc_a[__fc_i] + \ 14 12 __fc_a[__fc_i + 1], 2)) \ 15 break; 13 break; \ 16 } 14 } \ 17 (__fc_i); 15 (__fc_i); \ 18 }) 16 }) 19 17 20 /** 18 /** 21 * find_closest - locate the closest element i 19 * find_closest - locate the closest element in a sorted array 22 * @x: The reference value. 20 * @x: The reference value. 23 * @a: The array in which to look for the clos 21 * @a: The array in which to look for the closest element. Must be sorted 24 * in ascending order. 22 * in ascending order. 25 * @as: Size of 'a'. 23 * @as: Size of 'a'. 26 * 24 * 27 * Returns the index of the element closest to 25 * Returns the index of the element closest to 'x'. 28 */ 26 */ 29 #define find_closest(x, a, as) __find_closest( 27 #define find_closest(x, a, as) __find_closest(x, a, as, <=) 30 28 31 /** 29 /** 32 * find_closest_descending - locate the closes 30 * find_closest_descending - locate the closest element in a sorted array 33 * @x: The reference value. 31 * @x: The reference value. 34 * @a: The array in which to look for the clos 32 * @a: The array in which to look for the closest element. Must be sorted 35 * in descending order. 33 * in descending order. 36 * @as: Size of 'a'. 34 * @as: Size of 'a'. 37 * 35 * 38 * Similar to find_closest() but 'a' is expect 36 * Similar to find_closest() but 'a' is expected to be sorted in descending 39 * order. 37 * order. 40 */ 38 */ 41 #define find_closest_descending(x, a, as) __fi 39 #define find_closest_descending(x, a, as) __find_closest(x, a, as, >=) 42 << 43 /** << 44 * is_insidevar - check if the @ptr points ins << 45 * @ptr: the pointer to a memory addres << 46 * @var: the variable which address and << 47 * << 48 * Evaluates to true if the address in @ptr li << 49 * range allocated to @var. << 50 */ << 51 #define is_insidevar(ptr, var) << 52 ((uintptr_t)(ptr) >= (uintptr_t)(var) << 53 (uintptr_t)(ptr) < (uintptr_t)(var) << 54 40 55 #endif 41 #endif 56 42
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.