[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49989] trunk/blender/source/blender: utility functions: BLI_findptr, BLI_rfindptr --- use for finding an item in a linked list by a pointer.

Campbell Barton ideasman42 at gmail.com
Sat Aug 18 18:16:13 CEST 2012


Revision: 49989
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49989
Author:   campbellbarton
Date:     2012-08-18 16:16:13 +0000 (Sat, 18 Aug 2012)
Log Message:
-----------
utility functions: BLI_findptr, BLI_rfindptr --- use for finding an item in a linked list by a pointer.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/group.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenlib/BLI_listbase.h
    trunk/blender/source/blender/blenlib/intern/listbase.c
    trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
    trunk/blender/source/blender/editors/gpencil/gpencil_paint.c
    trunk/blender/source/blender/editors/interface/resources.c
    trunk/blender/source/blender/editors/object/object_edit.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_select.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -1279,9 +1279,9 @@
 			if (part->dup_group == NULL || part->dup_group->gobject.first == NULL)
 				return;
 
-			for (go = part->dup_group->gobject.first; go; go = go->next)
-				if (go->ob == par)
-					return;
+			if (BLI_findptr(&part->dup_group->gobject, par, offsetof(GroupObject, ob))) {
+				return;
+			}
 		}
 
 		/* if we have a hair particle system, use the path cache */

