#ifndef PHRASETABLE_H #define PHRASETABLE_H struct PgfConcrLin; struct PgfConcrLincat; struct PGF_INTERNAL_DECL PgfTextSpot { size_t pos; // position in Unicode characters const uint8_t *ptr; // pointer into the spot location }; struct PGF_INTERNAL_DECL PgfItem { struct { size_t &operator[](int i) { PgfItem *item = containerof(PgfItem,vars,this); return ((size_t*) (((ref*) (item+1))+item->rule->args.size()))[i]; } size_t size() { PgfItem *item = containerof(PgfItem,vars,this); return (item->rule->ranges != 0) ? item->rule->ranges.size() : 0; } } vars; struct { ref &operator[](int i) { PgfItem *item = containerof(PgfItem,args,this); return ((ref*) (item+1))[i]; } size_t size() { PgfItem *item = containerof(PgfItem,args,this); return item->rule->args.size(); } } args; static void release(ref item) { size_t ex_size = sizeof(ref) * item->args.size() + sizeof(size_t) * item->vars.size(); PgfDB::free(item, ex_size); } uint16_t pre_alt; uint16_t pre_dot; uint16_t dot; ref rule; }; struct PGF_INTERNAL_DECL PgfPhrasetableValue { PgfSymbol sym; // Here n_items tells us how many actual items there are in // the vector items. On the other hand, items.size() tells us // how big buffer we have allocated. size_t n_items; vector> items; }; typedef ref> PgfPhrasetable; PgfPhrasetable phrasetable_insert(PgfPhrasetable table, PgfSymbol sym, ref item); PgfPhrasetable phrasetable_insert(PgfPhrasetable table, ref lincat, interval_t value, interval_t lin_idx, PgfMetaId fid, prob_t viterbi_prob, ref item); PGF_INTERNAL_DECL void phrasetable_iter(PgfPhrasetable phrasetable,ref lincat,std::function symcf,size_t,vector>)> &f); PGF_INTERNAL_DECL vector> phrasetable_lookup(PgfPhrasetable phrasetable, PgfSymbol sym, size_t *n_items); PGF_INTERNAL_DECL vector> phrasetable_lookup(PgfPhrasetable phrasetable, ref lincat, size_t *n_items); class PGF_INTERNAL_DECL PgfPhraseScanner { public: virtual void space(PgfTextSpot *start, PgfTextSpot *end, PgfExn* err)=0; virtual void start_matches(PgfTextSpot *spot, PgfExn* err)=0; virtual void match(ref lin, size_t lin_idx, PgfExn* err)=0; virtual void end_matches(PgfTextSpot *spot, PgfExn* err)=0; }; PGF_INTERNAL_DECL void phrasetable_lookup(PgfPhrasetable phrasetable, PgfText *sentence, bool case_sensitive, PgfPhraseScanner *scanner, PgfExn* err); PGF_INTERNAL_DECL void phrasetable_lookup_cohorts(PgfPhrasetable phrasetable, PgfText *sentence, bool case_sensitive, PgfPhraseScanner *scanner, PgfExn* err); PGF_INTERNAL_DECL void phrasetable_release(PgfPhrasetable table); #endif