refactor builder struct
This commit is contained in:
parent
5f0fd023cb
commit
0f682ca20a
|
@ -46,6 +46,7 @@ FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src);
|
|||
void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src);
|
||||
|
||||
//bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr);
|
||||
bool fstBuilderNodeEqual(FstBuilderNode *n1, FstBuilderNode *n2);
|
||||
|
||||
void fstBuilderNodeDestroy(FstBuilderNode *node);
|
||||
|
||||
|
|
|
@ -167,7 +167,6 @@ uint64_t fstUnFinishedNodesFindCommPrefixAndSetOutput(FstUnFinishedNodes *node,
|
|||
}
|
||||
if (addPrefix != 0) {
|
||||
fstBuilderNodeUnfinishedAddOutputPrefix(un, addPrefix);
|
||||
|
||||
}
|
||||
}
|
||||
return i;
|
||||
|
|
|
@ -18,7 +18,7 @@ FstBuilderNode *fstBuilderNodeDefault() {
|
|||
FstBuilderNode *bn = malloc(sizeof(FstBuilderNode));
|
||||
bn->isFinal = false;
|
||||
bn->finalOutput = 0;
|
||||
bn->trans = NULL;
|
||||
bn->trans = taosArrayInit(16, sizeof(FstTransition));
|
||||
return bn;
|
||||
}
|
||||
void fstBuilderNodeDestroy(FstBuilderNode *node) {
|
||||
|
@ -27,6 +27,25 @@ void fstBuilderNodeDestroy(FstBuilderNode *node) {
|
|||
taosArrayDestroy(node->trans);
|
||||
free(node);
|
||||
}
|
||||
|
||||
bool fstBuilderNodeEqual(FstBuilderNode *n1, FstBuilderNode *n2) {
|
||||
if (n1 == n2) { return true; }
|
||||
|
||||
if (n1->isFinal != n2->isFinal ||
|
||||
n1->finalOutput != n2->finalOutput ||
|
||||
taosArrayGetSize(n1->trans) != taosArrayGetSize(n2->trans)) {
|
||||
return false;
|
||||
}
|
||||
size_t sz = taosArrayGetSize(n1->trans);
|
||||
for (size_t i = 0; i < sz; i++) {
|
||||
FstTransition *t1 = taosArrayGet(n1->trans, i);
|
||||
FstTransition *t2 = taosArrayGet(n2->trans, i);
|
||||
if (t1->inp != t2->inp || t1->out != t2->out || t1->addr != t2->addr) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src) {
|
||||
FstBuilderNode *node = malloc(sizeof(FstBuilderNode));
|
||||
if (node == NULL) { return NULL; }
|
||||
|
@ -53,12 +72,17 @@ void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src) {
|
|||
dst->isFinal = src->isFinal;
|
||||
dst->finalOutput = src->finalOutput;
|
||||
|
||||
// avoid mem leak
|
||||
//release free avoid mem leak
|
||||
taosArrayDestroy(dst->trans);
|
||||
dst->trans = src->trans;
|
||||
src->trans = NULL;
|
||||
size_t sz = taosArrayGetSize(src->trans);
|
||||
dst->trans = taosArrayInit(sz, sizeof(FstTransition));
|
||||
for (size_t i = 0; i < sz; i++) {
|
||||
FstTransition *trn = taosArrayGet(src->trans, i);
|
||||
taosArrayPush(dst->trans, trn);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr) {
|
||||
|
||||
//size_t sz = taosArrayGetSize(b->trans);
|
||||
|
|
|
@ -112,7 +112,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
|||
if (end - start == 1) {
|
||||
FstRegistryCell *cell = taosArrayGet(registry->table, start);
|
||||
//cell->isNode &&
|
||||
if (cell->addr != NONE_ADDRESS && cell->node == bNode) {
|
||||
if (cell->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell->node, bNode)) {
|
||||
entry->state = FOUND;
|
||||
entry->addr = cell->addr ;
|
||||
return entry;
|
||||
|
@ -123,13 +123,13 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
|||
}
|
||||
} else if (end - start == 2) {
|
||||
FstRegistryCell *cell1 = taosArrayGet(registry->table, start);
|
||||
if (cell1->addr != NONE_ADDRESS && cell1->node == bNode) {
|
||||
if (cell1->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell1->node, bNode)) {
|
||||
entry->state = FOUND;
|
||||
entry->addr = cell1->addr;
|
||||
return entry;
|
||||
}
|
||||
FstRegistryCell *cell2 = taosArrayGet(registry->table, start + 1);
|
||||
if (cell2->addr != NONE_ADDRESS && cell2->node == bNode) {
|
||||
if (cell2->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell2->node, bNode)) {
|
||||
entry->state = FOUND;
|
||||
entry->addr = cell2->addr;
|
||||
// must swap here
|
||||
|
@ -147,7 +147,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
|||
uint32_t i = start;
|
||||
for (; i < end; i++) {
|
||||
FstRegistryCell *cell = (FstRegistryCell *)taosArrayGet(registry->table, i);
|
||||
if (cell->addr != NONE_ADDRESS && cell->node == bNode) {
|
||||
if (cell->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell->node, bNode)) {
|
||||
entry->state = FOUND;
|
||||
entry->addr = cell->addr;
|
||||
fstRegistryCellPromote(registry->table, i, start);
|
||||
|
|
|
@ -63,11 +63,16 @@
|
|||
//}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
std::string str("Hello world");
|
||||
std::string str("abc");
|
||||
FstSlice key = fstSliceCreate((uint8_t *)str.c_str(), str.size());
|
||||
Output val = 10;
|
||||
|
||||
std::string str1("bcd");
|
||||
FstSlice key1 = fstSliceCreate((uint8_t *)str1.c_str(), str1.size());
|
||||
Output val2 = 10;
|
||||
FstBuilder *b = fstBuilderCreate(NULL, 1);
|
||||
fstBuilderInsert(b, key, val);
|
||||
fstBuilderInsert(b, key1, val2);
|
||||
fstBuilderFinish(b);
|
||||
fstBuilderDestroy(b);
|
||||
fstSliceDestroy(&key);
|
||||
|
|
Loading…
Reference in New Issue