Modified: trunk/blender/source/blender/blenkernel/intern/group.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/group.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/blenkernel/intern/group.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -161,11 +161,13 @@
 {
 	GroupObject *go;
 	
-	if (group == NULL || ob == NULL) return 0;
+	if (group == NULL || ob == NULL) {
+		return FALSE;
+	}
 	
 	/* check if the object has been added already */
-	for (go = group->gobject.first; go; go = go->next) {
-		if (go->ob == ob) return 0;
+	if (BLI_findptr(&group->gobject, ob, offsetof(GroupObject, ob))) {
+		return FALSE;
 	}
 	
 	go = MEM_callocN(sizeof(GroupObject), "groupobject");
@@ -173,7 +175,7 @@
 	
 	go->ob = ob;
 	
-	return 1;
+	return TRUE;
 }
 
 int add_to_group(Group *group, Object *object, Scene *scene, Base *base)
@@ -239,15 +241,11 @@
 
 int object_in_group(Object *ob, Group *group)
 {
-	GroupObject *go;
-	
-	if (group == NULL || ob == NULL) return 0;
-	
-	for (go = group->gobject.first; go; go = go->next) {
-		if (go->ob == ob)
-			return 1;
+	if (group == NULL || ob == NULL) {
+		return FALSE;
 	}
-	return 0;
+
+	return (BLI_findptr(&group->gobject, ob, offsetof(GroupObject, ob)) != NULL);
 }
 
 Group *find_group(Object *ob, Group *group)

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -550,14 +550,7 @@
 
 Base *BKE_scene_base_find(Scene *scene, Object *ob)
 {
-	Base *base;
-	
-	base = scene->base.first;
-	while (base) {
-		if (base->object == ob) return base;
-		base = base->next;
-	}
-	return NULL;
+	return BLI_findptr(&scene->base, ob, offsetof(Base, object));
 }
 
 void BKE_scene_set_background(Main *bmain, Scene *scene)
@@ -582,10 +575,10 @@
 
 	/* group flags again */
 	for (group = bmain->group.first; group; group = group->id.next) {
-		go = group->gobject.first;
-		while (go) {
-			if (go->ob) go->ob->flag |= OB_FROMGROUP;
-			go = go->next;
+		for (go = group->gobject.first; go; go = go->next) {
+			if (go->ob) {
+				go->ob->flag |= OB_FROMGROUP;
+			}
 		}
 	}
 

Modified: trunk/blender/source/blender/blenlib/BLI_listbase.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_listbase.h	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/blenlib/BLI_listbase.h	2012-08-18 16:16:13 UTC (rev 49989)
@@ -48,11 +48,13 @@
 void *BLI_findlink(const struct ListBase *listbase, int number);
 void *BLI_findstring(const struct ListBase *listbase, const char *id, const int offset);
 void *BLI_findstring_ptr(const struct ListBase *listbase, const char *id, const int offset);
+void *BLI_findptr(const struct ListBase *listbase, const void *ptr, const int offset);
 
 /* find backwards */
 void *BLI_rfindlink(const struct ListBase *listbase, int number);
 void *BLI_rfindstring(const struct ListBase *listbase, const char *id, const int offset);
 void *BLI_rfindstring_ptr(const struct ListBase *listbase, const char *id, const int offset);
+void *BLI_rfindptr(const struct ListBase *listbase, const void *ptr, const int offset);
 
 void BLI_freelistN(struct ListBase *listbase);
 void BLI_addtail(struct ListBase *listbase, void *vlink);

Modified: trunk/blender/source/blender/blenlib/intern/listbase.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/listbase.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/blenlib/intern/listbase.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -439,6 +439,44 @@
 	return NULL;
 }
 
+void *BLI_findptr(const ListBase *listbase, const void *ptr, const int offset)
+{
+	Link *link = NULL;
+	const void *ptr_iter;
+
+	if (listbase == NULL) return NULL;
+
+	for (link = listbase->first; link; link = link->next) {
+		/* exact copy of BLI_findstring(), except for this line */
+		ptr_iter = *((const char **)(((const char *)link) + offset));
+
+		if (ptr == ptr_iter) {
+			return link;
+		}
+	}
+
+	return NULL;
+}
+/* same as above but find reverse */
+void *BLI_rfindptr(const ListBase *listbase, const void *ptr, const int offset)
+{
+	Link *link = NULL;
+	const void *ptr_iter;
+
+	if (listbase == NULL) return NULL;
+
+	for (link = listbase->last; link; link = link->prev) {
+		/* exact copy of BLI_rfindstring(), except for this line */
+		ptr_iter = *((const char **)(((const char *)link) + offset));
+
+		if (ptr == ptr_iter) {
+			return link;
+		}
+	}
+
+	return NULL;
+}
+
 int BLI_findstringindex(const ListBase *listbase, const char *id, const int offset)
 {
 	Link *link = NULL;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -31,6 +31,8 @@
  * that should be addressed eventually.
  */
 
+#include <stddef.h>
+
 #include "MEM_guardedalloc.h"
 
 #include "DNA_scene_types.h"
@@ -708,28 +710,19 @@
 /* --- macro wrapped funcs --- */
 int _bm_select_history_check(BMesh *bm, const BMHeader *ele)
 {
-	BMEditSelection *ese;
-	
-	for (ese = bm->selected.first; ese; ese = ese->next) {
-		if (ese->ele == (BMElem *)ele) {
-			return TRUE;
-		}
-	}
-	
-	return FALSE;
+	return (BLI_findptr(&bm->selected, ele, offsetof(BMEditSelection, ele)) != NULL);
 }
 
 int _bm_select_history_remove(BMesh *bm, BMHeader *ele)
 {
-	BMEditSelection *ese;
-	for (ese = bm->selected.first; ese; ese = ese->next) {
-		if (ese->ele == (BMElem *)ele) {
-			BLI_freelinkN(&(bm->selected), ese);
-			return TRUE;
-		}
+	BMEditSelection *ese = BLI_findptr(&bm->selected, ele, offsetof(BMEditSelection, ele));
+	if (ese) {
+		BLI_freelinkN(&bm->selected, ese);
+		return TRUE;
 	}
-
-	return FALSE;
+	else {
+		return FALSE;
+	}
 }
 
 void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele)

Modified: trunk/blender/source/blender/editors/gpencil/gpencil_paint.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/gpencil_paint.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/editors/gpencil/gpencil_paint.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -1667,14 +1667,7 @@
 static int gpencil_area_exists(bContext *C, ScrArea *sa_test)
 {
 	bScreen *sc = CTX_wm_screen(C);
-	ScrArea *sa;
-	
-	for (sa = sc->areabase.first; sa; sa = sa->next) {
-		if (sa == sa_test)
-			return 1;
-	}
-	
-	return 0;
+	return (BLI_findindex(&sc->areabase, sa_test) != -1);
 }
 
 static tGPsdata *gpencil_stroke_begin(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/interface/resources.c
===================================================================
--- trunk/blender/source/blender/editors/interface/resources.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/editors/interface/resources.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -643,9 +643,7 @@
 	bTheme *btheme;
 	
 	/* we search for the theme with name Default */
-	for (btheme = U.themes.first; btheme; btheme = btheme->next) {
-		if (strcmp("Default", btheme->name) == 0) break;
-	}
+	btheme = BLI_findstring(&U.themes, "Default", offsetof(bTheme, name));
 	
 	if (btheme == NULL) {
 		btheme = MEM_callocN(sizeof(bTheme), "theme");

Modified: trunk/blender/source/blender/editors/object/object_edit.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_edit.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/editors/object/object_edit.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -1720,13 +1720,15 @@
 		CTX_DATA_BEGIN(C, Object *, ob_iter, selected_editable_objects)
 		{
 			if (ob != ob_iter) {
-				if (type == COPY_PROPERTIES_REPLACE)
+				if (type == COPY_PROPERTIES_REPLACE) {
 					copy_properties(&ob_iter->prop, &ob->prop);
-
-				/* merge - the default when calling with no argument */
-				else
-					for (prop = ob->prop.first; prop; prop = prop->next)
+				}
+				else {
+					/* merge - the default when calling with no argument */
+					for (prop = ob->prop.first; prop; prop = prop->next) {
 						set_ob_property(ob_iter, prop);
+					}
+				}
 			}
 		}
 		CTX_DATA_END;

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2012-08-18 15:46:32 UTC (rev 49988)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2012-08-18 16:16:13 UTC (rev 49989)
@@ -268,17 +268,12 @@
 static int object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
                                   int *sort_depsgraph)
 {
-	ModifierData *obmd;
-
 	/* It seems on rapid delete it is possible to
 	 * get called twice on same modifier, so make
 	 * sure it is in list. */
-	for (obmd = ob->modifiers.first; obmd; obmd = obmd->next)
-		if (obmd == md)
-			break;
-
-	if (!obmd)
+	if (BLI_findindex(&ob->modifiers, md) != -1) {
 		return 0;
+	}
 
 	/* special cases */
 	if (md->type == eModifierType_ParticleSystem) {

Modified: trunk/blender/source/blender/editors/object/object_select.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_select.c	2012-08-18 15:46:32 UTC (rev 49988)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list