#ifndef FF_FSA_DATA_H #define FF_FSA_DATA_H #include //C99 #include #include "sentences.h" #include "feature_accum.h" #include "value_array.h" #include "ff.h" //debug typedef ValueArray Bytes; // stuff I see no reason to have virtual. but because it's impossible (w/o virtual inheritance to have dynamic fsa ff know where the impl's data starts, implemented a sync (copy) method that needs to be called. init_name_debug was already necessary to keep state in sync between ff and ff_from_fsa, so no sync should be needed after it. supposing all modifications were through setters, then no explicit sync call would ever be needed; updates could be mirrored. struct FsaFeatureFunctionData { void init_name_debug(std::string const& n,bool debug) { name_=n; debug_=debug; } //HACK for diamond inheritance (w/o costing performance) FsaFeatureFunctionData *sync_to_; void sync() const { // call this if you modify any fields after your constructor is done if (sync_to_) { DBGINIT("sync to "<<*sync_to_); *sync_to_=*this; DBGINIT("synced result="<<*sync_to_<< " from this="<<*this); } else { DBGINIT("nobody to sync to - from FeatureFunctionData this="<<*this); } } friend std::ostream &operator<<(std::ostream &o,FsaFeatureFunctionData const& d) { o << "[FSA "< static inline T* state_as(void *p) { return (T*)p; } template static inline T const* state_as(void const* p) { return (T*)p; } std::string describe_features(FeatureVector const& feats) { std::ostringstream o; o<" for lm. // this can be called instead or after constructor (also set bytes and end_phrase_) void set_state_bytes(int sb=0) { if (start.size()!=sb) start.resize(sb); if (h_start.size()!=sb) h_start.resize(sb); ssz=sb; } void set_end_phrase(WordID single) { end_phrase_=singleton_sentence(single); } inline void static to_state(void *state,char const* begin,char const* end) { std::memcpy(state,begin,end-begin); } inline void static to_state(void *state,char const* begin,int n) { std::memcpy(state,begin,n); } template inline void static to_state(void *state,T const* begin,int n=1) { to_state(state,(char const*)begin,n*sizeof(T)); } template inline void static to_state(void *state,T const* begin,T const* end) { to_state(state,(char const*)begin,(char const*)end); } inline static char hexdigit(int i) { int j=i-10; return j>=0?'a'+j:'0'+i; } inline static void print_hex_byte(std::ostream &o,unsigned c) { o<>4); o<Add(v); } }; #endif