[v5,1/6] eal: introduce RTE_MIN_T() and RTE_MAX_T() macros
Checks
Commit Message
These macros work like RTE_MIN and RTE_MAX but take an explicit
type. Necessary when being used in static assertions since
RTE_MIN and RTE_MAX use temporary variables which confuses
compilers constant expression checks. These macros could also
be useful in other scenarios when bounded range is useful.
Naming is chosen to be similar to Linux kernel conventions.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
---
lib/eal/include/rte_common.h | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
Comments
On 2024/1/19 0:50, Stephen Hemminger wrote:
> These macros work like RTE_MIN and RTE_MAX but take an explicit
> type. Necessary when being used in static assertions since
> RTE_MIN and RTE_MAX use temporary variables which confuses
> compilers constant expression checks. These macros could also
> be useful in other scenarios when bounded range is useful.
>
> Naming is chosen to be similar to Linux kernel conventions.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
> Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> ---
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
@@ -585,6 +585,14 @@ __extension__ typedef uint64_t RTE_MARKER64[0];
_a < _b ? _a : _b; \
})
+/**
+ * Macro to return the minimum of two numbers
+ * does not use temporarys so not safe if a or b is expression
+ * but is guaranteed to be constant for use in static_assert()
+ */
+#define RTE_MIN_T(a, b, t) \
+ ((t)(a) < (t)(b) ? (t)(a) : (t)(b))
+
/**
* Macro to return the maximum of two numbers
*/
@@ -595,6 +603,14 @@ __extension__ typedef uint64_t RTE_MARKER64[0];
_a > _b ? _a : _b; \
})
+/**
+ * Macro to return the maxiimum of two numbers
+ * does not use temporarys so not safe if a or b is expression
+ * but is guaranteed to be constant for use in static_assert()
+ */
+#define RTE_MAX_T(a, b, t) \
+ ((t)(a) > (t)(b) ? (t)(a) : (t)(b))
+
/*********** Other general functions / macros ********/
#ifndef offsetof