[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59124] trunk/blender/source/blender/ blenlib: utility functions to reverse and wrap arrays.
Campbell Barton
ideasman42 at gmail.com
Wed Aug 14 01:43:44 CEST 2013
Revision: 59124
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59124
Author: campbellbarton
Date: 2013-08-13 23:43:44 +0000 (Tue, 13 Aug 2013)
Log Message:
-----------
utility functions to reverse and wrap arrays.
Modified Paths:
--------------
trunk/blender/source/blender/blenlib/BLI_array.h
trunk/blender/source/blender/blenlib/intern/BLI_array.c
Modified: trunk/blender/source/blender/blenlib/BLI_array.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_array.h 2013-08-13 22:28:16 UTC (rev 59123)
+++ trunk/blender/source/blender/blenlib/BLI_array.h 2013-08-13 23:43:44 UTC (rev 59124)
@@ -173,4 +173,14 @@
MEM_freeN(arr); \
} (void)0
+
+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)))
+
+void _bli_array_wrap(void *arr, unsigned int arr_len, size_t arr_stride, int dir);
+#define BLI_array_wrap(arr, arr_len, dir) \
+ _bli_array_wrap(arr, arr_len, sizeof(*(arr)), dir)
+
+
#endif /* __BLI_ARRAY_H__ */
Modified: trunk/blender/source/blender/blenlib/intern/BLI_array.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_array.c 2013-08-13 22:28:16 UTC (rev 59123)
+++ trunk/blender/source/blender/blenlib/intern/BLI_array.c 2013-08-13 23:43:44 UTC (rev 59124)
@@ -59,9 +59,14 @@
*/
#include <string.h>
+#include <stdlib.h>
#include "BLI_array.h"
+#include "BLI_sys_types.h"
+#include "BLI_utildefines.h"
+#include "BLI_alloca.h"
+
#include "MEM_guardedalloc.h"
/**
@@ -95,3 +100,40 @@
arr_count += num;
#endif
}
+
+void _bli_array_reverse(void *arr_v, unsigned int arr_len, size_t arr_stride)
+{
+ const unsigned int arr_half_stride = (arr_len / 2) * arr_stride;
+ unsigned int i, i_end;
+ char *arr = arr_v;
+ char *buf = BLI_array_alloca(buf, arr_stride);
+
+ for (i = 0, i_end = (arr_len - 1) * arr_stride;
+ i < arr_half_stride;
+ i += arr_stride, i_end -= arr_stride)
+ {
+ memcpy(buf, &arr[i], arr_stride);
+ memcpy(&arr[i], &arr[i_end], arr_stride);
+ memcpy(&arr[i_end], buf, arr_stride);
+ }
+}
+
+void _bli_array_wrap(void *arr_v, unsigned int arr_len, size_t arr_stride, int dir)
+{
+ char *arr = arr_v;
+ char *buf = BLI_array_alloca(buf, arr_stride);
+
+ if (dir == -1) {
+ memcpy(buf, arr, arr_stride);
+ memmove(arr, arr + arr_stride, arr_stride * (arr_len - 1));
+ memcpy(arr + (arr_stride * (arr_len - 1)), buf, arr_stride);
+ }
+ else if (dir == 1) {
+ memcpy(buf, arr + (arr_stride * (arr_len - 1)), arr_stride);
+ memmove(arr + arr_stride, arr, arr_stride * (arr_len - 1));
+ memcpy(arr, buf, arr_stride);
+ }
+ else {
+ BLI_assert(0);
+ }
+}
More information about the Bf-blender-cvs
mailing list