template<class T0,class T1, class T2> BOOST_FORCEINLINE result_type eval_at(const T0& a0,const T1& a1,const T2& a2) const { return l_and( ge( a0, splat<base_t>(a2)) , lt( a0, splat<base_t>(a2+a1)) ); }
template<class N> BOOST_FORCEINLINE result_type eval(const A0& a0,const A1& a1,const A2& a2, N const&) const { return l_and( eval(a0,a1,a2, boost::mpl::int_<N::value-1>()) , eval_at ( boost::fusion::at_c<N::value>(a0) , boost::fusion::at_c<N::value>(a1) , boost::fusion::at_c<N::value>(a2) ) ); }
void emit(int tt, unsigned int tval) { if(tt == UNKNOWN) error("Unknown token"); else if(tt == DONE) error("Unexpected end of expression"); else if(tt == NONE) error("No token in expression"); else if(tt == EOS) error("End of string in expression"); else if(tt == NUM) push(tt, tval); else if(tt == STRING) { if(tval <= 0) error("Unrecognized expression"); else push(tt, tval); } else { /* apply operator */ switch(tt) { case 1: l_orr(); break; case 2: l_and(); break; case 3: b_orr(); break; case 4: b_xor(); break; case 5: b_and(); break; case 6: l_equ(); break; case 7: l_neq(); break; case 8: l_leq(); break; case 9: l_geq(); break; case 10: l_ltt(); break; case 11: l_gtt(); break; case 12: lshift(); break; case 13: l_rshift(); break; case 14: rshift(); break; case 15: plus(); break; case 16: minus(); break; case 17: multiply(); break; case 18: divide(); break; case 19: modulo(); break; case 20: l_not(); break; case 21: b_not(); break; case 22: unaryminus(); break; case 23: unaryplus(); break; default: error("Unknown operator"); } } }