提交 f95c0013 编写于 作者: H Hongze Cheng

more code

上级 66177fb9
/*
* 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 "os.h"
typedef struct SRBTree SRBTree;
typedef struct SRBTreeNode SRBTreeNode;
typedef struct SRBTreeIter SRBTreeIter;
typedef int32_t (*tRBTreeCmprFn)(void *, void *);
// SRBTree
#define tRBTreeCreate(compare) \
(SRBTree) { .cmprFn = (compare), .root = NULL, .minNode = NULL, .maxNode = NULL }
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew);
void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode);
SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey);
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey);
// SRBTreeIter
#define tRBTreeIterCreate(tree) \
(SRBTreeIter) { .pTree = (tree) }
SRBTreeNode *tRBTreeIterNext(SRBTreeIter *pIter);
struct SRBTreeNode {
enum { RED, BLACK } color;
SRBTreeNode *parent;
SRBTreeNode *left;
SRBTreeNode *right;
uint8_t payload[];
};
struct SRBTree {
tRBTreeCmprFn cmprFn;
SRBTreeNode *rootNode;
SRBTreeNode *minNode;
SRBTreeNode *maxNode;
};
struct SRBTreeIter {
SRBTree *pTree;
};
......@@ -36,6 +36,7 @@
#include "tlosertree.h"
#include "tlrucache.h"
#include "tmsgcb.h"
#include "trbtree.h"
#include "tref.h"
#include "tskiplist.h"
#include "tstream.h"
......
......@@ -28,6 +28,20 @@ typedef struct {
int32_t iRow;
} SLDataIter;
typedef struct {
SRBTree tMerge;
} SDataMerger;
SRowInfo *tDataMergeNext(SDataMerger *pMerger) {
SRowInfo *pRowInfo = NULL;
SRBTreeNode *pNode = pMerger->tMerge.minNode;
if (pNode == NULL) return NULL;
return pRowInfo;
}
// ================================================================================
typedef struct {
STsdb *pTsdb;
int8_t maxLast;
......
......@@ -13,30 +13,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
typedef int32_t (*tRBTreeCmprFn)(void *, void *);
typedef struct SRBTree SRBTree;
typedef struct SRBTreeNode SRBTreeNode;
typedef struct SRBTreeIter SRBTreeIter;
struct SRBTreeNode {
enum { RED, BLACK } color;
SRBTreeNode *parent;
SRBTreeNode *left;
SRBTreeNode *right;
uint8_t payload[];
};
struct SRBTree {
tRBTreeCmprFn cmprFn;
SRBTreeNode *root;
};
struct SRBTreeIter {
SRBTree *pTree;
};
#include "trbtree.h"
#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK)
......@@ -51,7 +28,7 @@ static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) {
right->parent = pNode->parent;
if (pNode->parent == NULL) {
pTree->root = right;
pTree->rootNode = right;
} else if (pNode == pNode->parent->left) {
pNode->parent->left = right;
} else {
......@@ -72,7 +49,7 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
left->parent = pNode->parent;
if (pNode->parent == NULL) {
pTree->root = left;
pTree->rootNode = left;
} else if (pNode == pNode->parent->left) {
pNode->parent->left = left;
} else {
......@@ -83,20 +60,17 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
pNode->parent = left;
}
#define tRBTreeCreate(compare) \
(SRBTree) { .cmprFn = (compare), .root = NULL }
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
pNew->left = NULL;
pNew->right = NULL;
pNew->color = RED;
// insert
if (pTree->root == NULL) {
if (pTree->rootNode == NULL) {
pNew->parent = NULL;
pTree->root = pNew;
pTree->rootNode = pNew;
} else {
SRBTreeNode *pNode = pTree->root;
SRBTreeNode *pNode = pTree->rootNode;
while (true) {
ASSERT(pNode);
......@@ -165,12 +139,16 @@ SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
}
}
pTree->root->color = BLACK;
pTree->rootNode->color = BLACK;
return pNew;
}
SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) {
SRBTreeNode *pNode = pTree->root;
void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode) {
// TODO
}
SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey) {
SRBTreeNode *pNode = pTree->rootNode;
while (pNode) {
int32_t c = pTree->cmprFn(pKey, pNode->payload);
......@@ -185,14 +163,14 @@ SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) {
}
if (pNode) {
// TODO
tRBTreeDrop(pTree, pNode);
}
return pNode;
}
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) {
SRBTreeNode *pNode = pTree->root;
SRBTreeNode *pNode = pTree->rootNode;
while (pNode) {
int32_t c = pTree->cmprFn(pKey, pNode->payload);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册