1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
/*
A* -------------------------------------------------------------------
B* This file contains source code for the PyMOL computer program
C* Copyright (c) Schrodinger, LLC.
D* -------------------------------------------------------------------
E* It is unlawful to modify or remove this copyright notice.
F* -------------------------------------------------------------------
G* Please see the accompanying LICENSE file for further information.
H* -------------------------------------------------------------------
I* Additional authors of this source file include:
-*
-*
-*
Z* -------------------------------------------------------------------
*/
#ifndef _H_ListMacros
#define _H_ListMacros
/* simplest possible single-linked list */
#include"MemoryDebug.h"
#include"Err.h"
#define ListInit(List) List = NULL
#define ListAppend(List,Elem,Link,ElemType) \
{ \
ElemType *current = (List); \
ElemType *previous = NULL; \
while(current) \
{ \
previous = current; \
current = current->Link; \
} \
if(previous) \
previous->Link = Elem; \
else \
(List) = Elem; \
(Elem)->Link = NULL; \
}
#define ListFree(List,Link,ElemType) \
{ \
ElemType *current = List; \
ElemType *previous = NULL; \
while(current) \
{ \
if(previous) \
mfree(previous); \
previous = current; \
current = current->Link; \
} \
if(previous) \
mfree(previous); \
(List) = NULL; \
}
#define ListDetach(List,Elem,Link,ElemType) \
{ \
ElemType *current = List; \
ElemType *previous = NULL; \
while(current) \
{ \
if(current == (Elem)) \
break; \
previous = current; \
current = current->Link; \
} \
if(current) \
{ \
if(previous) \
previous->Link = current->Link; \
else \
(List) = current->Link; \
(Elem)->Link = NULL; \
} \
}
#define ListDelete(List,Elem,Link,ElemType) \
{ \
ElemType *copy = (Elem); \
ListDetach(List,copy,Link,ElemType); \
mfree(copy); \
}
#define ListIterate(List,Counter,Link) \
( (Counter) = ((List) ? (((Counter) ? (Counter)->Link : (List))) : NULL))
/* Elem handling routines */
#define ListElemAlloc(G,Elem,ElemType) \
{ \
if(!(Elem)) \
{ \
(Elem) = pymol::malloc<ElemType>(1); \
ErrChkPtr(G,Elem); \
} \
}
#define ListElemCalloc(G,Elem,ElemType) \
{ \
if(!(Elem)) \
{ \
(Elem) = pymol::calloc<ElemType>(1); \
ErrChkPtr(G,Elem); \
} \
}
#define ListElemFree(Elem) { mfree(Elem); Elem = NULL; }
#endif /* _H_ListMacros */
|