svn merge ^/trunk/blender -r47201:47210
[blender.git] / source / blender / blenlib / BLI_linklist.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27  
28 #ifndef __BLI_LINKLIST_H__
29 #define __BLI_LINKLIST_H__
30
31 /** \file BLI_linklist.h
32  *  \ingroup bli
33  *  \brief Routines for working with singly linked lists
34  *   of 'links' - pointers to other data.
35  * 
36  */
37
38 struct MemArena;
39
40 typedef void (*LinkNodeFreeFP)(void *link);
41 typedef void (*LinkNodeApplyFP)(void *link, void *userdata);
42
43 struct LinkNode;
44 typedef struct LinkNode {
45         struct LinkNode *next;
46         void *link;
47 } LinkNode;
48
49 int     BLI_linklist_length(struct LinkNode *list);
50 int     BLI_linklist_index(struct LinkNode *list, void *ptr);
51
52 struct LinkNode *BLI_linklist_find(struct LinkNode *list, int index);
53
54 void    BLI_linklist_reverse(struct LinkNode **listp);
55
56 void    BLI_linklist_prepend(struct LinkNode **listp, void *ptr);
57 void    BLI_linklist_append(struct LinkNode **listp, void *ptr);
58 void    BLI_linklist_prepend_arena(struct LinkNode **listp, void *ptr, struct MemArena *ma);
59 void    BLI_linklist_insert_after(struct LinkNode **listp, void *ptr);
60
61 void    BLI_linklist_free(struct LinkNode *list, LinkNodeFreeFP freefunc);
62 void    BLI_linklist_apply(struct LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata);
63
64 #endif