1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-17 10:52:44 +01:00

Merge pull request #20352 from Enoch247/add-limit-macro

macros/utils: add LIMIT() and ABS() macros
This commit is contained in:
Marian Buschsieweke 2024-02-09 06:06:48 +00:00 committed by GitHub
commit 2dbc80fe59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 70 additions and 0 deletions

View File

@ -63,6 +63,32 @@ extern "C" {
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef ABS
/**
* @brief Returns the absolute value of @p x
*
* @note This is the trivial implementation that does evaluate the arguments
* more than once
*/
#define ABS(x) ((x) > 0 ? (x) : -(x))
#endif
/**
* @brief Limit a value to an inclusive range
*
* If @p val is > @p high, @p high is returned. If @p val is < @p low, @p low
* is returned. Otherwise, @p val is returned.
*
* @note This macro evaluate its arguments more than once.
*
* @param[in] val value to limit
* @param[in] low minimum limit
* @param[in] high maximum limit
*
* @return range limited value
*/
#define LIMIT(val, low, high) ((val < low) ? low : (val > high) ? high : val)
#ifdef __cplusplus
}
#endif

View File

@ -12,6 +12,46 @@
#include "embUnit.h"
#include "tests-core.h"
#include "macros/math.h"
#include "macros/utils.h"
static void test_max(void)
{
TEST_ASSERT_EQUAL_INT(10, MAX(5, 10));
TEST_ASSERT_EQUAL_INT(10, MAX(10, 5));
// prove it works with non-integer types
TEST_ASSERT(22.1 == MAX(22.1, 5.5));
}
static void test_min(void)
{
TEST_ASSERT_EQUAL_INT(5, MIN(5, 10));
TEST_ASSERT_EQUAL_INT(5, MIN(10, 5));
// prove it works with non-integer types
TEST_ASSERT(5.5 == MIN(22.1, 5.5));
}
static void test_abs(void)
{
TEST_ASSERT_EQUAL_INT(22, ABS(22));
TEST_ASSERT_EQUAL_INT(22, ABS(-22));
// prove it works with non-integer types
TEST_ASSERT(300.7 == ABS(-300.7));
}
static void test_limit(void)
{
TEST_ASSERT_EQUAL_INT(5, LIMIT(5, -10, 10));
TEST_ASSERT_EQUAL_INT(10, LIMIT(10, -10, 10));
TEST_ASSERT_EQUAL_INT(10, LIMIT(22, -10, 10));
TEST_ASSERT_EQUAL_INT(-10, LIMIT(-10, -10, 10));
TEST_ASSERT_EQUAL_INT(-10, LIMIT(-22, -10, 10));
// prove it works with non-integer types
TEST_ASSERT(10.2 == LIMIT(22.2, -10.1, 10.2));
}
static void test_math_signof(void)
{
@ -81,6 +121,10 @@ static void test_math_div_round_inf(void)
Test *tests_core_macros_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_max),
new_TestFixture(test_min),
new_TestFixture(test_abs),
new_TestFixture(test_limit),
new_TestFixture(test_math_signof),
new_TestFixture(test_math_div_round),
new_TestFixture(test_math_div_round_up),