From 4e2c124c012d4759c9867f098392d9e51ac0d461 Mon Sep 17 00:00:00 2001 From: hzcheng Date: Fri, 20 Mar 2020 14:38:13 +0800 Subject: [PATCH] TD-34 --- src/util/inc/tlist.h | 61 +++++++++++++++++++++ src/util/src/tlist.c | 125 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 src/util/inc/tlist.h create mode 100644 src/util/src/tlist.c diff --git a/src/util/inc/tlist.h b/src/util/inc/tlist.h new file mode 100644 index 0000000000..3f58c35e3b --- /dev/null +++ b/src/util/inc/tlist.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#ifndef _TD_LIST_ +#define _TD_LIST_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _list_node { + struct _list_node *next; + struct _list_node *prev; + char data[]; +} SListNode; + +typedef struct { + struct _list_node *head; + struct _list_node *tail; + int numOfEles; + int eleSize; +} SList; + +typedef struct { + SListNode *node; +} SListIter; + +#define listHead(l) (l)->head +#define listTail(l) (l)->tail +#define listNEles(l) (l)->numOfEles +#define listEleSize(l) (l)->eleSize +#define isListEmpty(l) ((l)->numOfEles == 0) +#define listNodeFree(n) free(n); + +SList * tdListNew(int eleSize); +void tdListFree(SList *list); +void tdListEmpty(SList *list); +int tdListPrepend(SList *list, void *data); +int tdListAppend(SList *list, void *data); +SListNode *tdListPopHead(SList *list); +SListNode *tdListPopTail(SList *list); +SListNode *tdListPopNode(SList *list, SListNode *node); + +void tdListNodeGetData(SList *list, SListNode *node, void *target); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/util/src/tlist.c b/src/util/src/tlist.c new file mode 100644 index 0000000000..42068a717e --- /dev/null +++ b/src/util/src/tlist.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +#include +#include + +#include "tlist.h" + +SList *tdListNew(int eleSize) { + SList *list = (SList *)malloc(sizeof(SList)); + if (list == NULL) return NULL; + + list->eleSize = eleSize; + list->numOfEles = 0; + list->head = list->tail = NULL; + return NULL; +} + +void tdListEmpty(SList *list) { + SListNode *node = list->head; + while (node) { + list->head = node->next; + free(node); + node = list->head; + } + list->head = list->tail = 0; + list->numOfEles = 0; +} + +void tdListFree(SList *list) { + tdListEmpty(list); + free(list); +} + +int tdListPrepend(SList *list, void *data) { + SListNode *node = (SListNode *)malloc(sizeof(SListNode) + list->eleSize); + if (node == NULL) return -1; + + if (list->head == NULL) { + list->head = node; + list->tail = node; + } else { + node->next = list->head; + node->prev = NULL; + list->head->prev = node; + list->head = node; + } + list->numOfEles++; + return 0; +} + +int tdListAppend(SList *list, void *data) { + SListNode *node = (SListNode *)malloc(sizeof(SListNode) + list->eleSize); + if (node == NULL) return -1; + if (list->head == NULL) { + list->head = node; + list->tail = node; + } else { + node->prev = list->tail; + node->next = NULL; + list->tail->next = node; + list->tail = node; + } + + list->numOfEles++; + return 0; +} + +SListNode *tdListPopHead(SList *list) { + if (list->head == NULL) return NULL; + SListNode *node = list->head; + if (node->next == NULL) { + list->head = NULL; + list->tail = NULL; + } else { + list->head = node->next; + } + list->numOfEles--; + return node; +} + +SListNode *tdListPopTail(SList *list) { + if (list->tail == NULL) return NULL; + SListNode *node = list->tail; + if (node->prev == NULL) { + list->head = NULL; + list->tail = NULL; + } else { + list->tail = node->prev; + } + list->numOfEles--; + return node; +} + +SListNode *tdListPopNode(SList *list, SListNode *node) { + if (list->head == node) { + list->head = node->next; + } + if (list->tail == node) { + list->tail = node->prev; + } + + if (node->prev != NULL) { + node->prev->next = node->next; + } + if (node->next != NULL) { + node->next->prev = node->prev; + } + list->numOfEles--; + + return node; +} + +void tdListNodeGetData(SList *list, SListNode *node, void *target) { memcpy(node->data, target, list->eleSize); } \ No newline at end of file