BLI_array_utils: add binary and/or functions
authorCampbell Barton <ideasman42@gmail.com>
Mon, 18 Jan 2016 20:00:55 +0000 (07:00 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 18 Jan 2016 21:23:05 +0000 (08:23 +1100)
source/blender/blenlib/BLI_array_utils.h
source/blender/blenlib/intern/array_utils.c

index ff7976dc7014515a50aa6f6a1f5ce6d078eb2a1d..c5359d56f9c737b4592fa12325e006a82b0e0ff3 100644 (file)
@@ -26,6 +26,8 @@
  *  \brief Generic array manipulation API.
  */
 
+#include "BLI_compiler_typecheck.h"
+
 void _bli_array_reverse(void *arr, unsigned int arr_len, size_t arr_stride);
 #define BLI_array_reverse(arr, arr_len) \
        _bli_array_reverse(arr, arr_len, sizeof(*(arr)))
@@ -46,4 +48,20 @@ int _bli_array_findindex(const void *arr, unsigned int arr_len, size_t arr_strid
 #define BLI_array_findindex(arr, arr_len, p) \
        _bli_array_findindex(arr, arr_len, sizeof(*(arr)), p)
 
+void _bli_array_binary_and(
+        void *arr, const void *arr_a, const void *arr_b,
+        unsigned int arr_len, size_t arr_stride);
+#define BLI_array_binary_and(arr, arr_a, arr_b, arr_len) \
+       (CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_a)), \
+        CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_b)), \
+        _bli_array_binary_and(arr, arr_a, arr_b, arr_len, sizeof(*(arr))))
+
+void _bli_array_binary_or(
+        void *arr, const void *arr_a, const void *arr_b,
+        unsigned int arr_len, size_t arr_stride);
+#define BLI_array_binary_or(arr, arr_a, arr_b, arr_len) \
+       (CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_a)), \
+        CHECK_TYPE_PAIR_INLINE(*(arr), *(arr_b)), \
+        _bli_array_binary_or(arr, arr_a, arr_b, arr_len, sizeof(*(arr))))
+
 #endif  /* __BLI_ARRAY_UTILS_H__ */
index cef912e42a395ea3350206234729327468363207..52ca835876e9deab9407ccbd02296baa87534518 100644 (file)
@@ -142,3 +142,31 @@ int _bli_array_findindex(const void *arr, unsigned int arr_len, size_t arr_strid
        }
        return -1;
 }
+
+void _bli_array_binary_and(
+        void *arr, const void *arr_a, const void *arr_b,
+        unsigned int arr_len, size_t arr_stride)
+{
+       char *dst   = arr;
+       const char *src_a = arr_a;
+       const char *src_b = arr_b;
+
+       size_t i = arr_stride * arr_len;
+       while (i--) {
+               *(dst++) = *(src_a++) & *(src_b++);
+       }
+}
+
+void _bli_array_binary_or(
+        void *arr, const void *arr_a, const void *arr_b,
+        unsigned int arr_len, size_t arr_stride)
+{
+       char *dst   = arr;
+       const char *src_a = arr_a;
+       const char *src_b = arr_b;
+
+       size_t i = arr_stride * arr_len;
+       while (i--) {
+               *(dst++) = *(src_a++) | *(src_b++);
+       }
+}
\ No newline at end of file