more code
This commit is contained in:
parent
66177fb9f1
commit
f95c0013ef
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* 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);
|
||||
|
|
Loading…
Reference in New Issue