[Bf-blender-cvs] [6bad063] master: RNA: add RNA_enum_from_identifier, RNA_enum_from_value search functions

Campbell Barton noreply at git.blender.org
Sun Feb 9 07:33:35 CET 2014


Commit: 6bad063298bf276e4177991e9065091148bb6f0c
Author: Campbell Barton
Date:   Sun Feb 9 17:31:02 2014 +1100
https://developer.blender.org/rB6bad063298bf276e4177991e9065091148bb6f0c

RNA: add RNA_enum_from_identifier, RNA_enum_from_value search functions

also fix leak in RNA_enum_is_equal

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

M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_access.c

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

diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 4d21f2e..07c7d3e 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -783,6 +783,8 @@ bool RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **i
 int  RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, const char **identifier);
 bool RNA_enum_name(EnumPropertyItem *item, const int value, const char **r_name);
 bool RNA_enum_description(EnumPropertyItem *item, const int value, const char **description);
+int  RNA_enum_from_value(EnumPropertyItem *item, const int value);
+int  RNA_enum_from_identifier(EnumPropertyItem *item, const char *identifier);
 
 void RNA_property_enum_items(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item,
                              int *r_totitem, bool *r_free);
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 2c21634..7946d24 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -1296,24 +1296,24 @@ void RNA_property_enum_items_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA
 
 bool RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *r_value)
 {
-	EnumPropertyItem *item, *item_array;
+	EnumPropertyItem *item;
 	bool free;
 	bool found;
 
-	RNA_property_enum_items(C, ptr, prop, &item_array, NULL, &free);
+	RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
 
-	if (item_array) {
-		for (item = item_array; item->identifier; item++) {
-			if (item->identifier[0] && strcmp(item->identifier, identifier) == 0) {
-				*r_value = item->value;
-				break;
-			}
+	if (item) {
+		const int i = RNA_enum_from_identifier(item, identifier);
+		if (i != -1) {
+			*r_value = item[i].value;
+			found = true;
+		}
+		else {
+			found = false;
 		}
-
-		found = (item->identifier != NULL); /* could be alloc'd, assign before free */
 
 		if (free) {
-			MEM_freeN(item_array);
+			MEM_freeN(item);
 		}
 	}
 	else {
@@ -1322,15 +1322,16 @@ bool RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, co
 	return found;
 }
 
-bool RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier)
+bool RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **r_identifier)
 {
-	for (; item->identifier; item++) {
-		if (item->identifier[0] && item->value == value) {
-			*identifier = item->identifier;
-			return true;
-		}
+	const int i = RNA_enum_from_value(item, value);
+	if (i != -1) {
+		*r_identifier = item[i].identifier;
+		return true;
+	}
+	else {
+		return false;
 	}
-	return false;
 }
 
 int RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, const char **r_identifier)
@@ -1347,24 +1348,48 @@ int RNA_enum_bitflag_identifiers(EnumPropertyItem *item, const int value, const
 
 bool RNA_enum_name(EnumPropertyItem *item, const int value, const char **r_name)
 {
-	for (; item->identifier; item++) {
-		if (item->identifier[0] && item->value == value) {
-			*r_name = item->name;
-			return true;
-		}
+	const int i = RNA_enum_from_value(item, value);
+	if (i != -1) {
+		*r_name = item[i].name;
+		return true;
+	}
+	else {
+		return false;
 	}
-	return false;
 }
 
 bool RNA_enum_description(EnumPropertyItem *item, const int value, const char **r_description)
 {
-	for (; item->identifier; item++) {
+	const int i = RNA_enum_from_value(item, value);
+	if (i != -1) {
+		*r_description = item[i].description;
+		return true;
+	}
+	else {
+		return false;
+	}
+}
+
+int RNA_enum_from_identifier(EnumPropertyItem *item, const char *identifier)
+{
+	int i = 0;
+	for (; item->identifier; item++, i++) {
+		if (item->identifier[0] && STREQ(item->identifier, identifier)) {
+			return i;
+		}
+	}
+	return -1;
+}
+
+int RNA_enum_from_value(EnumPropertyItem *item, const int value)
+{
+	int i = 0;
+	for (; item->identifier; item++, i++) {
 		if (item->identifier[0] && item->value == value) {
-			*r_description = item->description;
-			return true;
+			return i;
 		}
 	}
-	return false;
+	return -1;
 }
 
 bool RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value,
@@ -4701,14 +4726,22 @@ bool RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const cha
 	bool free;
 
 	if (prop) {
-		RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+		int i;
+		bool cmp;
 
-		for (; item->identifier; item++)
-			if (strcmp(item->identifier, enumname) == 0)
-				return (item->value == RNA_property_enum_get(ptr, prop));
+		RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+		i = RNA_enum_from_identifier(item, enumname);
+		if (i != -1) {
+			cmp = (item[i].value == RNA_property_enum_get(ptr, prop));
+		}
 
-		if (free)
+		if (free) {
 			MEM_freeN(item);
+		}
+
+		if (i != -1) {
+			return cmp;
+		}
 
 		printf("%s: %s.%s item %s not found.\n", __func__, ptr->type->identifier, name, enumname);
 		return false;
@@ -4721,50 +4754,50 @@ bool RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const cha
 
 bool RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *r_value)
 {
-	for (; item->identifier; item++) {
-		if (strcmp(item->identifier, identifier) == 0) {
-			*r_value = item->value;
-			return true;
-		}
+	const int i = RNA_enum_from_identifier(item, identifier);
+	if (i != -1) {
+		*r_value = item[i].value;
+		return true;
+	}
+	else {
+		return false;
 	}
-	
-	return false;
 }
 
 bool RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **r_identifier)
 {
-	for (; item->identifier; item++) {
-		if (item->value == value) {
-			*r_identifier = item->identifier;
-			return true;
-		}
+	const int i = RNA_enum_from_value(item, value);
+	if (i != -1) {
+		*r_identifier = item[i].identifier;
+		return true;
+	}
+	else {
+		return false;
 	}
-
-	return false;
 }
 
 bool RNA_enum_icon_from_value(EnumPropertyItem *item, int value, int *r_icon)
 {
-	for (; item->identifier; item++) {
-		if (item->value == value) {
-			*r_icon = item->icon;
-			return true;
-		}
+	const int i = RNA_enum_from_value(item, value);
+	if (i != -1) {
+		*r_icon = item[i].icon;
+		return true;
+	}
+	else {
+		return false;
 	}
-	
-	return false;
 }
 
 bool RNA_enum_name_from_value(EnumPropertyItem *item, int value, const char **r_name)
 {
-	for (; item->identifier; item++) {
-		if (item->value == value) {
-			*r_name = item->name;
-			return true;
-		}
+	const int i = RNA_enum_from_value(item, value);
+	if (i != -1) {
+		*r_name = item[i].name;
+		return true;
+	}
+	else {
+		return false;
 	}
-	
-	return false;
 }
 
 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)




More information about the Bf-blender-cvs mailing list