Przeglądaj źródła

[Pal] Add macro for saturated addition/subtraction

Simon Gaiser 4 lat temu
rodzic
commit
1cb80f23ed
1 zmienionych plików z 18 dodań i 0 usunięć
  1. 18 0
      Pal/lib/api.h

+ 18 - 0
Pal/lib/api.h

@@ -49,6 +49,24 @@ typedef ptrdiff_t ssize_t;
       _a > _b ? _a : _b; })
 #endif
 
+#define SATURATED_ADD(a, b, limit) \
+    ({ __typeof__(a) _a = (a); \
+       __typeof__(b) _b = (b); \
+       __typeof__(limit) _limit = (limit); \
+       _b > _limit ? _limit : (_a > _limit - _b ? _limit : _a + _b); })
+
+#define SATURATED_SUB(a, b, limit) \
+    ({ __typeof__(a) _a = (a); \
+       __typeof__(b) _b = (b); \
+       __typeof__(limit) _limit = (limit); \
+       _a < _limit ? _limit : (_b > _a - _limit ? _limit : _a - _b); })
+
+#define SATURATED_P_ADD(ptr_a, b, limit) \
+   ((__typeof__(ptr_a))SATURATED_ADD((uintptr_t)(ptr_a), (uintptr_t)(b), (uintptr_t)(limit)))
+
+#define SATURATED_P_SUB(ptr_a, b, limit) \
+   ((__typeof__(ptr_a))SATURATED_SUB((uintptr_t)(ptr_a), (uintptr_t)(b), (uintptr_t)(limit)))
+
 #define ALIGN_DOWN_PTR(ptr, size) \
     ((__typeof__(ptr)) (((uintptr_t)(ptr)) & -(size)))
 #define ALIGN_UP_PTR(ptr, size) \