[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