diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2015-09-24 18:24:20 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2015-09-24 18:24:20 +0300 |
commit | 27b3ea622f8bd313a8e2827dfec752bf2125566c (patch) | |
tree | f212e49d224ce8e1cfc3b17a64ae524711494391 /source/blender/blenlib/BLI_linklist.h | |
parent | 372dff8d1dc7e24d4b2cd37de245588ecfce8bfa (diff) | |
parent | de80e687689032cb85179a1f7e89750573631d5d (diff) |
Merge remote-tracking branch 'origin/master' into cycles_camera_nodescycles_camera_nodes
Note: the branch currently crashes in blender_camera_nodes.cpp:
BL::NodeTree b_ntree = b_data.node_groups[nodes_tree_name];
The crash was introduced in:
cb7cf523e5c000609f32a382e2c0fcc57f635a42
Conflicts:
intern/cycles/SConscript
intern/cycles/blender/addon/__init__.py
intern/cycles/blender/addon/properties.py
intern/cycles/blender/blender_camera.cpp
intern/cycles/kernel/kernel_types.h
intern/cycles/kernel/svm/svm.h
intern/cycles/kernel/svm/svm_types.h
intern/cycles/render/camera.cpp
intern/cycles/render/camera.h
Diffstat (limited to 'source/blender/blenlib/BLI_linklist.h')
-rw-r--r-- | source/blender/blenlib/BLI_linklist.h | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/source/blender/blenlib/BLI_linklist.h b/source/blender/blenlib/BLI_linklist.h index 2ca363ee780..67cb30e8d17 100644 --- a/source/blender/blenlib/BLI_linklist.h +++ b/source/blender/blenlib/BLI_linklist.h @@ -35,43 +35,59 @@ * */ +#include "BLI_compiler_attrs.h" + struct MemArena; struct BLI_mempool; typedef void (*LinkNodeFreeFP)(void *link); typedef void (*LinkNodeApplyFP)(void *link, void *userdata); -struct LinkNode; typedef struct LinkNode { struct LinkNode *next; void *link; } LinkNode; -int BLI_linklist_length(struct LinkNode *list); -int BLI_linklist_index(struct LinkNode *list, void *ptr); +/** + * Use for append (single linked list, storing the last element). + * + * \note list manipulation functions don't operate on this struct. + * This is only to be used while appending. + */ +typedef struct LinkNodePair { + LinkNode *list, *last_node; +} LinkNodePair; + +int BLI_linklist_count(LinkNode *list) ATTR_WARN_UNUSED_RESULT; +int BLI_linklist_index(LinkNode *list, void *ptr) ATTR_WARN_UNUSED_RESULT; + +LinkNode *BLI_linklist_find(LinkNode *list, int index) ATTR_WARN_UNUSED_RESULT; -struct LinkNode *BLI_linklist_find(struct LinkNode *list, int index); +void BLI_linklist_reverse(LinkNode **listp) ATTR_NONNULL(1); -void BLI_linklist_reverse(struct LinkNode **listp); +void BLI_linklist_move_item(LinkNode **listp, int curr_index, int new_index) ATTR_NONNULL(1); -void BLI_linklist_prepend_nlink(struct LinkNode **listp, void *ptr, struct LinkNode *nlink); -void BLI_linklist_prepend(struct LinkNode **listp, void *ptr); -void BLI_linklist_prepend_arena(struct LinkNode **listp, void *ptr, struct MemArena *ma); -void BLI_linklist_prepend_pool(struct LinkNode **listp, void *ptr, struct BLI_mempool *mempool); +void BLI_linklist_prepend_nlink(LinkNode **listp, void *ptr, LinkNode *nlink) ATTR_NONNULL(1, 3); +void BLI_linklist_prepend(LinkNode **listp, void *ptr) ATTR_NONNULL(1); +void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, struct MemArena *ma) ATTR_NONNULL(1, 3); +void BLI_linklist_prepend_pool(LinkNode **listp, void *ptr, struct BLI_mempool *mempool) ATTR_NONNULL(1, 3); -void BLI_linklist_append_nlink(LinkNode **listp, void *ptr, LinkNode *nlink); -void BLI_linklist_append(struct LinkNode **listp, void *ptr); -void BLI_linklist_append_arena(LinkNode **listp, void *ptr, struct MemArena *ma); -void BLI_linklist_append_pool(LinkNode **listp, void *ptr, struct BLI_mempool *mempool); +/* use LinkNodePair to avoid full search */ +void BLI_linklist_append_nlink(LinkNodePair *list_pair, void *ptr, LinkNode *nlink) ATTR_NONNULL(1, 3); +void BLI_linklist_append(LinkNodePair *list_pair, void *ptr) ATTR_NONNULL(1); +void BLI_linklist_append_arena(LinkNodePair *list_pair, void *ptr, struct MemArena *ma) ATTR_NONNULL(1, 3); +void BLI_linklist_append_pool(LinkNodePair *list_pair, void *ptr, struct BLI_mempool *mempool) ATTR_NONNULL(1, 3); -void *BLI_linklist_pop(struct LinkNode **listp); -void *BLI_linklist_pop_pool(struct LinkNode **listp, struct BLI_mempool *mempool); -void BLI_linklist_insert_after(struct LinkNode **listp, void *ptr); +void *BLI_linklist_pop(LinkNode **listp) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1); +void *BLI_linklist_pop_pool(LinkNode **listp, struct BLI_mempool *mempool) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2); +void BLI_linklist_insert_after(LinkNode **listp, void *ptr) ATTR_NONNULL(1); -void BLI_linklist_free(struct LinkNode *list, LinkNodeFreeFP freefunc); -void BLI_linklist_freeN(struct LinkNode *list); -void BLI_linklist_free_pool(LinkNode *list, LinkNodeFreeFP freefunc, struct BLI_mempool *mempool); -void BLI_linklist_apply(struct LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata); +void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc); +void BLI_linklist_freeN(LinkNode *list); +void BLI_linklist_free_pool(LinkNode *list, LinkNodeFreeFP freefunc, struct BLI_mempool *mempool); +void BLI_linklist_apply(LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata); +LinkNode *BLI_linklist_sort(LinkNode *list, int (*cmp)(const void *, const void *)) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2); +LinkNode *BLI_linklist_sort_r(LinkNode *list, int (*cmp)(void *, const void *, const void *), void *thunk) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2); #define BLI_linklist_prepend_alloca(listp, ptr) \ BLI_linklist_prepend_nlink(listp, ptr, alloca(sizeof(LinkNode))) |