1
/*********************************************************************
2
* Clustal Omega - Multiple sequence alignment
4
* Copyright (C) 2010 University College Dublin
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.
11
* This file is part of Clustal-Omega.
13
********************************************************************/
16
* RCS $Id: list.h 193 2011-02-07 15:45:21Z andreas $
18
* Generic single linked list storing pointers to data
22
#ifndef CLUSTALO_LIST_H
23
#define CLUSTALO_LIST_H
27
typedef struct list_elem_s {
29
struct list_elem_s *next;
35
/* user defined function for freeing data */
36
void (*destroy)(void *data);
41
void ListInit(list_t *prList, void (*destroy)(void *data));
43
void ListDestroy(list_t *prList);
45
int ListInsertNext(list_t *prList, list_elem_t *prElement, const void *data);
47
#define LIST_APPEND(prList, data) ListInsertNext((prList), LIST_TAIL(prList), (data))
49
#define LIST_PREPEND(prList, data) ListInsertNext((prList), CLUSTALO_LIST_HEAD(prList), (data))
51
int ListRemoveNext(list_t *prList, list_elem_t *prElement, void **data);
53
#define LIST_SIZE(prList) ((prList)->size)
55
#define CLUSTALO_LIST_HEAD(prList) ((prList)->head)
57
#define LIST_TAIL(prList) ((prList)->tail)
59
#define LIST_IS_HEAD(prList, prElement) ((prElement) == (prList)->head ? 1 : 0)
61
#define LIST_IS_TAIL(prElement) ((prElement)->next == NULL ? 1 : 0)
63
#define LIST_DATA(prElement) ((prElement)->data)
65
#define LIST_NEXT(prElement) ((prElement)->next)
71
/* special int list: stores ints by copying them (instead of storing
72
* pointers as generic list)
76
typedef list_t int_list_t;
78
#define INT_LIST_INIT(prList) ListInit((prList), free)
80
#define INT_LIST_DESTROY(prList) ListDestroy((prList));
82
int IntListInsertNext(list_t *prList, list_elem_t *prElement, const int data);
84
#define INT_LIST_APPEND(prList, data) IntListInsertNext((prList), LIST_TAIL(prList), (data))
86
#define INT_LIST_PREPEND(prList, data) IntListInsertNext((prList), CLUSTALO_LIST_HEAD(prList), (data))
88
int IntListRemoveNext(list_t *prList, list_elem_t *prElement, int *data);
90
#define INT_LIST_SIZE(prList) LIST_SIZE(prList)
92
#define INT_CLUSTALO_LIST_HEAD(prList) CLUSTALO_LIST_HEAD_INT((prList))
94
#define INT_LIST_TAIL(prList) LIST_TAIL_INT((prList) )
96
#define INT_LIST_IS_HEAD(prList, prElement) LIST_IS_HEAD(prList, prElement)
98
#define INT_LIST_IS_TAIL(prElement) LIST_IS_TAIL((prElement))
100
#define INT_LIST_DATA(prElement) LIST_DATA((prElement))
102
#define INT_LIST_NEXT(prElement) LIST_NEXT((prElement))