[Bf-blender-cvs] [75de21f0722] master: Undo System: id-map avoid duplicate add/lookup
Campbell Barton
noreply at git.blender.org
Tue Apr 3 17:07:10 CEST 2018
Commit: 75de21f0722c3a7d674c208cf6af95044637828f
Author: Campbell Barton
Date: Tue Apr 3 16:46:11 2018 +0200
Branches: master
https://developer.blender.org/rB75de21f0722c3a7d674c208cf6af95044637828f
Undo System: id-map avoid duplicate add/lookup
Add versions of add/lookup that check the previous item.
===================================================================
M source/blender/blenkernel/BKE_undo_system.h
M source/blender/blenkernel/intern/undo_system.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_undo_system.h b/source/blender/blenkernel/BKE_undo_system.h
index 6072ecfae4a..d2a322a50f0 100644
--- a/source/blender/blenkernel/BKE_undo_system.h
+++ b/source/blender/blenkernel/BKE_undo_system.h
@@ -180,7 +180,15 @@ struct UndoIDPtrMap *BKE_undosys_ID_map_create(void);
void BKE_undosys_ID_map_destroy(struct UndoIDPtrMap *map);
void BKE_undosys_ID_map_add(struct UndoIDPtrMap *map, ID *id);
struct ID *BKE_undosys_ID_map_lookup(const struct UndoIDPtrMap *map, const struct ID *id_src);
-void BKE_undosys_ID_map_foreach_ID_ref(
+
+void BKE_undosys_ID_map_add_with_prev(
+ struct UndoIDPtrMap *map, struct ID *id,
+ struct ID **id_prev);
+struct ID *BKE_undosys_ID_map_lookup_with_prev(
+ const struct UndoIDPtrMap *map, struct ID *id_src,
+ struct ID *id_prev_match[2]);
+
+void BKE_undosys_ID_map_foreach_ID_ref(
struct UndoIDPtrMap *map,
UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data);
diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c
index bb4c0b1130e..d478be7db06 100644
--- a/source/blender/blenkernel/intern/undo_system.c
+++ b/source/blender/blenkernel/intern/undo_system.c
@@ -776,6 +776,7 @@ void BKE_undosys_ID_map_add(UndoIDPtrMap *map, ID *id)
map->pmap[len_src].index = len_src;
map->len = len_dst;
+ /* TODO(campbell): use binary search result and memmove instread of full-sort. */
qsort(map->pmap, map->len, sizeof(*map->pmap), BLI_sortutil_cmp_ptr);
}
@@ -792,4 +793,26 @@ ID *BKE_undosys_ID_map_lookup(const UndoIDPtrMap *map, const ID *id_src)
return id_dst;
}
+void BKE_undosys_ID_map_add_with_prev(UndoIDPtrMap *map, ID *id, ID **id_prev)
+{
+ if (id == *id_prev) {
+ return;
+ }
+ *id_prev = id;
+ BKE_undosys_ID_map_add(map, id);
+}
+
+ID *BKE_undosys_ID_map_lookup_with_prev(const UndoIDPtrMap *map, ID *id_src, ID *id_prev_match[2])
+{
+ if (id_src == id_prev_match[0]) {
+ return id_prev_match[1];
+ }
+ else {
+ ID *id_dst = BKE_undosys_ID_map_lookup(map, id_src);
+ id_prev_match[0] = id_src;
+ id_prev_match[1] = id_dst;
+ return id_dst;
+ }
+}
+
/** \} */
More information about the Bf-blender-cvs
mailing list