TD-34
This commit is contained in:
parent
72f871f0cd
commit
4e2c124c01
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#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
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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); }
|
Loading…
Reference in New Issue