_copy; \
})
+#define saturate_add(x, y, limit) \
+ ({ \
+ typeof(limit) _x = (x); \
+ typeof(limit) _y = (y); \
+ _x > (limit) || _y >= (limit) - _x ? (limit) : _x + _y; \
+ })
+
static inline size_t size_add(size_t x, size_t y) {
- return y >= SIZE_MAX - x ? SIZE_MAX : x + y;
+ return saturate_add(x, y, SIZE_MAX);
}
typedef struct {
#include "macro.h"
#include "tests.h"
+TEST(saturate_add) {
+ assert_se(saturate_add(1, 2, UINT8_MAX) == 3);
+ assert_se(saturate_add(1, UINT8_MAX-2, UINT8_MAX) == UINT8_MAX-1);
+ assert_se(saturate_add(1, UINT8_MAX-1, UINT8_MAX) == UINT8_MAX);
+ assert_se(saturate_add(1, UINT8_MAX, UINT8_MAX) == UINT8_MAX);
+ assert_se(saturate_add(2, UINT8_MAX, UINT8_MAX) == UINT8_MAX);
+ assert_se(saturate_add(60, 60, 50) == 50);
+}
+
TEST(align_power2) {
unsigned long i, p2;