dfa.hpp sstream /usr/include/gecode/int.hh Gecode::DFA::DFAI Gecode::DFA::DFAI::HashEntry Gecode /*-*-mode:C++;c-basic-offset:2;indent-tabs-mode:nil-*-*/ /* *Mainauthors: *ChristianSchulte<schulte@gecode.org> * *Copyright: *ChristianSchulte,2004 * *Lastmodified: *$Date:2013-03-0717:39:13+0100(Thu,07Mar2013)$by$Author:schulte$ *$Revision:13458$ * *ThisfileispartofGecode,thegenericconstraint *developmentenvironment: *http://www.gecode.org * *Permissionisherebygranted,freeofcharge,toanypersonobtaining *acopyofthissoftwareandassociateddocumentationfiles(the *"Software"),todealintheSoftwarewithoutrestriction,including *withoutlimitationtherightstouse,copy,modify,merge,publish, *distribute,sublicense,and/orsellcopiesoftheSoftware,andto *permitpersonstowhomtheSoftwareisfurnishedtodoso,subjectto *thefollowingconditions: * *Theabovecopyrightnoticeandthispermissionnoticeshallbe *includedinallcopiesorsubstantialportionsoftheSoftware. * *THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND, *EXPRESSORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOF *MERCHANTABILITY,FITNESSFORAPARTICULARPURPOSEAND *NONINFRINGEMENT.INNOEVENTSHALLTHEAUTHORSORCOPYRIGHTHOLDERSBE *LIABLEFORANYCLAIM,DAMAGESOROTHERLIABILITY,WHETHERINANACTION *OFCONTRACT,TORTOROTHERWISE,ARISINGFROM,OUTOFORINCONNECTION *WITHTHESOFTWAREORTHEUSEOROTHERDEALINGSINTHESOFTWARE. * */ #include<sstream> namespaceGecode{ classDFA::DFAI:publicSharedHandle::Object{ public: intn_states; unsignedintn_symbols; intn_trans; unsignedintmax_degree; intfinal_fst; intfinal_lst; Transition*trans; classHashEntry{ public: intsymbol; constTransition*fst; constTransition*lst; }; HashEntry*table; intn_log; GECODE_INT_EXPORTvoidfill(void); DFAI(intnt); GECODE_INT_EXPORTDFAI(void); virtual~DFAI(void); GECODE_INT_EXPORTvirtualSharedHandle::Object*copy(void)const; }; forceinline DFA::DFAI::DFAI(intnt) :trans(nt==0?NULL:heap.alloc<Transition>(nt)){} forceinline DFA::DFAI::~DFAI(void){ if(n_trans>0) heap.rfree(trans); heap.rfree(table); } forceinline DFA::DFA(void){} forceinline DFA::DFA(constDFA&d) :SharedHandle(d){} forceinlineint DFA::n_states(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return(d==NULL)?1:d->n_states; } forceinlineunsignedint DFA::n_symbols(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return(d==NULL)?0:d->n_symbols; } forceinlineint DFA::n_transitions(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return(d==NULL)?0:d->n_trans; } forceinlineunsignedint DFA::max_degree(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return(d==NULL)?0:d->max_degree; } forceinlineint DFA::final_fst(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return(d==NULL)?0:d->final_fst; } forceinlineint DFA::final_lst(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return(d==NULL)?0:d->final_lst; } forceinlineint DFA::symbol_min(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return((d!=NULL)&&(d->n_trans>0))? d->trans[0].symbol:Int::Limits::min; } forceinlineint DFA::symbol_max(void)const{ constDFAI*d=static_cast<DFAI*>(object()); return((d!=NULL)&&(d->n_trans>0))? d->trans[d->n_trans-1].symbol:Int::Limits::max; } /* *Constructingtransitions * */ forceinline DFA::Transition::Transition(void){} forceinline DFA::Transition::Transition(inti_state0,intsymbol0,into_state0) :i_state(i_state0),symbol(symbol0),o_state(o_state0){} /* *Iteratingoveralltransitions * */ forceinline DFA::Transitions::Transitions(constDFA&d){ constDFAI*o=static_cast<DFAI*>(d.object()); if(o!=NULL){ c_trans=&o->trans[0]; e_trans=c_trans+o->n_trans; }else{ c_trans=e_trans=NULL; } } forceinline DFA::Transitions::Transitions(constDFA&d,intn){ constDFAI*o=static_cast<DFAI*>(d.object()); if(o!=NULL){ intmask=(1<<o->n_log)-1; intp=n&mask; while((o->table[p].fst!=NULL)&&(o->table[p].symbol!=n)) p=(p+1)&mask; c_trans=o->table[p].fst; e_trans=o->table[p].lst; }else{ c_trans=e_trans=NULL; } } forceinlinebool DFA::Transitions::operator ()(void)const{ returnc_trans<e_trans; } forceinlinevoid DFA::Transitions::operator ++(void){ c_trans++; } forceinlineint DFA::Transitions::i_state(void)const{ returnc_trans->i_state; } forceinlineint DFA::Transitions::symbol(void)const{ returnc_trans->symbol; } forceinlineint DFA::Transitions::o_state(void)const{ returnc_trans->o_state; } /* *Iteratingoversymbols * */ forceinline DFA::Symbols::Symbols(constDFA&d){ constDFAI*o=static_cast<DFAI*>(d.object()); if(o!=NULL){ c_trans=&o->trans[0]; e_trans=c_trans+o->n_trans; }else{ c_trans=e_trans=NULL; } } forceinlinebool DFA::Symbols::operator ()(void)const{ returnc_trans<e_trans; } forceinlinevoid DFA::Symbols::operator ++(void){ ints=c_trans->symbol; do{ c_trans++; }while((c_trans<e_trans)&&(s==c_trans->symbol)); } forceinlineint DFA::Symbols::val(void)const{ returnc_trans->symbol; } template<classChar,classTraits> std::basic_ostream<Char,Traits>& operator<<(std::basic_ostream<Char,Traits>&os,constDFA&d){ std::basic_ostringstream<Char,Traits>st; st.copyfmt(os);st.width(0); st<<"Startstate:0"<<std::endl <<"States:0..."<<d.n_states()-1<<std::endl <<"Transitions:"; for(ints=0;s<static_cast<int>(d.n_states());s++){ DFA::Transitionst(d); intn=0; while(t()){ if(t.i_state()==s){ if((n%4)==0) st<<std::endl<<"\t"; st<<"["<<t.i_state()<<"]" <<"-"<<t.symbol()<<">" <<"["<<t.o_state()<<"]"; ++n; } ++t; } } st<<std::endl<<"Finalstates:" <<std::endl <<"\t["<<d.final_fst()<<"]...[" <<d.final_lst()-1<<"]" <<std::endl; returnos<<st.str(); } } //STATISTICS:int-prop