[Bf-blender-cvs] [2a49bf3] master: Add ARRAY_SIZE macro to check fixed size arrays

Campbell Barton noreply at git.blender.org
Sun May 18 15:53:06 CEST 2014


Commit: 2a49bf35f08752cadf998a05867c4244378b4c57
Author: Campbell Barton
Date:   Sun May 18 23:50:44 2014 +1000
https://developer.blender.org/rB2a49bf35f08752cadf998a05867c4244378b4c57

Add ARRAY_SIZE macro to check fixed size arrays

===================================================================

M	source/blender/blenkernel/intern/idcode.c
M	source/blender/blenlib/BLI_utildefines.h

===================================================================

diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c
index c987e0b..2e201a0 100644
--- a/source/blender/blenkernel/intern/idcode.c
+++ b/source/blender/blenkernel/intern/idcode.c
@@ -84,12 +84,11 @@ static IDType idtypes[] = {
 	{ ID_WO,     "World",            "worlds",          IDTYPE_FLAGS_ISLINKABLE },
 	{ ID_WM,     "WindowManager",    "window_managers", 0                       },
 };
-static int nidtypes = sizeof(idtypes) / sizeof(idtypes[0]);
 
 static IDType *idtype_from_name(const char *str) 
 {
-	int i = nidtypes;
-	
+	int i = ARRAY_SIZE(idtypes);
+
 	while (i--) {
 		if (STREQ(str, idtypes[i].name)) {
 			return &idtypes[i];
@@ -100,8 +99,8 @@ static IDType *idtype_from_name(const char *str)
 }
 static IDType *idtype_from_code(int code) 
 {
-	int i = nidtypes;
-	
+	int i = ARRAY_SIZE(idtypes);
+
 	while (i--)
 		if (code == idtypes[i].code)
 			return &idtypes[i];
@@ -182,5 +181,5 @@ const char *BKE_idcode_to_name_plural(int code)
  */
 int BKE_idcode_iter_step(int *index)
 {
-	return (*index < nidtypes) ? idtypes[(*index)++].code : 0;
+	return (*index < ARRAY_SIZE(idtypes)) ? idtypes[(*index)++].code : 0;
 }
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index f70befd..20ed2e0 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -361,6 +361,15 @@
 		         (((tot) - (index)) - (tot_delete)) * sizeof(*(arr))); \
 	} (void)0
 
+/* assuming a static array */
+#ifdef __GNUC__
+#  define ARRAY_SIZE(arr)                                                     \
+	((sizeof(struct {int isnt_array : ((void *)&(arr) == &(arr)[0]);}) * 0) + \
+	 (sizeof(arr) / sizeof(*(arr))))
+#else
+#  define ARRAY_SIZE(x)  sizeof(arr) / sizeof(*(arr))
+#endif
+
 /* Warning-free macros for storing ints in pointers. Use these _only_
  * for storing an int in a pointer, not a pointer in an int (64bit)! */
 #define SET_INT_IN_POINTER(i)    ((void *)(intptr_t)(i))




More information about the Bf-blender-cvs mailing list