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