diff options
Diffstat (limited to 'examples/redis-unstable/src/adlist.h')
| -rw-r--r-- | examples/redis-unstable/src/adlist.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/examples/redis-unstable/src/adlist.h b/examples/redis-unstable/src/adlist.h new file mode 100644 index 0000000..bb0eed1 --- /dev/null +++ b/examples/redis-unstable/src/adlist.h | |||
| @@ -0,0 +1,80 @@ | |||
| 1 | /* adlist.h - A generic doubly linked list implementation | ||
| 2 | * | ||
| 3 | * Copyright (c) 2006-Present, Redis Ltd. | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Licensed under your choice of (a) the Redis Source Available License 2.0 | ||
| 7 | * (RSALv2); or (b) the Server Side Public License v1 (SSPLv1); or (c) the | ||
| 8 | * GNU Affero General Public License v3 (AGPLv3). | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __ADLIST_H__ | ||
| 12 | #define __ADLIST_H__ | ||
| 13 | |||
| 14 | /* Node, List, and Iterator are the only data structures used currently. */ | ||
| 15 | |||
| 16 | typedef struct listNode { | ||
| 17 | struct listNode *prev; | ||
| 18 | struct listNode *next; | ||
| 19 | void *value; | ||
| 20 | } listNode; | ||
| 21 | |||
| 22 | typedef struct listIter { | ||
| 23 | listNode *next; | ||
| 24 | int direction; | ||
| 25 | } listIter; | ||
| 26 | |||
| 27 | typedef struct list { | ||
| 28 | listNode *head; | ||
| 29 | listNode *tail; | ||
| 30 | void *(*dup)(void *ptr); | ||
| 31 | void (*free)(void *ptr); | ||
| 32 | int (*match)(void *ptr, void *key); | ||
| 33 | unsigned long len; | ||
| 34 | } list; | ||
| 35 | |||
| 36 | /* Functions implemented as macros */ | ||
| 37 | #define listLength(l) ((l)->len) | ||
| 38 | #define listFirst(l) ((l)->head) | ||
| 39 | #define listLast(l) ((l)->tail) | ||
| 40 | #define listPrevNode(n) ((n)->prev) | ||
| 41 | #define listNextNode(n) ((n)->next) | ||
| 42 | #define listNodeValue(n) ((n)->value) | ||
| 43 | |||
| 44 | #define listSetDupMethod(l,m) ((l)->dup = (m)) | ||
| 45 | #define listSetFreeMethod(l,m) ((l)->free = (m)) | ||
| 46 | #define listSetMatchMethod(l,m) ((l)->match = (m)) | ||
| 47 | |||
| 48 | #define listGetDupMethod(l) ((l)->dup) | ||
| 49 | #define listGetFreeMethod(l) ((l)->free) | ||
| 50 | #define listGetMatchMethod(l) ((l)->match) | ||
| 51 | |||
| 52 | /* Prototypes */ | ||
| 53 | list *listCreate(void); | ||
| 54 | void listRelease(list *list); | ||
| 55 | void listReleaseGeneric(void *list); | ||
| 56 | void listEmpty(list *list); | ||
| 57 | list *listAddNodeHead(list *list, void *value); | ||
| 58 | list *listAddNodeTail(list *list, void *value); | ||
| 59 | list *listInsertNode(list *list, listNode *old_node, void *value, int after); | ||
| 60 | void listDelNode(list *list, listNode *node); | ||
| 61 | void listInitIterator(listIter *iter, list *list, int direction); | ||
| 62 | listNode *listNext(listIter *iter); | ||
| 63 | list *listDup(list *orig); | ||
| 64 | listNode *listSearchKey(list *list, void *key); | ||
| 65 | listNode *listIndex(list *list, long index); | ||
| 66 | void listRewind(list *list, listIter *li); | ||
| 67 | void listRewindTail(list *list, listIter *li); | ||
| 68 | void listRotateTailToHead(list *list); | ||
| 69 | void listRotateHeadToTail(list *list); | ||
| 70 | void listJoin(list *l, list *o); | ||
| 71 | void listInitNode(listNode *node, void *value); | ||
| 72 | void listLinkNodeHead(list *list, listNode *node); | ||
| 73 | void listLinkNodeTail(list *list, listNode *node); | ||
| 74 | void listUnlinkNode(list *list, listNode *node); | ||
| 75 | |||
| 76 | /* Directions for iterators */ | ||
| 77 | #define AL_START_HEAD 0 | ||
| 78 | #define AL_START_TAIL 1 | ||
| 79 | |||
| 80 | #endif /* __ADLIST_H__ */ | ||
