Clustal Omega  1.2.4
list.h
Go to the documentation of this file.
1 /*********************************************************************
2  * Clustal Omega - Multiple sequence alignment
3  *
4  * Copyright (C) 2010 University College Dublin
5  *
6  * Clustal-Omega is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This file is part of Clustal-Omega.
12  *
13  ********************************************************************/
14 
15 /*
16  * RCS $Id: list.h 193 2011-02-07 15:45:21Z andreas $
17  *
18  * Generic single linked list storing pointers to data
19  *
20  */
21 
22 #ifndef CLUSTALO_LIST_H
23 #define CLUSTALO_LIST_H
24 
25 #include <stdlib.h>
26 
27 typedef struct list_elem_s {
28  void *data;
29  struct list_elem_s *next;
31 
32 typedef struct {
33  /* size of list */
34  int size;
35  /* user defined function for freeing data */
36  void (*destroy)(void *data);
39 } list_t;
40 
41 void ListInit(list_t *prList, void (*destroy)(void *data));
42 
43 void ListDestroy(list_t *prList);
44 
45 int ListInsertNext(list_t *prList, list_elem_t *prElement, const void *data);
46 
47 #define LIST_APPEND(prList, data) ListInsertNext((prList), LIST_TAIL(prList), (data))
48 
49 #define LIST_PREPEND(prList, data) ListInsertNext((prList), CLUSTALO_LIST_HEAD(prList), (data))
50 
51 int ListRemoveNext(list_t *prList, list_elem_t *prElement, void **data);
52 
53 #define LIST_SIZE(prList) ((prList)->size)
54 
55 #define CLUSTALO_LIST_HEAD(prList) ((prList)->head)
56 
57 #define LIST_TAIL(prList) ((prList)->tail)
58 
59 #define LIST_IS_HEAD(prList, prElement) ((prElement) == (prList)->head ? 1 : 0)
60 
61 #define LIST_IS_TAIL(prElement) ((prElement)->next == NULL ? 1 : 0)
62 
63 #define LIST_DATA(prElement) ((prElement)->data)
64 
65 #define LIST_NEXT(prElement) ((prElement)->next)
66 
67 
68 
69 
70 
71 /* special int list: stores ints by copying them (instead of storing
72  * pointers as generic list)
73  *
74  */
75 
77 
78 #define INT_LIST_INIT(prList) ListInit((prList), free)
79 
80 #define INT_LIST_DESTROY(prList) ListDestroy((prList));
81 
82 int IntListInsertNext(list_t *prList, list_elem_t *prElement, const int data);
83 
84 #define INT_LIST_APPEND(prList, data) IntListInsertNext((prList), LIST_TAIL(prList), (data))
85 
86 #define INT_LIST_PREPEND(prList, data) IntListInsertNext((prList), CLUSTALO_LIST_HEAD(prList), (data))
87 
88 int IntListRemoveNext(list_t *prList, list_elem_t *prElement, int *data);
89 
90 #define INT_LIST_SIZE(prList) LIST_SIZE(prList)
91 
92 #define INT_CLUSTALO_LIST_HEAD(prList) CLUSTALO_LIST_HEAD_INT((prList))
93 
94 #define INT_LIST_TAIL(prList) LIST_TAIL_INT((prList) )
95 
96 #define INT_LIST_IS_HEAD(prList, prElement) LIST_IS_HEAD(prList, prElement)
97 
98 #define INT_LIST_IS_TAIL(prElement) LIST_IS_TAIL((prElement))
99 
100 #define INT_LIST_DATA(prElement) LIST_DATA((prElement))
101 
102 #define INT_LIST_NEXT(prElement) LIST_NEXT((prElement))
103 
104 
105 #endif
list_t::head
list_elem_t * head
Definition: list.h:37
ListRemoveNext
int ListRemoveNext(list_t *prList, list_elem_t *prElement, void **data)
Remove next element from current element/position.
Definition: list.c:158
list_elem_s::data
void * data
Definition: list.h:28
int_list_t
list_t int_list_t
Definition: list.h:76
IntListRemoveNext
int IntListRemoveNext(list_t *prList, list_elem_t *prElement, int *data)
Remove next element from current element/position.
Definition: list.c:240
list_elem_s::next
struct list_elem_s * next
Definition: list.h:29
list_elem_t
struct list_elem_s list_elem_t
list_t
Definition: list.h:32
list_t::size
int size
Definition: list.h:34
ListDestroy
void ListDestroy(list_t *prList)
Calls user defined function to free data in list and resets the list to NULL. Call even if your destr...
Definition: list.c:78
list_elem_s
Definition: list.h:27
ListInsertNext
int ListInsertNext(list_t *prList, list_elem_t *prElement, const void *data)
Insert data next to given element.
Definition: list.c:112
IntListInsertNext
int IntListInsertNext(list_t *prList, list_elem_t *prElement, const int data)
Insert int next to given element.
Definition: list.c:211
list_t::tail
list_elem_t * tail
Definition: list.h:38
ListInit
void ListInit(list_t *prList, void(*destroy)(void *data))
Initialise data members of a list.
Definition: list.c:57