提交 4e9fba6d 编写于 作者: dengyihao's avatar dengyihao

update fst struct

上级 7b62d02f
...@@ -240,12 +240,13 @@ uint64_t fstStateInputLen(FstState* s) { ...@@ -240,12 +240,13 @@ uint64_t fstStateInputLen(FstState* s) {
return null ? 1 : 0 ; return null ? 1 : 0 ;
} }
// end_addr // end_addr
uint64_t fstStateEndAddrForOneTransNext(FstState* s, FstSlice *data) { uint64_t fstStateEndAddrForOneTransNext(FstState* s, FstSlice *data) {
assert(s->state == OneTransNext);
return FST_SLICE_LEN(data) - 1 - fstStateInputLen(s); return FST_SLICE_LEN(data) - 1 - fstStateInputLen(s);
} }
uint64_t fstStateEndAddrForOneTrans(FstState *s, FstSlice *data, PackSizes sizes) { uint64_t fstStateEndAddrForOneTrans(FstState *s, FstSlice *data, PackSizes sizes) {
assert(s->state == OneTrans);
return FST_SLICE_LEN(data) return FST_SLICE_LEN(data)
- 1 - 1
- fstStateInputLen(s) - fstStateInputLen(s)
...@@ -488,34 +489,36 @@ FstNode *fstNodeCreate(int64_t version, CompiledAddr addr, FstSlice *slice) { ...@@ -488,34 +489,36 @@ FstNode *fstNodeCreate(int64_t version, CompiledAddr addr, FstSlice *slice) {
n->version = version; n->version = version;
n->state = st; n->state = st;
n->start = addr; n->start = addr;
n->end = addr; //? s.end_addr(data); n->end = fstStateEndAddrForOneTransNext(&st, slice); //? s.end_addr(data);
n->isFinal = false; n->isFinal = false;
n->sizes = 0; n->sizes = 0;
n->nTrans = 0; n->nTrans = 1;
n->finalOutput = 0; n->finalOutput = 0;
} else if (st.state == OneTrans) { } else if (st.state == OneTrans) {
uint64_t sz; // fetch sz from addr FstSlice data = fstSliceCopy(slice, 0, addr);
n->data = fstSliceCopy(slice, 0, addr); PackSizes sz = fstStateSizes(&st, &data);
n->data = fstSliceCopy(slice, 0, addr);
n->version = version; n->version = version;
n->state = st; n->state = st;
n->start = addr; n->start = addr;
n->end = addr; // s.end_addr(data, sz); n->end = fstStateEndAddrForOneTrans(&st, slice, sz); // s.end_addr(data, sz);
n->isFinal = false; n->isFinal = false;
n->nTrans = 1; n->nTrans = 1;
n->sizes = sz; n->sizes = sz;
n->finalOutput = 0; n->finalOutput = 0;
} else { } else {
uint64_t sz; // s.sizes(data)
uint32_t nTrans; // s.ntrans(data) uint64_t sz = fstStateSizes(&st, slice); // s.sizes(data)
uint32_t nTrans = fstStateNtrans(&st, slice); // s.ntrans(data)
n->data = *slice; n->data = *slice;
n->version = version; n->version = version;
n->state = st; n->state = st;
n->start = addr; n->start = addr;
n->end = addr; // s.end_addr(version, data, sz, ntrans); n->end = fstStateEndAddrForAnyTrans(&st, version, slice, sz, nTrans); // s.end_addr(version, data, sz, ntrans);
n->isFinal = false; // s.is_final_state(); n->isFinal = fstStateIsFinalState(&st); // s.is_final_state();
n->nTrans = nTrans; n->nTrans = nTrans;
n->sizes = sz; n->sizes = sz;
n->finalOutput = 0; // s.final_output(version, data, sz, ntrans); n->finalOutput = fstStateFinalOutput(&st, version, slice, sz, nTrans); // s.final_output(version, data, sz, ntrans);
} }
return n; return n;
} }
...@@ -598,13 +601,16 @@ bool fstNodeCompile(FstNode *node, void *w, CompiledAddr lastAddr, CompiledAddr ...@@ -598,13 +601,16 @@ bool fstNodeCompile(FstNode *node, void *w, CompiledAddr lastAddr, CompiledAddr
if (sz == 0 && builderNode->isFinal && builderNode->finalOutput == 0) { if (sz == 0 && builderNode->isFinal && builderNode->finalOutput == 0) {
return true; return true;
} else if (sz != 1 || builderNode->isFinal) { } else if (sz != 1 || builderNode->isFinal) {
fstStateCompileForAnyTrans(w, addr, builderNode);
// AnyTrans->Compile(w, addr, node); // AnyTrans->Compile(w, addr, node);
} else { } else {
FstTransition *tran = taosArrayGet(builderNode->trans, 0); FstTransition *tran = taosArrayGet(builderNode->trans, 0);
if (tran->addr == lastAddr && tran->out == 0) { if (tran->addr == lastAddr && tran->out == 0) {
fstStateCompileForOneTransNext(w, addr, tran->inp);
//OneTransNext::compile(w, lastAddr, tran->inp); //OneTransNext::compile(w, lastAddr, tran->inp);
return true; return true;
} else { } else {
fstStateCompileForOneTrans(w, addr, tran);
//OneTrans::Compile(w, lastAddr, *tran); //OneTrans::Compile(w, lastAddr, *tran);
return true; return true;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册