提交 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 @@ ...@@ -36,6 +36,7 @@
#include "tlosertree.h" #include "tlosertree.h"
#include "tlrucache.h" #include "tlrucache.h"
#include "tmsgcb.h" #include "tmsgcb.h"
#include "trbtree.h"
#include "tref.h" #include "tref.h"
#include "tskiplist.h" #include "tskiplist.h"
#include "tstream.h" #include "tstream.h"
......
...@@ -28,6 +28,20 @@ typedef struct { ...@@ -28,6 +28,20 @@ typedef struct {
int32_t iRow; int32_t iRow;
} SLDataIter; } 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 { typedef struct {
STsdb *pTsdb; STsdb *pTsdb;
int8_t maxLast; int8_t maxLast;
......
...@@ -13,30 +13,7 @@ ...@@ -13,30 +13,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "os.h" #include "trbtree.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;
};
#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK) #define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK)
...@@ -51,7 +28,7 @@ static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) { ...@@ -51,7 +28,7 @@ static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) {
right->parent = pNode->parent; right->parent = pNode->parent;
if (pNode->parent == NULL) { if (pNode->parent == NULL) {
pTree->root = right; pTree->rootNode = right;
} else if (pNode == pNode->parent->left) { } else if (pNode == pNode->parent->left) {
pNode->parent->left = right; pNode->parent->left = right;
} else { } else {
...@@ -72,7 +49,7 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) { ...@@ -72,7 +49,7 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
left->parent = pNode->parent; left->parent = pNode->parent;
if (pNode->parent == NULL) { if (pNode->parent == NULL) {
pTree->root = left; pTree->rootNode = left;
} else if (pNode == pNode->parent->left) { } else if (pNode == pNode->parent->left) {
pNode->parent->left = left; pNode->parent->left = left;
} else { } else {
...@@ -83,20 +60,17 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) { ...@@ -83,20 +60,17 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
pNode->parent = left; pNode->parent = left;
} }
#define tRBTreeCreate(compare) \
(SRBTree) { .cmprFn = (compare), .root = NULL }
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) { SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
pNew->left = NULL; pNew->left = NULL;
pNew->right = NULL; pNew->right = NULL;
pNew->color = RED; pNew->color = RED;
// insert // insert
if (pTree->root == NULL) { if (pTree->rootNode == NULL) {
pNew->parent = NULL; pNew->parent = NULL;
pTree->root = pNew; pTree->rootNode = pNew;
} else { } else {
SRBTreeNode *pNode = pTree->root; SRBTreeNode *pNode = pTree->rootNode;
while (true) { while (true) {
ASSERT(pNode); ASSERT(pNode);
...@@ -165,12 +139,16 @@ SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) { ...@@ -165,12 +139,16 @@ SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
} }
} }
pTree->root->color = BLACK; pTree->rootNode->color = BLACK;
return pNew; return pNew;
} }
SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) { void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode) {
SRBTreeNode *pNode = pTree->root; // TODO
}
SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey) {
SRBTreeNode *pNode = pTree->rootNode;
while (pNode) { while (pNode) {
int32_t c = pTree->cmprFn(pKey, pNode->payload); int32_t c = pTree->cmprFn(pKey, pNode->payload);
...@@ -185,14 +163,14 @@ SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) { ...@@ -185,14 +163,14 @@ SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) {
} }
if (pNode) { if (pNode) {
// TODO tRBTreeDrop(pTree, pNode);
} }
return pNode; return pNode;
} }
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) { SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) {
SRBTreeNode *pNode = pTree->root; SRBTreeNode *pNode = pTree->rootNode;
while (pNode) { while (pNode) {
int32_t c = pTree->cmprFn(pKey, pNode->payload); 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.
先完成此消息的编辑!
想要评论请 注册